Nivel 2 · 25 min
RabbitMQ
RabbitMQ es un message broker tradicional que implementa AMQP. A diferencia del log append-only de Kafka, RabbitMQ enruta mensajes a través de exchanges hacia queues según reglas de binding. Los mensajes típicamente se consumen una vez y se eliminan. Sobresale en colas de tareas, patrones RPC y escenarios de enrutamiento complejo.
Exchanges y Enrutamiento
Los productores envían mensajes a exchanges, nunca directamente a queues. Los tipos de exchange determinan el enrutamiento: Direct (enruta a queues con binding key exacta — punto-a-punto), Topic (patrones de routing key con * para una palabra y # para cero o más — enrutamiento flexible), Fanout (broadcast a todas las queues vinculadas — pub/sub), Headers (enruta basándose en headers del mensaje — raro). La routing key es un string en el mensaje; los bindings definen qué claves envía un exchange a qué queue.
Queues y Bindings
Las queues almacenan mensajes hasta que son consumidos. Propiedades: durable (sobrevive restart del broker), exclusive (usada por una conexión), auto-delete (eliminada cuando el último consumidor se desconecta). Los bindings conectan exchanges a queues con un patrón de routing key. Argumentos de queue: x-message-ttl (TTL por mensaje), x-max-length (limitar tamaño de queue), x-dead-letter-exchange (adónde van mensajes rechazados/expirados), x-queue-type: quorum (replicada, recomendada sobre mirrored). Quorum queues usan consenso Raft — preferidas para durabilidad en producción.
Acknowledgments y Dead Letter Queue
Los acknowledgments del consumidor controlan el ciclo de vida del mensaje. Auto-ack (autoAck=true): mensaje eliminado inmediatamente al recibirse — más rápido pero pierde mensajes si el consumidor falla. Ack manual: el consumidor envía basicAck tras procesamiento exitoso — at-least-once. basicNack/basicReject: requeue=true devuelve el mensaje a la queue (cuidado con loops infinitos), requeue=false envía al Dead Letter Exchange (DLX). Dead Letter Queue (DLQ): una queue normal vinculada a un DLX — recibe mensajes rechazados, expirados (TTL) o que superaron el límite de queue. Esencial para debuggear mensajes fallidos sin perderlos.
Code example
// Topic exchange: enrutar por severidad y fuente
channel.exchangeDeclare("logs", "topic");
channel.queueBind("error-queue", "logs", "*.error"); // cualquier fuente, nivel error
channel.queueBind("payment-queue", "logs", "payment.#"); // todos los logs de payment
// Publicar
channel.basicPublish("logs", "payment.error", props, body);
// Va a ambas queues (coincide con ambos bindings)