RabbitMQ Quorum Queues: Moving Beyond Classic Mirrored Queues
RabbitMQ Quorum Queues replace classic mirrored queues with Raft consensus for stronger durability and predictable failover. Learn the trade-offs in throughput, the 3-node requirement, and how to migrate.
25 Mar 2026, 02:06 UTC

The Risk of Silent Data Loss in Mirrored Queues
Classic mirrored queues in RabbitMQ use a primary-backup model that is fundamentally asynchronous. If a primary node acknowledges a message to a producer before it is fully replicated to its mirrors, and that primary fails, the message is lost. Furthermore, network partitions can lead to "split-brain" scenarios where multiple nodes believe they are the leader, causing inconsistent message delivery and complex manual recovery.
Quorum Queues, available since RabbitMQ 3.8, solve this by implementing the Raft consensus algorithm. A message is only acknowledged to the publisher once a quorum (a majority) of replicas have persisted it to disk. This ensures linearizable consistency—meaning the system behaves as if there is only one copy of the data—eliminating the risk of silent loss and split-brain during failovers.
Choosing Quorum Queues Over Classic Queues
Quorum Queues should be the default choice for any workload requiring high availability (HA) and strong durability, such as payment processing or audit logs. However, they are not a drop-in replacement for every scenario due to specific feature omissions.
- Unsupported Features: Quorum Queues do not support per-message TTL (Time-To-Live), exclusive queues, or transient queues.
- Supported Alternatives: Queue-level TTL (defined via
x-message-ttl) is fully supported. - Default Behavior: In RabbitMQ 3.10+, Quorum Queues are the recommended HA type. Classic mirrored queues are deprecated and scheduled for removal in future releases.
Performance Trade-offs: Throughput vs. Predictability
The shift to Raft consensus introduces a performance tax. Because every write requires a network round-trip to a majority of nodes and a mandatory fsync to disk, raw throughput is typically 30–50% lower than non-mirrored classic queues.
The benefit is predictability. While peak throughput drops, tail latency (the worst-case response times) is often 2–3x better during node failures. There is no "promotion storm" or window of unacknowledged messages; the system simply elects a new leader and continues.
Resource Note: Large messages (exceeding 128KB by default) are stored in separate segment files, which increases disk I/O. If your payloads are consistently large, you may need to tune quorum_queue_segment_bytes (default 128MB) and quorum_queue_segment_count.
Implementation: Declaring and Verifying Quorum Queues
To deploy a Quorum Queue, you must specify the x-queue-type argument. These commands should be run on a node with rabbitmqctl and rabbitmqadmin installed, requiring administrator permissions.
# Declare a durable Quorum Queue with the default 3 replicas
rabbitmqadmin declare queue name=orders-quorum durable=true arguments='{"x-queue-type":"quorum"}'
To verify the queue was created correctly and identify the current leader, use the following diagnostic commands:
# Verify the queue type is 'quorum'
rabbitmqctl list_queues name type
# Expected output: orders-quorum quorum
# Inspect Raft replica status and leader placement
rabbitmqctl list_quorum_queues name pid leader replicas status
# Expected output: orders-quorum <0.123.0> rabbit@node1 [rabbit@node1,rabbit@node2,rabbit@node3] running
To monitor health via Prometheus, query the rabbitmq_quorum_queue_replicas metric. A healthy 3-node cluster should show 1 leader and 2 followers for the specific queue.
Operational Constraints and Limitations
Implementing Quorum Queues requires strict adherence to cluster topology and resource management:
- The Three-Node Minimum: A 2-node cluster cannot maintain a quorum if one node fails. If you only have two nodes and one goes down, the queue becomes unavailable. Always plan for at least three nodes.
- Memory Overhead: Raft log entries are kept in memory until truncated. Monitor
rabbitmq_quorum_queue_ram_bytesand consider setting thevm_memory_high_watermarkconservatively (e.g., 0.4) to prevent node crashes. - Network Latency: Replicas require low latency (ideally <5ms). If you need to span geographic regions, do not stretch a single cluster; instead, use the Shovel or Federation plugins.
Migration Path: Blue-Green Pattern
You cannot convert an existing classic mirrored queue into a Quorum Queue in place. The recommended migration is a blue-green approach:
- Declare a new Quorum Queue with the desired name (e.g.,
orders-v2). - Update producers to publish to the new queue.
- Use the Shovel plugin or a temporary consumer to drain the remaining messages from the classic mirrored queue into the Quorum Queue.
- Delete the classic mirrored queue once empty.
Verification Check: Run rabbitmqctl status to ensure your version is 3.8.0 or higher. If a replica shows a status of catching_up for more than a few minutes, check for disk I/O bottlenecks or network instability between the leader and follower.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.