Command Palette

Search for a command to run...

ES·EN

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.

Puntos clave

  • El flujo de mensajes: Productor → Exchange → Binding → Queue → Consumidor. Nunca Productor → Queue directamente.
  • Ack manual con DLQ es el patrón de producción — nunca perder un mensaje, pero tampoco quedar en loops infinitos de requeue.
  • Usá quorum queues en lugar de classic queues para cualquier dato que no podás perder — sobreviven fallos de nodo via Raft.

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)