RabbitMQ

Contexto y conceptos clave

  • Stack típico
    • Integración frecuente con stacks como Node.js, Java, .NET, Python, PHP, WordPress.
    • Uso combinado con bases de datos, caches y APIs REST/GraphQL.
  • Protocolos
    • AMQP 0-9-1 (principal)
    • MQTT, STOMP (vía plugins)
    • HTTP API (gestión y monitoreo)
  • Arquitectura orientada a mensajes
    • Productores (publishers)
    • Brokers
    • Consumidores (consumers)
  • Procesamiento asíncrono
    • Ejecución de tareas en segundo plano
    • Desacoplamiento entre servicios
    • Mejora de resiliencia y escalabilidad
  • Casos de uso comunes
    • Envío de emails
    • Procesamiento de imágenes o vídeos
    • Jobs programados
    • Integraciones entre microservicios
    • Workflows empresariales

Fundamentos de RabbitMQ

  • Exchange
    • Punto de entrada de los mensajes
    • Tipos: direct, fanout, topic, headers
  • Queue
    • Buffer donde se almacenan los mensajes
    • FIFO por defecto
    • Persistentes o volátiles
  • Binding
    • Relación entre exchange y cola
  • Routing Key
    • Clave usada para enrutar mensajes
  • Acknowledgements (ACK/NACK)
    • Confirmación de consumo
    • Prevención de pérdida de mensajes
  • Durabilidad
    • Exchanges y colas durables
    • Mensajes persistentes
  • Prefetch
    • Control de backpressure
    • Límite de mensajes no confirmados por consumidor

Patrones de mensajería

  • Work Queues
    • Distribución de tareas entre múltiples workers
  • Publish / Subscribe
    • Difusión de mensajes a múltiples consumidores
  • Routing
    • Enrutamiento selectivo por claves
  • Topics
    • Enrutamiento flexible con patrones
  • Request / Reply
    • Comunicación síncrona sobre infraestructura asíncrona
  • Delayed Messaging
    • Programación de mensajes en el tiempo (plugins)

Gestión de errores y resiliencia

  • Retries
    • Reintentos automáticos
    • Backoff exponencial
  • Dead Letter Exchange (DLX)
    • Mensajes no procesables
    • Auditoría y reprocesado
  • TTL
    • Tiempo de vida de mensajes o colas
  • Idempotencia
    • Prevención de procesamiento duplicado
  • Circuit Breaker
    • Protección de consumidores saturados

Observabilidad y operación

  • Management Plugin
    • UI web
    • Métricas y estado de colas
  • Monitoring
    • Integración con Prometheus y Grafana
  • Logs
    • Eventos de conexión
    • Errores de enrutamiento
  • Control de recursos
    • Uso de memoria
    • Disk alarms
    • Flow control

Instalación en Docker

Docker Compose (ejemplo)

version: "3.8"
services:
	rabbitmq:
		image: rabbitmq:3-management
		ports:
			- "5672:5672"
			- "15672:15672"
		environment:
			RABBITMQ_DEFAULT_USER: user
			RABBITMQ_DEFAULT_PASS: password

`

Ejemplos en Git

RabbitMQ en Kubernetes

Integración con Node.js

  • Integrating RabbitMQ with Node.js Building Real-time Applications-integrating-rabbitmq-with-node-js-building-real-time-applications-fa94135bada3
  • RabbitMQ hello world
  • RabbitMQ tutorial - Hello World! RabbitMQ-tutorial-one-javascript

Ejemplo Node.js Producer

const amqp = require("amqplib");

(async () => {
	const conn = await amqp.connect("amqp://localhost");
	const ch = await conn.createChannel();
	const queue = "tasks";

	await ch.assertQueue(queue, { durable: true });
	ch.sendToQueue(queue, Buffer.from("Mensaje"), { persistent: true });

	setTimeout(() => conn.close(), 500);
})();

Ejemplo Node.js Consumer

const amqp = require("amqplib");

(async () => {
	const conn = await amqp.connect("amqp://localhost");
	const ch = await conn.createChannel();
	const queue = "tasks";

	await ch.assertQueue(queue, { durable: true });
	ch.prefetch(1);

	ch.consume(queue, msg => {
		console.log(msg.content.toString());
		ch.ack(msg);
	});
})();

Plugins

  • [Community Plugins RabbitMQ](https://www.rabbitmq.com/community-plugins)
  • Delayed Message Exchange
  • Shovel
  • Federation
  • MQTT
  • STOMP

RabbitMQ vs Apache Kafka

  • Modelo
    • RabbitMQ: broker tradicional con colas
    • Kafka: log distribuido
  • Casos de uso
    • RabbitMQ: tareas, workflows, comandos
    • Kafka: eventos, streaming, big data
  • Persistencia
    • RabbitMQ: memoria + disco
    • Kafka: disco como base
  • Reintentos
    • RabbitMQ: DLQ y TTL
    • Kafka: relectura de offsets
  • Orden
    • RabbitMQ: por cola
    • Kafka: por partición
  • Escalabilidad
    • RabbitMQ: vertical + clustering
    • Kafka: horizontal nativo
  • Principios SOLID
    • Una cola por caso de uso
    • Consumidores especializados

Fundamentos y arquitectura de RabbitMQ

Qué es RabbitMQ

  • Broker de mensajería orientado a colas
  • Implementa principalmente AMQP 0-9-1
  • Componente clave en arquitecturas Backend y middleware
  • Facilita comunicación asíncrona y desacoplada entre sistemas

Principios fundamentales

  • Desacoplamiento
    • Productores y consumidores no se conocen
    • Independencia de despliegue y escalado
  • Asincronía
    • Procesamiento en segundo plano
    • Reducción de latencia en flujos críticos
  • Fiabilidad
    • ACK/NACK
    • Persistencia opcional de mensajes
  • Escalabilidad
    • Múltiples consumidores por cola
    • Clustering del broker

Componentes principales

  • Producer
    • Publica mensajes
    • No envía directamente a colas
  • Exchange
    • Punto de entrada de mensajes
    • Decide a qué colas se enrutan
  • Queue
    • Almacén FIFO de mensajes
    • Consumida por uno o varios consumidores
  • Consumer
    • Procesa mensajes
    • Controla confirmaciones
  • Binding
    • Relación exchange ↔ queue
  • Routing Key
    • Clave usada por el exchange para decidir el enrutamiento

Tipos de Exchange

  • Direct
    • Enrutamiento exacto por routing key
    • Casos comando → acción concreta
  • Fanout
    • Difusión a todas las colas enlazadas
    • Eventos y notificaciones
  • Topic
    • Patrones con comodines
    • Eventos jerárquicos y flexibles
  • Headers
    • Enrutamiento por metadatos
    • Menos común, más costoso

Flujo interno del mensaje

  • Publicación del mensaje en un exchange
  • Evaluación de bindings
  • Enrutamiento a una o varias colas
  • Almacenamiento (memoria o disco)
  • Entrega a consumidores disponibles
  • Confirmación o reencolado

Modelo de entrega

  • Push
    • RabbitMQ empuja mensajes al consumidor
  • Prefetch
    • Límite de mensajes no confirmados
    • Control de backpressure
  • Round-robin
    • Distribución entre consumidores activos

Durabilidad y persistencia

  • Exchange durable
    • Sobrevive a reinicios
  • Queue durable
    • Mantiene definición tras restart
  • Mensaje persistente
    • Se escribe en disco
  • Garantía
    • Durable + persistente + ACK

Gestión de errores

  • ACK
    • Mensaje procesado correctamente
  • NACK / Reject
    • Error de procesamiento
  • Requeue
    • Mensaje vuelve a la cola
  • Dead Letter Exchange (DLX)
    • Mensajes fallidos
    • Auditoría y reprocesado
  • TTL
    • Expiración de mensajes o colas

Arquitectura del broker

  • Erlang VM
    • Concurrencia masiva
    • Tolerancia a fallos
  • Nodos
    • Cada instancia RabbitMQ es un nodo
  • Clúster
    • Conjunto de nodos coordinados
    • Metadatos compartidos
  • Colas
    • Locales o replicadas
  • Mirrored / Quorum Queues
    • Alta disponibilidad
    • Consistencia fuerte

Clustering y alta disponibilidad

  • Clustering
    • Escala lectura/escritura
    • No balancea colas automáticamente
  • Quorum Queues
    • Basadas en Raft
    • Recomendadas para producción
  • Failover
    • Reasignación automática de líderes
  • Trade-offs
    • Consistencia vs latencia

Gestión de recursos

  • Memoria
    • Prioritaria para rendimiento
  • Disco
    • Persistencia y seguridad
  • Flow Control
    • Pausa productores si el broker se satura
  • Alarms
    • Memory alarm
    • Disk alarm

Seguridad

  • Autenticación
    • Usuario/contraseña
    • Certificados TLS
  • Autorización
    • Permisos por vhost
  • Virtual Hosts
    • Aislamiento lógico
    • Multitenancy
  • TLS
    • Comunicación cifrada

Observabilidad y operación

  • Management Plugin
    • UI web
    • Estado de exchanges y colas
  • Métricas
    • Throughput
    • Backlog
    • Consumers activos
  • Logs
    • Conexiones
    • Errores de enrutamiento

Patrones arquitectónicos comunes

  • Task Queue
    • Procesamiento paralelo
  • Event-driven
    • Productores de eventos
    • Múltiples consumidores
  • CQRS
    • Comandos vía colas
    • Eventos vía fanout/topic
  • Saga
    • Orquestación asíncrona
    • Compensaciones

Límites conceptuales

  • No es streaming de eventos
  • No es base de datos
  • No reemplaza un log distribuido
  • Ideal para workflows, comandos y tareas

Relación con otros sistemas

  • Integración frecuente con Apache Kafka
  • Complemento de APIs síncronas
  • Backbone de microservicios orientados a mensajes

RabbitMQ: casos de uso, roadmap y ejemplos prácticos

Casos de uso habituales

  • Procesamiento de tareas asíncronas
    • Envío de emails
    • Generación de informes
    • Procesamiento de imágenes y vídeos
  • Arquitectura basada en eventos
    • Publicación de eventos de dominio
    • Integración entre microservicios
  • Workflows empresariales
    • Orquestación de pasos
    • Manejo de estados intermedios
  • Desacoplamiento de sistemas legacy
    • Integración con ERP, CRM, WordPress
  • Picos de carga
    • Absorción de tráfico
    • Rate limiting indirecto
  • Comunicación inter-servicios
    • Sustituto de llamadas síncronas frágiles
  • IoT y mensajería ligera
    • MQTT vía plugins
  • Batch y jobs programados
    • Ejecución diferida
    • Reintentos controlados

Casos de uso por patrón

  • Task Queue
    • Colas por tipo de trabajo
    • Workers especializados
  • Publish / Subscribe
    • Notificaciones
    • Auditoría
  • Routing
    • Procesamiento condicional
  • Topic-based events
    • Eventos jerárquicos
    • Dominios complejos
  • Request / Reply
    • RPC asíncrono
    • Respuestas temporales

Roadmap de adopción recomendado

  • Fase 1 – Fundamentos
    • Conceptos AMQP
    • Exchanges y colas
    • ACK y prefetch
  • Fase 2 – Producción básica
    • Colas durables
    • Mensajes persistentes
    • Monitoring básico
  • Fase 3 – Resiliencia
    • Dead Letter Queues
    • TTL
    • Reintentos
  • Fase 4 – Escalabilidad
    • Múltiples consumidores
    • Prefetch tuning
    • Clustering
  • Fase 5 – Alta disponibilidad
    • Quorum Queues
    • Failover
    • Backups
  • Fase 6 – Observabilidad avanzada
    • Métricas
    • Alertas
    • Trazabilidad
  • Fase 7 – Integración avanzada
    • Shovel / Federation
    • Integración con Apache Kafka
    • Mensajería híbrida

Buenas prácticas de diseño

  • Una cola por caso de uso
  • Consumidores idempotentes
  • No compartir colas entre dominios
  • Prefetch bajo por defecto
  • Evitar colas gigantes
  • Separar eventos de comandos
  • Usar DLQ siempre

Ejemplo Docker Compose

version: "3.8"
services:
	rabbitmq:
		image: rabbitmq:3-management
		container_name: rabbitmq
		ports:
			- "5672:5672"
			- "15672:15672"
		environment:
			RABBITMQ_DEFAULT_USER: admin
			RABBITMQ_DEFAULT_PASS: admin
		volumes:
			- rabbitmq_data:/var/lib/rabbitmq

volumes:
	rabbitmq_data:

`

Ejemplo Exchange + Queue + DLQ (AMQP)

const amqp = require("amqplib");

(async () => {
	const conn = await amqp.connect("amqp://localhost");
	const ch = await conn.createChannel();

	const exchange = "orders";
	const queue = "orders.created";
	const dlx = "orders.dlx";
	const dlq = "orders.created.dlq";

	await ch.assertExchange(exchange, "topic", { durable: true });
	await ch.assertExchange(dlx, "direct", { durable: true });

	await ch.assertQueue(dlq, { durable: true });
	await ch.bindQueue(dlq, dlx, "orders.created");

	await ch.assertQueue(queue, {
		durable: true,
		deadLetterExchange: dlx,
		deadLetterRoutingKey: "orders.created"
	});

	await ch.bindQueue(queue, exchange, "orders.created");
})();

Ejemplo Producer (Node.js)

const amqp = require("amqplib");

(async () => {
	const conn = await amqp.connect("amqp://localhost");
	const ch = await conn.createChannel();

	const exchange = "orders";
	const routingKey = "orders.created";

	const message = {
		id: 123,
		total: 99.99,
		date: new Date()
	};

	await ch.assertExchange(exchange, "topic", { durable: true });
	ch.publish(
		exchange,
		routingKey,
		Buffer.from(JSON.stringify(message)),
		{ persistent: true }
	);

	setTimeout(() => conn.close(), 500);
})();

Ejemplo Consumer con ACK y reintentos

const amqp = require("amqplib");

(async () => {
	const conn = await amqp.connect("amqp://localhost");
	const ch = await conn.createChannel();
	const queue = "orders.created";

	await ch.assertQueue(queue, { durable: true });
	ch.prefetch(1);

	ch.consume(queue, msg => {
		try {
			const data = JSON.parse(msg.content.toString());
			console.log("Procesando", data);
			ch.ack(msg);
		} catch (err) {
			ch.nack(msg, false, false);
		}
	});
})();

Ejemplo cola con TTL y delay

await ch.assertQueue("orders.retry", {
	durable: true,
	messageTtl: 30000,
	deadLetterExchange: "orders",
	deadLetterRoutingKey: "orders.created"
});

Ejemplo configuración de Quorum Queue

await ch.assertQueue("orders.quorum", {
	durable: true,
	arguments: {
		"x-queue-type": "quorum"
	}
});

Ejemplo Virtual Host y permisos

rabbitmqctl add_vhost /payments
rabbitmqctl add_user payments_user secret
rabbitmqctl set_permissions -p /payments payments_user ".*" ".*" ".*"

Ejemplo plugin Delayed Message Exchange

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

Casos reales de arquitectura

  • E-commerce
    • Pedido creado → cola
    • Pago, stock, email como consumidores independientes
  • Finanzas
    • Procesamiento de transacciones
    • Auditoría y conciliación
  • SaaS
    • Webhooks
    • Jobs de mantenimiento
  • Data pipelines
    • Ingesta de datos
    • Preprocesamiento previo a Kafka

Anti-patrones comunes

  • Usar RabbitMQ como base de datos
  • Una sola cola para todo
  • Sin DLQ
  • Prefetch infinito
  • Consumidores con lógica pesada
  • Mensajes gigantes

Relación con otros sistemas

  • Complemento de APIs REST
  • Alternativa ligera a Apache Kafka para workflows
  • Backbone de arquitecturas orientadas a mensajes

Glosario de conceptos de RabbitMQ

Protocolo y estándares

  • AMQP (Advanced Message Queuing Protocol)
    • Protocolo de mensajería estándar usado por RabbitMQ.
    • Define exchanges, colas, bindings y confirmaciones.
  • AMQP 0-9-1
    • Versión más usada en producción.
    • Optimizada para brokers tradicionales de colas.
  • STOMP
    • Protocolo simple de mensajería soportado vía plugin.
    • Usado por clientes ligeros.
  • MQTT
    • Protocolo orientado a IoT.
    • Integrable mediante plugin.

Componentes principales

  • Broker
    • Servidor que recibe, enruta y entrega mensajes.
  • Producer (Publisher)
    • Aplicación que envía mensajes al broker.
  • Consumer
    • Aplicación que recibe y procesa mensajes.
  • Exchange
    • Punto de entrada de mensajes.
    • Decide a qué colas se enruta un mensaje.
  • Queue
    • Estructura FIFO donde se almacenan los mensajes.
  • Binding
    • Relación entre un exchange y una cola.
  • Routing Key
    • Clave usada para el enrutamiento de mensajes.
  • Virtual Host (vhost)
    • Espacio lógico aislado dentro del broker.
    • Permite multitenancy.

Tipos de exchange

  • Direct Exchange
    • Enruta mensajes por coincidencia exacta de routing key.
  • Fanout Exchange
    • Envía mensajes a todas las colas enlazadas.
  • Topic Exchange
    • Usa patrones con comodines (*, #) para enrutar.
  • Headers Exchange
    • Enruta por cabeceras del mensaje en lugar de routing keys.

Confirmaciones y fiabilidad

  • ACK (Acknowledgement)
    • Confirmación de que un mensaje fue procesado correctamente.
  • NACK
    • Rechazo de un mensaje indicando fallo.
  • Reject
    • Rechazo explícito sin reencolar.
  • Requeue
    • Acción de devolver el mensaje a la cola.
  • Publisher Confirms
    • Confirmación de que el broker recibió el mensaje.

Persistencia y durabilidad

  • Durable Exchange
    • Exchange que sobrevive a reinicios del broker.
  • Durable Queue
    • Cola persistente tras reinicios.
  • Persistent Message
    • Mensaje escrito en disco.
  • Transient Message
    • Mensaje solo en memoria.
  • At-least-once delivery
    • Garantía de entrega mínima, puede haber duplicados.

Gestión de errores

  • DLX (Dead Letter Exchange)
    • Exchange que recibe mensajes fallidos.
  • DLQ (Dead Letter Queue)
    • Cola asociada a un DLX.
    • Usada para auditoría y reprocesado.
  • Retry Queue
    • Cola intermedia usada para reintentos.
  • Backoff
    • Retraso progresivo entre reintentos.
  • Poison Message
    • Mensaje que siempre falla al procesarse.

Control de flujo y rendimiento

  • Prefetch
    • Límite de mensajes no confirmados por consumidor.
  • Backpressure
    • Mecanismo para evitar saturación de consumidores.
  • Flow Control
    • Pausa automática de productores cuando el broker se satura.
  • Throughput
    • Cantidad de mensajes procesados por unidad de tiempo.
  • Latency
    • Tiempo entre publicación y consumo del mensaje.

TTL y expiración

  • TTL (Time To Live)
    • Tiempo máximo de vida de un mensaje o cola.
  • Expired Message
    • Mensaje eliminado por superar su TTL.
  • Delayed Message
    • Mensaje entregado tras un tiempo definido (plugin).

Arquitectura y escalabilidad

  • Node
    • Instancia individual de RabbitMQ.
  • Cluster
    • Conjunto de nodos RabbitMQ coordinados.
  • Mirrored Queue
    • Cola replicada entre nodos (legacy).
  • Quorum Queue
    • Cola basada en Raft.
    • Alta disponibilidad y consistencia fuerte.
  • Leader
    • Nodo principal de una quorum queue.
  • Follower
    • Nodo replicado que sigue al líder.

Seguridad

  • TLS
    • Cifrado de comunicaciones.
  • Authentication
    • Validación de identidad de usuarios.
  • Authorization
    • Permisos sobre exchanges, colas y vhosts.
  • Permissions
    • Reglas de lectura, escritura y configuración.

Plugins

  • Management Plugin
    • Interfaz web de administración.
  • Delayed Message Exchange Plugin
    • Permite mensajes diferidos.
  • Shovel
    • Copia mensajes entre brokers.
  • Federation
    • Distribuye mensajes entre clusters.
  • MQTT Plugin
    • Soporte para dispositivos IoT.

Patrones de mensajería

  • Work Queue
    • Distribución de tareas entre workers.
  • Publish / Subscribe
    • Difusión de eventos a múltiples consumidores.
  • Routing Pattern
    • Enrutamiento selectivo por clave.
  • Topic Pattern
    • Enrutamiento flexible por jerarquía.
  • Request / Reply
    • Comunicación tipo RPC asíncrona.
  • Event-driven Architecture
    • Sistemas reaccionan a eventos publicados.

Conceptos avanzados

  • Idempotencia
    • Capacidad de procesar mensajes duplicados sin efectos secundarios.
  • Exactly-once (conceptual)
    • Objetivo lógico, no garantizado nativamente.
  • Message Ordering
    • Garantía de orden dentro de una cola.
  • Schema Evolution
    • Cambios de formato de mensajes sin romper consumidores.
  • Contract-first Messaging
    • Definición previa del contrato del mensaje.