Queues y Exchanges en RabbitMQ
Este documento explica el rol de queues y exchanges en RabbitMQ, y cómo los usamos en nuestra implementación.
Conceptos básicos
Queue (Cola)
- Una queue es un buzón donde se almacenan los mensajes hasta que son consumidos por una aplicación.
- Funciona como una lista FIFO (First In – First Out), aunque con algunas variantes según configuración.
- El productor puede enviar mensajes directamente a una cola.
- Los consumidores se suscriben a la cola para leer los mensajes.
Exchange (Intercambiador)
- Un exchange actúa como un router que recibe mensajes de los productores y los envía a una o varias colas.
- La ruta depende de:
- El tipo de exchange (direct, topic, fanout, headers).
- La routing key definida.
- Las bindings configuradas.
Ejemplo:
Un servicio publica en el exchange order_exchange.
Dependiendo de la routing_key, el mensaje se envía a la cola order_created o order_cancelled.
Nuestra forma de uso
En nuestro ecosistema:
-
Publicación en exchanges:
Es el patrón más usado. Nos permite centralizar el enrutamiento de mensajes y conectar múltiples colas a un mismo exchange según el evento. -
Publicación directa en queues:
En algunos casos sencillos, publicamos directamente en una cola sin pasar por un exchange. Esto simplifica la lógica cuando solo hay un productor y un consumidor.
Respaldo de configuración
Puedes generar un respaldo de la configuración en el dashboard de rabbitmq en la primer pestaña de 'Overview', abajo de las metricas hay opciones donde puedes exportar e importar todos los vhosts o solo uno en especifico.
Aqui hay un ejemplo de como se ve:
{
"rabbit_version": "4.0.7",
"rabbitmq_version": "4.0.7",
"product_name": "RabbitMQ",
"product_version": "4.0.7",
"rabbitmq_definition_format": "single_virtual_host",
"original_vhost_name": "SEDstg",
"explanation": "Definitions of virtual host 'SEDstg'",
"metadata": {
"description": "",
"tags": [],
"default_queue_type": "classic"
},
"description": "",
"default_queue_type": "classic",
"limits": [],
"parameters": [],
"policies": [],
"queues": [
{
"name": ".ares.product",
"durable": true,
"auto_delete": false,
"arguments": {
"x-dead-letter-exchange": ".ares.product-dead-letter",
"x-queue-type": "classic"
}
},
{
"name": ".ares.product-dead-letter",
"durable": true,
"auto_delete": false,
"arguments": {
"x-queue-type": "classic"
}
}
],
"exchanges": [
{
"name": ".ares.product-dead-letter",
"type": "fanout",
"durable": true,
"auto_delete": false,
"internal": false,
"arguments": {}
},
{
"name": "product",
"type": "topic",
"durable": true,
"auto_delete": false,
"internal": false,
"arguments": {}
},
{
"name": "jkn.forwarder",
"type": "topic",
"durable": true,
"auto_delete": false,
"internal": false,
"arguments": {}
}
],
"bindings": [
{
"source": ".ares.product-dead-letter",
"destination": ".ares.product-dead-letter",
"destination_type": "queue",
"routing_key": "#",
"arguments": {}
},
{
"source": "jkn.forwarder",
"destination": ".ares.product",
"destination_type": "queue",
"routing_key": "",
"arguments": {}
},
{
"source": "product",
"destination": ".ares.product",
"destination_type": "queue",
"routing_key": "sed.product.*",
"arguments": {}
}
]
}