En un proyecto en muchas ocasiones en que hay que integrar componentes, servicios, microservicios, será necesario aportar o recibir información de ellos, en la mayoría de los casos estas comunicaciones tienen que estar permanentemente disponibles, ser rápidas, seguras, asíncronas, en este caso las colas de mensajes apoyan con la solución a estas necesidades, de tal forma que actúan de intermediario entre emisores y receptores, o en un contexto más definido, productores y consumidores de mensajes, es por ello que en este post hablaremos de RabbitMQ como servicio y gestor de colas.
Se pueden utilizar para disminuir las cargas y los tiempos de entrega por parte de los servidores de aplicaciones web, debido a que las tareas, que normalmente demorarían tiempo en procesarse, se pueden delegar a un tercero cuyo único trabajo es realizarlas.
El uso de colas de mensajes también es bueno cuando se desea distribuir un mensaje a múltiples destinatarios para consumo o para realizar balanceo de carga entre trabajadores.
Entre algunas beneficios podemos mencionar lo siguiente:
- Garantía de entrega y orden. Los mensajes se consumen, en el mismo orden que se llegaron a la cola, y son consumidos una única vez
- Redundancia. Las colas persisten los mensajes hasta que son procesados por completo
- Desacoplamiento. Siendo capas intermedias de comunicación entre procesos, aportan la flexibilidad en la definición de arquitectura de cada uno de ellos de manera separada, siempre que se mantenga una interfaz común
- Escalabilidad. Con más unidades de procesamiento, las colas balancean su respectiva carga
¿Qué es RabbitMQ?
RabbitMQ es un software de encolado de mensajes llamado bróker de mensajería o gestor de colas. Dicho de forma simple, es un software donde se pueden definir colas, las aplicaciones se pueden conectar a dichas colas y transferir/leer mensajes en ellas. Sus características principales son:
- Garantía de entrega
- Enrutamiento flexible
- Clusterización
- Federación
- Alta disponibilidad
- Tolerancia a fallos
¿Cómo funciona RabbitMQ?
La arquitectura básica de una cola de mensajes es simple. Existen aplicaciones clientes, llamadas productores, que crean mensajes y los entregan al intermediario. Otras aplicaciones, llamadas consumidores, se conectan a la cola y se suscriben a los mensajes que se procesarán. Un mensaje puede incluir cualquier tipo de información.
Un componente y/o servicio puede ser un productor, consumidor, o productor y consumidor de mensajes a la misma vez. Los mensajes en la cola se almacenan hasta que el consumidor los recupera y procesa.
Los mensajes no se publican directamente en una cola, en lugar de eso, el productor envía mensajes a un exchange. Los exchanges son agentes de enrutamiento de mensajes, definidos por virtual host dentro de RabbitMQ. Un exchange es responsable del enrutamiento de los mensajes a las diferentes colas: acepta mensajes del productor y los dirige a colas de mensajes con ayuda de atributos de cabeceras, bindings y routing keys.
- Un binding es un «enlace» que se configura para vincular una cola a un exchange
- La routing key es un atributo del mensaje. El exchange podría usar esta clave para decidir cómo enrutar el mensaje a las colas (según el tipo de exchange)
Los exchanges, las conexiones y las colas pueden configurarse con parámetros tales como durable, temporary, y auto delete en el momento de su creación. Los exchanges declarados como durable sobrevivirán a los reinicios del servidor y durarán hasta que se eliminen explícitamente. Aquellos de tipo temporary existen hasta que RabbitMQ se cierre. Por último, los exchanges configurados como auto delete se eliminan una vez que el último objeto vinculado se ha liberado del exchange.
RabbitMQ consta de diferentes partes:
- El servidor de intercambio RabbitMQ en sí mismo
- Pasarelas para los protocolos HTTP, XMPP y STOMP.
- Bibliotecas de clientes para Java y el framework .NET. (Bibliotecas similares para otros lenguajes se encuentran disponibles por parte de otros proveedores).
- El plugin Shovel (pala) que se encarga de copiar (replicar) mensajes desde un corredor de mensajes a otros
Mas información en https://www.rabbitmq.com/