Skip to main content
< All Topics
Print

RabbitMQ Messaging

name: rabbitmq-messaging

description: RabbitMQ message broker patterns including exchange types, consumer design, dead-letter handling, and high availability. Use when designing event-driven architectures, implementing reliable messaging, configuring dead-letter queues, or deploying RabbitMQ clusters.

RabbitMQ Messaging

Instructions

Apply these patterns for reliable, scalable message-driven systems with RabbitMQ.

Core concepts:

  • Exchanges route messages to queues via bindings and routing keys
  • Exchange types: direct (exact key match), topic (wildcard patterns *.error, audit.#), fanout (broadcast to all bound queues), headers (match on message headers)
  • Queues store messages until consumed; bind queues to exchanges with routing keys
  • Use durable queues and persistent messages (deliveryMode: 2) for data that must survive broker restarts

Consumer design:

  • Manual acknowledgment (autoAck: false) — ack only after successful processing to prevent message loss
  • Set prefetch count (basic.qos) to control how many unacked messages a consumer holds; start with 1 for ordered processing, increase for throughput
  • Implement idempotent consumers: messages may be redelivered on failure, so design handlers to tolerate duplicates
  • Use consumer tags to identify and cancel specific consumers gracefully

Dead-letter exchanges (DLX):

  • Configure x-dead-letter-exchange and x-dead-letter-routing-key on the source queue
  • Messages route to the DLX on rejection (basic.nack with requeue: false), TTL expiry, or queue length overflow
  • Monitor dead-letter queues and build alerting for accumulation — these represent processing failures

Publisher confirms:

  • Enable publisher confirms (confirm.select) for reliable publishing
  • Wait for broker ack before considering a message sent; implement retry with backoff on nack
  • Combine with mandatory flag to detect unroutable messages

High availability:

  • Use quorum queues (x-queue-type: quorum) for replicated, Raft-consensus-based durability
  • Quorum queues replace classic mirrored queues — they handle network partitions and node failures safely
  • Deploy clusters with an odd number of nodes (3 or 5) for proper Raft leader election

Monitoring:

  • Enable the rabbitmq_management plugin for the web UI and HTTP API on port 15672
  • Track queue depth, consumer count, message rates, and unacked message count
  • Alert on queue depth growth without corresponding consumer activity

Docker deployment:

  • Use the rabbitmq:3-management image for built-in management UI
  • Mount a volume for /var/lib/rabbitmq to persist data across container restarts
  • Set RABBITMQ_DEFAULT_USER and RABBITMQ_DEFAULT_PASS environment variables; rotate credentials in production
Table of Contents