RabbitMQ

RabbitMQ Troubleshooting: 12 Production Issues and How to Fix Them

A

AceMQ Engineering Team

RabbitMQ Consulting & Support

RabbitMQ Troubleshooting: 12 Production Issues and How to Fix Them

Most RabbitMQ issues in production trace back to a short list: a memory or disk alarm blocking publishers, a cluster partition that cost a quorum queue its majority, a TLS or authentication failure on the connection path, consumers that stopped acknowledging messages, or a version-specific bug introduced during an upgrade. Checking them in that order — service status, alarms, cluster state, connections, consumers — resolves most incidents before deeper analysis is needed.

Below are the twelve issues with RabbitMQ we see most often on enterprise clusters, each with the diagnostic command that confirms it. Several come from production engagements our engineers ran this year.

The most common issues with RabbitMQ, in the order they occur

Before reading a single log file, answer three questions in this order:

  1. Is the broker running? A stopped rabbitmq-server process or a crashed node looks identical to a network problem from the client side.
  2. Is an alarm active? When a memory or disk alarm fires, RabbitMQ deliberately blocks publishing connections. The broker is healthy; it is protecting itself.
  3. Do all nodes agree on cluster membership? A partition where each side believes the other is gone is the most damaging RabbitMQ issue, because writes may continue on both sides.
rabbitmq-diagnostics check_running     # is the node up and the app started?
rabbitmq-diagnostics alarms            # memory / disk alarms
rabbitmqctl cluster_status             # membership, partitions, running nodes

Running those three first prevents the most common troubleshooting mistake: restarting a node that was fine and destroying the evidence.

A note on detection. If the first you hear of an outage is a customer calling, the problem is not RabbitMQ — it is observability. Fix that before optimizing anything else.

1. Split-brain scenarios and cluster partitions

Problem. Nodes lose connectivity and each side believes it is authoritative, causing data divergence and possible message loss. This is most dangerous in multi-site and cloud deployments.

Solution. Quorum queues use the Raft consensus protocol and need a majority of members available to elect a leader and accept writes. A three-node cluster tolerates one node loss; lose two and the queue stops accepting writes by design. That behaviour is correct — force-restarting a node to "fix" it is how teams lose messages.

cluster_partition_handling = pause_minority

pause_minority is the safe default for enterprise deployments: the minority side pauses rather than accepting writes it cannot reconcile. autoheal favours high availability over consistency, and ignore should only be used where you are handling reconciliation yourself.

Two patterns we hit repeatedly in the field:

Kubernetes node maintenance without a RabbitMQ drain. During a 2026 cluster assessment we traced recurring quorum loss to node maintenance performed without draining RabbitMQ first. A Kubernetes drain evicts the pod, but the RabbitMQ node needs its own graceful shutdown so quorum queue members can hand off leadership. Skipping that step turns routine patching into a partition. The same sequencing applies when upgrading RabbitMQ 3.x to 4.x without downtime.

Version-specific quorum defects. On the same engagement we isolated node recognition errors to a defect in the 4.2.3 release, resolved in later 4.2.x builds and the 4.3 series. If membership errors survive a clean restart and correct configuration, check the release notes for your exact patch version before redesigning anything.

For disaster recovery clusters, confirm the DR site activates only on primary failure. A DR cluster that comes up alongside a healthy primary is a split-brain generator; recovery then requires manual node recreation and re-election, not automated failover.

2. Memory and disk alarms blocking publishers

Problem. Publishers hang while consumers keep draining. Nothing looks broken in the logs.

Solution. RabbitMQ blocks publishing connections when memory usage crosses the high watermark (default 40% of available RAM) or free disk falls below the disk free limit (default 50 MB).

rabbitmq-diagnostics alarms
rabbitmq-diagnostics memory_breakdown

The breakdown matters more than the total. Memory held by queue contents means messages are not being consumed fast enough — a consumer problem wearing a memory costume. Memory held by client connection and channel state usually means an application is leaking them, often by opening a channel per message instead of reusing one.

Raising vm_memory_high_watermark is a stopgap, not a fix. Verify why the memory is held first; a higher limit on a real backlog only delays the same outage. Alarms clear automatically once usage drops back below the threshold.

3. Message backlog and flow control

Problem. Queues grow long or disk usage hits a limit, RabbitMQ engages flow control, and publishers slow or stall — disrupting upstream pipelines and causing timeouts.

Solution. Design for short queues. Add consumers so messages are processed faster, and configure quorum queue segment limits to match your retention needs. Tune memory and disk thresholds deliberately rather than leaving defaults on a large host, and alert on queue depth trend rather than absolute value — a queue growing steadily for ten minutes is a better signal than one that briefly spiked.

4. Unacknowledged messages and consumer stalls

Problem. Consumers receive messages but never acknowledge them. Unacked messages accumulate, memory climbs, and the queue stalls.

Solution. Identify which of the three failure shapes you have:

rabbitmqctl list_queues name messages messages_unacknowledged consumers
  • Messages high, consumers zero — the consumer application is down, or its subscription points at the wrong queue or virtual host.
  • Messages high, consumers present, unacknowledged high — consumers receive but never send the ack. Usually a client crashing mid-processing, or one that misses the ack on an exception path. Set a consumer_timeout so stuck deliveries are requeued rather than held indefinitely.
  • Messages high, unacknowledged near zero — consumers cannot keep up. Scale out, or revisit prefetch.

Prefetch is the most common misconfiguration. An unbounded prefetch lets one consumer claim thousands of messages while its peers idle; a prefetch of 1 adds a network round trip per message. We cover the tradeoff in tuning RabbitMQ prefetch count, and the same logic applies to any pubsub topology fanning out across multiple message queues.

The consumer capacity metric in the RabbitMQ management UI is the fastest read here. Sustained low consumer capacity with a deep queue means the bottleneck is downstream of RabbitMQ, not in the broker.

5. The wrong queue type for the workload

Problem. Classic queues struggle in high-churn environments and under large backlogs, becoming unstable under heavy load.

Solution. Use quorum queues for enterprise durability. They offer predictable behaviour under load and far better recovery in failover scenarios. Confirm your clients support publisher confirms for data safety, and if strict ordering matters, validate consumer behaviour explicitly — quorum queues change redelivery semantics in ways some applications notice. See migrating from classic queues to quorum queues for the migration path.

6. Deprecated mirrored queues and HA policy misconfiguration

Problem. Classic mirrored queues — now deprecated — fail over inconsistently, causing synchronization delays and potential data loss. Overly broad mirroring policies tax resources and cut throughput.

Solution. Migrate to quorum queues for modern high availability. Avoid blanket mirroring policies; define HA behaviour explicitly and test failover on a schedule rather than discovering it during an incident. If you still run mirrored queues, monitor synchronization lag and verify the mirror topology matches intent — a policy pattern that accidentally matches every queue is a common cause of unexplained resource pressure.

7. TLS, certificates, and connection failures

Problem. Clients cannot connect, or connect and are immediately rejected.

Solution. Split the diagnosis. Cannot connect at all: confirm the listener is on the port you expect. RabbitMQ uses port 5672 for plain AMQP and 5671 for AMQP over TLS. Hardened deployments disable 5672 entirely — a change that breaks every client still pointed at the old port. Capture TCP traffic with tcpdump and inspect it in Wireshark to prove where the connection dies.

Connects then fails: check permission grants and the virtual host. Valid credentials with no permission on the target virtual host authenticate successfully and then fail on every operation.

rabbitmqctl list_users
rabbitmqctl list_permissions -p /your-vhost

For OAuth 2.0 and LDAP backends, enable decision logging before assuming credentials are wrong — access control failures are frequently a misconfigured OAuth scope or search filter rather than a bad password.

TLS handshake failures deserve special attention. In a recent support engagement, secure messaging failed on port 5671 despite PEM certificates being installed correctly on every node. The handshake was terminating at the load balancer. The cause was a certificate mismatch: the common name and SAN fields must match the hostname the client actually connects to, which for a load-balanced cluster is the load balancer address, not the individual node hostname. Where mutual TLS is not a hard requirement, dropping the client certificate requirement eliminates an entire class of these failures.

Two operational details worth recording now rather than discovering later: a custom CA certificate must be installed on every client machine — including Windows clients, which do not pick it up automatically — and CA certificates issued with a 10-year lifetime still need a documented rotation procedure. A certificate that expires with no owner is a scheduled outage.

Running into a RabbitMQ cluster issue you cannot isolate? AceMQ engineers work on production clusters every day, including quorum queue recovery and partition forensics. Talk to an AceMQ engineer — we can usually tell you within one session whether it is configuration, infrastructure, or a known defect.

8. Erlang cookie, hostname changes, and CLI connectivity

Problem. rabbitmqctl cannot reach the node, and it looks like the RabbitMQ server is down when it is running fine.

Solution. Three causes account for nearly all of these:

  • Erlang cookie mismatch. Every node and CLI tool must share the same cookie value (/var/lib/rabbitmq/.erlang.cookie on most Linux deployments, or the user profile directory from a Windows command prompt). A mismatched Erlang cookie produces authentication errors that mimic a dead broker. On Windows this commonly breaks when the service runs as SYSTEM but the CLI runs as Administrator — the cookie must be copied between profiles and its permissions corrected.
  • Hostname resolution. Nodes are identified as rabbit@hostname. If the hostname changes — common after a container or VM rebuild — the node cannot rejoin its own RabbitMQ cluster.
  • Blocked inter-node ports. Beyond AMQP on 5672, a cluster needs 4369 (epmd) and 25672 for inter-node TCP traffic. Firewall rules that open only the client port break clustering silently.

To restart a node cleanly rather than killing the process:

rabbitmqctl stop_app && rabbitmqctl start_app

That stops the RabbitMQ application while leaving the Erlang VM running, preserving far more diagnostic state than a full RabbitMQ service restart.

9. Antivirus scanning and disk I/O contention

Problem. RabbitMQ's Mnesia database and queue files get scanned by endpoint antivirus or real-time security tooling, particularly on corporate Windows servers. The result is severe performance degradation and unexplained node slowdowns that look like a RabbitMQ fault.

Solution. Add RabbitMQ's data directories to the exclusion list of your antivirus or endpoint protection product. This prevents the high I/O and file locking that can bring a node to a crawl. Confirm the exact paths from your deployment with rabbitmq-diagnostics status, which reports the configured data directory. This one is easy to miss because nothing in the RabbitMQ log files points at it.

10. Resource contention on virtual machines

Problem. Nodes running in VMs share CPU, RAM, and disk I/O with other workloads, producing unpredictable latency, queue stalls, and outright node failures.

Solution. Pin dedicated CPU cores to RabbitMQ and reserve memory for each VM running a node. Monitor CPU steal time, disk latency, and memory pressure in Grafana alongside your RabbitMQ metrics — steal time in particular is invisible from inside the broker and explains a large share of "RabbitMQ is slow" reports that have nothing to do with RabbitMQ. Avoid overloaded hypervisors and shared storage for production nodes.

11. Heartbeat and network timeout tuning

Problem. In high-latency, cloud, or WAN deployments, default heartbeat and TCP timeouts produce false-positive node failures and unnecessary network partitions.

Solution. Lengthen heartbeat intervals and adjust tcp_listen_options to suit the environment rather than accepting defaults tuned for a low-latency LAN. Tune Erlang distribution settings for inter-node reliability. A cluster spread across availability zones needs different timeouts than one in a single rack, and mismatched settings here manifest as partitions with no underlying network fault.

12. Upgrade and plugin failures

Problem. The broker will not start after an upgrade, with an error that does not name the real cause.

Solution. Two distinct risks. Each RabbitMQ release series requires a supported Erlang/OTP version range; upgrading against an unsupported Erlang build produces startup failures that look like configuration problems. Check the compatibility matrix before the maintenance window, not during it.

Plugins are the second cause. A plugin compiled for an earlier broker version may refuse to load after an upgrade. Disable third-party plugins, confirm the node starts, then re-enable them one at a time.

Finally, track security advisories for your series. The RabbitMQ project publishes CVE notifications and patch releases on a regular cadence; running an open source deployment with nobody assigned to watch those advisories means learning about vulnerabilities from an auditor. If you are weighing that operational burden against a commercial subscription, we break down the options in RabbitMQ licensing and commercial support.

Monitoring: catching these before they page you

Most RabbitMQ issues are visible in metrics well before they become outages.

rabbitmq-plugins enable rabbitmq_management    # management UI on 15672
rabbitmq-plugins enable rabbitmq_prometheus    # metrics on 15692

The RabbitMQ management UI gives you the Queues tab, connection lifecycle and channel views, and per-node memory breakdowns without touching the CLI. The management plugin is the fastest way to verify broker state during an incident.

A practical configuration from a recent deployment: a 30-second scrape interval gives continuous capture without flooding storage, and queue-level metrics were deliberately left disabled on a low-traffic cluster. Per-queue cardinality on a broker with thousands of queues produces enormous volumes of data nobody reads. Node-level and cluster-level health checks caught every real incident on that system.

Track at minimum: memory alarms and disk alarm state, queue depth, consumer capacity, unacknowledged message count, node availability, and partition events. Those six metrics cover every failure mode in this guide.

For log files, raise log levels temporarily rather than permanently — debug logging on a busy broker generates enough volume to cause the disk alarm you are diagnosing:

rabbitmqctl set_log_level debug
# reproduce the issue, then
rabbitmqctl set_log_level info

If a node crashed outright, look for an erl_crash.dump dump file in the RabbitMQ data directory. The Erlang crash dump viewer (cdv) shows which process died and how much memory it held — often the fastest route to a root cause when the node left no useful log entries.

Also worth doing routinely: back up cluster configuration and user definitions so disaster recovery is not archaeology; simulate real traffic and failure scenarios in pre-production; and track configuration and topology changes in your infrastructure-as-code repository so a regression can be traced to a change.

When to escalate to RabbitMQ support

Handle in-house: single-node restarts, alarm investigation, permission and virtual host fixes, prefetch tuning, plugin conflicts, antivirus exclusions.

Escalate when you hit:

  • A cluster partition where both sides accepted writes and you need to reconcile
  • Quorum queues that stay unavailable after every node is confirmed healthy
  • Repeated crashes with no clear cause in log files or dump file analysis
  • Message loss you cannot account for
  • An upgrade path across multiple major versions on a cluster you cannot take offline
  • Security advisories affecting a version you cannot patch quickly

These share a trait: the cost of a wrong move exceeds the cost of a second opinion. Forcing a quorum queue back online without knowing which side holds authoritative data turns a recoverable partition into permanent data loss.

AceMQ provides RabbitMQ support and consulting for enterprise deployments — 24/7 SLA-backed incident response, cluster assessments, upgrade planning, and CVE patching. Whether you run open source RabbitMQ or a commercial subscription, we can help you troubleshoot RabbitMQ issues before they become downtime.

RabbitMQ troubleshooting FAQ

Why is RabbitMQ not accepting messages?

The most common cause is an active memory or disk alarm. RabbitMQ blocks publishing connections when memory usage exceeds the high watermark (default 40% of RAM) or free disk drops below the disk free limit (default 50 MB). Run rabbitmq-diagnostics alarms to confirm.

How do I check if a RabbitMQ cluster is partitioned?

Run rabbitmqctl cluster_status on each node. If nodes report different membership, or a partitions section appears in the output, the RabbitMQ cluster is partitioned. Compare output from every node — a single node's view is not sufficient.

What causes a RabbitMQ quorum queue to become unavailable?

Quorum queues need a majority of their members online to elect a leader. A three-node queue tolerates one node loss but stops accepting writes if two are unavailable. Check node availability first, then verify no version-specific defect affects your patch release.

Why do my TLS connections to RabbitMQ fail on port 5671?

Usually a certificate whose common name or SAN fields do not match the hostname the client connects to. In load-balanced clusters that must be the load balancer address, not the individual node hostname. Otherwise-valid certificates still fail the handshake.

How do I recover messages stuck in a RabbitMQ queue?

Determine whether consumers are absent, failing to send an ack, or too slow, using rabbitmqctl list_queues name messages messages_unacknowledged consumers. Messages showing as unacknowledged return to the queue automatically when the client connection closes — they are not lost.

Why is RabbitMQ slow with no errors in the logs?

Look outside the broker. Antivirus scanning of the Mnesia and queue directories, CPU steal time on a shared hypervisor, and disk I/O contention all degrade RabbitMQ badly while producing no RabbitMQ log entries at all.

Where are RabbitMQ log files located?

Typically /var/log/rabbitmq/ on Linux and the RabbitMQ data directory on Windows. Confirm the exact path with rabbitmq-diagnostics status, which reports configured log file locations.

Can I run RabbitMQ 3.x safely in production?

Yes, but only with a patching path. New development and security work target the 4.x series, so an unsupported 3.x cluster accumulates unpatched advisories over time. If you cannot migrate on the timeline the community release schedule implies, extended support beyond 3.12.x keeps patches, performance fixes, and security updates flowing to older versions — which is usually the difference between running 3.x safely and running it on borrowed time.

Free Consultation

Get Expert Eyes on Your RabbitMQ Cluster

Whether you're troubleshooting a production incident, planning a migration, or want a second opinion on your architecture — our team is ready. No pitch, just answers.

Email Us