Saltar al contenido principal

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": {}
}
]
}