20. Integración con colas, eventos y procesos asíncronos

20.1 Introducción

No todas las integraciones ocurren de forma inmediata. En muchos sistemas, un componente publica un mensaje o evento y otro lo procesa más tarde. Este tipo de integración se conoce como comunicación asíncrona.

Las colas, eventos y procesos asíncronos permiten desacoplar partes del sistema, pero también agregan desafíos para las pruebas: tiempos de espera, duplicados, orden de mensajes, reintentos, errores y consistencia eventual.

En este tema veremos cómo pensar pruebas de integración para este tipo de escenarios.

20.2 Comunicación síncrona y asíncrona

En una comunicación síncrona, un componente llama a otro y espera una respuesta inmediata. En una comunicación asíncrona, un componente deja un mensaje para que otro lo procese después.

Tipo Cómo funciona Ejemplo
Síncrona El consumidor espera una respuesta en el momento. Consultar stock antes de confirmar una compra.
Asíncrona El productor publica un mensaje y otro componente lo procesa luego. Enviar correo después de crear una orden.
En integración asíncrona, la prueba debe verificar no solo que algo se publique, sino también qué ocurre cuando el mensaje se procesa.

20.3 Qué es una cola

Una cola es un mecanismo donde un productor deja mensajes y uno o más consumidores los procesan. La cola permite que el productor no dependa de que el consumidor esté disponible en ese mismo instante.

En pruebas de integración, una cola puede usarse para verificar:

  • Que el mensaje se publique en el lugar correcto.
  • Que el mensaje tenga el contenido esperado.
  • Que el consumidor lo procese.
  • Que el estado final cambie como corresponde.
  • Que los mensajes inválidos se manejen sin romper el sistema.

20.4 Qué es un evento

Un evento representa algo que ocurrió en el sistema. Por ejemplo: usuario registrado, orden creada, pago aprobado, stock actualizado o archivo importado.

Un evento debería comunicar un hecho relevante, no una instrucción detallada de cómo debe actuar el consumidor.

Un evento suele incluir:

  • Identificador del evento.
  • Tipo de evento.
  • Fecha de ocurrencia.
  • Identificadores de entidades relacionadas.
  • Datos necesarios para consumidores.
  • Versión del contrato.

20.5 Productores y consumidores

En una integración asíncrona, el productor publica el mensaje o evento. El consumidor lo lee y ejecuta alguna acción.

Las pruebas pueden enfocarse en:

  • El productor: verificar que publica el evento correcto.
  • El consumidor: verificar que procesa correctamente un evento recibido.
  • El flujo completo: publicar y luego comprobar el efecto del consumidor.

No siempre es necesario probar todo junto en cada caso. El alcance debe elegirse según el riesgo.

20.6 Publicación de mensajes

Una prueba de integración puede verificar que una operación publique un mensaje esperado.

Por ejemplo, al crear una orden, podemos comprobar que se publique un evento con:

  • Tipo orden_creada.
  • Identificador de orden.
  • Identificador de cliente.
  • Total de la orden.
  • Fecha de creación.

La prueba debe verificar estructura y contenido, no solo que haya “algún mensaje” en la cola.

20.7 Consumo de mensajes

Otra prueba puede enfocarse en el consumidor. En ese caso, se prepara un mensaje conocido y se verifica que el consumidor lo procese correctamente.

Por ejemplo, un consumidor de notificaciones debería:

  • Leer el evento correcto.
  • Interpretar sus datos.
  • Crear una notificación pendiente o enviada.
  • Registrar el resultado.
  • Manejar mensajes inválidos sin detener todo el proceso.

Este enfoque permite probar el consumidor aunque el productor todavía no esté disponible.

20.8 Flujo completo asíncrono

En algunos casos conviene probar el flujo completo: una operación produce un evento, el evento llega a la cola, el consumidor lo procesa y el estado final se verifica.

Este tipo de prueba da más confianza, pero también puede ser más lenta y difícil de diagnosticar.

Debe definir claramente:

  • Qué evento se espera.
  • Qué consumidor debe procesarlo.
  • Qué estado final indica éxito.
  • Cuánto tiempo máximo se esperará.
  • Cómo se limpiarán mensajes y datos creados.

20.9 Esperas controladas

Una dificultad habitual en pruebas asíncronas es esperar a que el resultado aparezca. Usar pausas fijas, como esperar siempre cinco segundos, puede hacer las pruebas lentas e inestables.

Es mejor usar esperas controladas:

  • Consultar periódicamente hasta que aparezca el resultado.
  • Definir un tiempo máximo de espera.
  • Fallar con un mensaje claro si el resultado no aparece.
  • Usar identificadores únicos para buscar el evento correcto.
  • Evitar esperas más largas de lo necesario.

La prueba debe distinguir entre una demora normal y una falla real del proceso.

20.10 Duplicados e idempotencia

En sistemas con colas, un mensaje puede llegar más de una vez. El consumidor debe estar preparado para no generar efectos duplicados peligrosos.

Una prueba puede verificar que, si el mismo evento se procesa dos veces:

  • No se crea una notificación duplicada si no corresponde.
  • No se descuenta stock dos veces.
  • No se registra dos veces el mismo pago.
  • El segundo procesamiento se ignora o se maneja de forma segura.

La idempotencia es una propiedad importante en consumidores de eventos.

20.11 Orden de mensajes

Algunos sistemas garantizan orden de mensajes, otros no. Si el consumidor depende de un orden específico, esa expectativa debe estar clara.

Problemas posibles:

  • Llega un evento de actualización antes que el evento de creación.
  • Dos eventos del mismo recurso se procesan en orden inverso.
  • Un consumidor asume orden, pero la infraestructura no lo garantiza.
  • Un mensaje atrasado sobrescribe un estado más reciente.

Las pruebas de integración pueden incluir casos donde el orden no sea ideal para verificar la robustez del consumidor.

20.12 Reintentos y mensajes fallidos

Cuando un consumidor falla al procesar un mensaje, el sistema puede reintentar. Si sigue fallando, puede moverlo a una cola de errores o dejarlo registrado para revisión.

Conviene probar:

  • Cuántos reintentos se realizan.
  • Qué ocurre si el error es temporal.
  • Qué ocurre si el mensaje es inválido permanentemente.
  • Si el mensaje queda disponible para diagnóstico.
  • Si el consumidor continúa procesando otros mensajes.

El objetivo es evitar que un mensaje problemático bloquee todo el proceso sin evidencia.

20.13 Consistencia eventual

En procesos asíncronos, el estado final puede no estar disponible inmediatamente. Esto se llama consistencia eventual: el sistema llega al estado esperado después de cierto tiempo.

Por ejemplo, una orden puede crearse inmediatamente, pero el reporte de ventas puede actualizarse después de consumir un evento.

Las pruebas deben aceptar esta naturaleza asíncrona, pero con límites claros. Esperar indefinidamente no es una buena estrategia.

20.14 Limpieza de colas y eventos

Las colas deben limpiarse o aislarse para evitar que mensajes viejos afecten pruebas nuevas.

Buenas prácticas:

  • Usar colas específicas para pruebas.
  • Vaciar colas antes de comenzar cuando sea seguro.
  • Usar identificadores únicos por prueba.
  • Eliminar o consumir mensajes generados por la prueba.
  • Evitar compartir colas entre suites que corren en paralelo sin aislamiento.

Un mensaje residual puede hacer que una prueba pase o falle por una razón equivocada.

20.15 Ejemplo: orden creada y notificación

Supongamos una integración donde el servicio de órdenes publica un evento y el servicio de notificaciones lo consume.

Paso Qué se verifica
Crear orden. El productor ejecuta la operación principal.
Revisar evento publicado. El mensaje contiene identificador, cliente y total.
Ejecutar consumidor. El servicio de notificaciones procesa el evento.
Verificar estado final. Existe una notificación asociada a la orden.
Limpiar datos. No quedan mensajes ni registros residuales.

20.16 Errores comunes

Al probar colas, eventos y procesos asíncronos, suelen aparecer errores como:

  • Usar pausas fijas en lugar de esperas controladas.
  • No limpiar mensajes de pruebas anteriores.
  • Verificar solo que se publicó un mensaje, sin revisar su contenido.
  • No probar mensajes duplicados o inválidos.
  • Asumir orden de mensajes sin garantía.
  • No verificar el estado final después del consumo.
  • No registrar información suficiente para diagnosticar fallas.

20.17 Lista de verificación

Antes de confiar en una prueba asíncrona, conviene revisar:

  • ¿Está claro quién produce y quién consume?
  • ¿El mensaje tiene contrato definido?
  • ¿La prueba verifica publicación y contenido?
  • ¿El consumidor se prueba con mensajes válidos e inválidos?
  • ¿La espera del resultado tiene tiempo máximo?
  • ¿Se controlan duplicados y reintentos?
  • ¿La cola queda limpia o aislada al finalizar?

20.18 Qué debes recordar de este tema

  • Las integraciones asíncronas usan mensajes o eventos procesados después.
  • Se puede probar productor, consumidor o flujo completo.
  • Las esperas deben ser controladas, no pausas fijas sin criterio.
  • Los duplicados, reintentos y mensajes inválidos son escenarios importantes.
  • La consistencia eventual requiere verificar resultados con tiempo máximo definido.
  • La limpieza de colas y mensajes es esencial para evitar pruebas inestables.

20.19 Conclusión

Las colas, eventos y procesos asíncronos permiten construir sistemas más desacoplados, pero exigen pruebas de integración cuidadosas. No basta con comprobar que un mensaje se envió: también debemos verificar contenido, consumo, estado final, errores y limpieza.

Una buena prueba asíncrona acepta que el resultado puede tardar, pero define cómo esperarlo, cómo diagnosticar fallas y cómo evitar interferencias entre ejecuciones.

En el próximo tema veremos archivos, almacenamiento y recursos compartidos.