Mensajería asíncrona: RabbitMQ, Apache Kafka y Amazon SQS

¿Qué es la mensajería asíncrona?

En una comunicación síncrona, un componente envía una solicitud y espera una respuesta antes de continuar con el flujo correspondiente. En cambio, la mensajería asíncrona permite enviar un mensaje para que otro componente lo procese posteriormente.

Este modelo separa el momento en que se produce un evento del momento en que otro componente lo procesa.

De forma simplificada:

Productor
   ->
Mensaje
   ->
Consumidor

El productor no necesita permanecer bloqueado esperando a que el consumidor termine de procesar el mensaje.

1. RabbitMQ

RabbitMQ es un sistema de mensajería que permite recibir, almacenar temporalmente y entregar mensajes a consumidores mediante una arquitectura basada en productores, exchanges, colas y consumidores.

De forma simplificada:

Productor
   ->
Exchange
   ->
Cola
   ->
Consumidor

El exchange determina cómo se enrutan los mensajes hacia las colas según la configuración establecida.

2. Apache Kafka

Apache Kafka es una plataforma orientada al manejo de flujos de eventos y mensajes distribuidos.

Los productores publican registros en topics, y los consumidores leen esos registros según la configuración del sistema.

Productor
   ->
Topic
   ->
Consumidor

Los topics pueden dividirse en particiones, lo que permite distribuir los registros y el procesamiento entre distintos consumidores.

Kafka está diseñado para trabajar con grandes cantidades de eventos y mantener los registros durante un periodo configurado, en lugar de considerar cada mensaje únicamente como una tarea que debe desaparecer después de ser consumida.

3. Amazon SQS

Amazon SQS es un servicio administrado de colas de mensajes de AWS.

Una aplicación puede enviar mensajes a una cola y otra aplicación puede recibirlos posteriormente para procesarlos.

Aplicación A
   ->
Amazon SQS
   ->
Aplicación B

Al ser un servicio administrado, la infraestructura necesaria para ejecutar la cola no debe ser operada directamente por el equipo que desarrolla la aplicación.

4. ¿Por qué usar mensajería asíncrona?

Una razón para utilizar este modelo es separar componentes que no necesitan comunicarse de forma inmediata.

Por ejemplo, un componente puede generar un mensaje y continuar con su trabajo mientras otro componente procesa ese mensaje posteriormente.

Esto permite desacoplar partes del sistema:

Servicio A
   ->
Mensaje
   ->
Servicio B

El servicio A no necesita ejecutar directamente la lógica del servicio B para producir el mensaje.

5. RabbitMQ, Kafka y SQS no son equivalentes

Aunque las tres tecnologías permiten intercambiar mensajes, su funcionamiento y modelo de uso son diferentes.

RabbitMQ -> sistema de mensajería basado en colas y routing
Kafka    -> plataforma distribuida orientada a eventos y streams
SQS      -> servicio administrado de colas de mensajes en AWS

La elección depende de las características que requiera la arquitectura y de cómo deben producirse, distribuirse y procesarse los mensajes.

6. Productores y consumidores

En un sistema de mensajería asíncrona suelen existir dos roles principales.

El productor genera y publica mensajes. El consumidor recibe esos mensajes y ejecuta el procesamiento correspondiente.

Productor
   |
   v
Sistema de mensajería
   |
   v
Consumidor

La separación entre ambos permite que el productor y el consumidor evolucionen de forma más independiente que en una llamada directa entre servicios.

Consideraciones

La mensajería asíncrona permite separar la producción de un mensaje de su procesamiento. RabbitMQ trabaja con un modelo basado en exchanges, colas y consumidores. Apache Kafka utiliza topics y particiones para distribuir y leer eventos. Amazon SQS proporciona colas de mensajes como un servicio administrado de AWS.

Los tres pueden formar parte de arquitecturas distribuidas, pero su modelo de funcionamiento no es el mismo. La decisión debe basarse en cómo necesita comunicarse y procesar mensajes el sistema.

© Arturo Juárez Monroy