Backend
RabbitMQ
- Backend
- middleware
- gestor de colas
- Stream Processing
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
- [hub.docker.com//rabbitmq](https://hub.docker.com//rabbitmq) Docker
- hub.docker.com/r/bitnami/rabbitmq
- Simplifying RabbitMQ Setup with Docker A Step-by-Step Guide-simplifying-rabbitmq-setup-with-docker-a-step-by-step-guide-9698dc9ea4ff
- How to use RabbitMQ with Docker and Docker Compose; a beginner’s guide
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
- Instalación en cluster de Kubernetes
- youtube/kubernetes/rabbitmq-cluster at master · achetronic/youtube · GitHub
- StatefulSets
- Persistent Volumes
- Clustering y mirroring
- High Availability (HA)
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.
- Usa patrones con comodines (
- 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.
¿Te gusta este contenido? Suscríbete vía RSS