<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RabbitMQ Operations Guides on Netdata</title><link>https://www.netdata.cloud/guides/rabbitmq/</link><description>Recent content in RabbitMQ Operations Guides on Netdata</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://www.netdata.cloud/guides/rabbitmq/index.xml" rel="self" type="application/rss+xml"/><item><title>How RabbitMQ actually works in production: a mental model for operators</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-how-it-works-in-production/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-how-it-works-in-production/</guid><description>&lt;h1 id="how-rabbitmq-actually-works-in-production-a-mental-model-for-operators">How RabbitMQ actually works in production: a mental model for operators&lt;/h1>
&lt;p>Most RabbitMQ incidents look mysterious only because the operator is reasoning about the wrong abstraction. RabbitMQ is not a daemon with threads and shared memory. It is an Erlang/OTP application running on the BEAM VM, and almost everything you interact with (a connection, a channel, a queue) is an independent Erlang process with its own mailbox, scheduled alongside thousands of others. Once you internalize that, the weird symptoms become predictable: why one hot queue can stall an entire connection, why a single node crossing a memory threshold freezes publishers cluster-wide, and why a &amp;ldquo;healthy&amp;rdquo; broker can appear to drop messages.&lt;/p></description></item><item><title>RabbitMQ ACCESS_REFUSED - Login was refused: authentication failures and credential rotation</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-access-refused-login/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-access-refused-login/</guid><description>&lt;h1 id="rabbitmq-access_refused---login-was-refused-authentication-failures-and-credential-rotation">RabbitMQ ACCESS_REFUSED - Login was refused: authentication failures and credential rotation&lt;/h1>
&lt;p>Your application logs are filling with &lt;code>ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN&lt;/code>, and the broker log shows matching &lt;code>PLAIN login refused&lt;/code> lines. No messages flow from the affected clients, and depending on the client library&amp;rsquo;s retry behavior, the broker may also be spending CPU on a tight connect-authenticate-reject loop.&lt;/p>
&lt;p>This error means the broker rejected the username/password pair (or the backend that validates them) during AMQP connection establishment. It happens before any vhost, exchange, or queue is touched. The connection is closed immediately, which is why a single misconfigured deployment can turn into connection churn that looks like a capacity problem.&lt;/p></description></item><item><title>RabbitMQ binary heap bloat: reference-counted message bodies and force_gc</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-binary-heap-memory/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-binary-heap-memory/</guid><description>&lt;h1 id="rabbitmq-binary-heap-bloat-reference-counted-message-bodies-and-force_gc">RabbitMQ binary heap bloat: reference-counted message bodies and force_gc&lt;/h1>
&lt;p>A consumer fleet finishes draining a queue. Queue depth drops to zero. And the RabbitMQ node&amp;rsquo;s memory graph stays high. It sits at two or three times what the message volume should account for, sometimes for hours, while dashboards keep telling you the broker is nearly out of memory. The instinct is to call it a leak. In most cases it is not one.&lt;/p></description></item><item><title>RabbitMQ channel leak and churn: the channel-per-message anti-pattern</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-channel-leak-churn/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-channel-leak-churn/</guid><description>&lt;h1 id="rabbitmq-channel-leak-and-churn-the-channel-per-message-anti-pattern">RabbitMQ channel leak and churn: the channel-per-message anti-pattern&lt;/h1>
&lt;p>Your connection count is flat and queue depths look normal, but broker memory is creeping up and the Erlang process count keeps climbing. That is the classic shape of a RabbitMQ channel leak: a slow resource drain that hides behind a stable connection count until the node runs out of processes or memory.&lt;/p>
&lt;p>Channels are where all AMQP work happens: publishing, consuming, acknowledging. Each channel is a separate Erlang process on the broker. They are lightweight but not free. When a client opens a new channel per message instead of reusing long-lived channels, or recreates a channel on every exception, the broker pays for setup and teardown on every operation. If channels open faster than they close, the leak accumulates Erlang processes and memory indefinitely.&lt;/p></description></item><item><title>RabbitMQ classic mirrored queues removed: migrating to quorum queues</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-classic-mirrored-queue-removed/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-classic-mirrored-queue-removed/</guid><description>&lt;h1 id="rabbitmq-classic-mirrored-queues-removed-migrating-to-quorum-queues">RabbitMQ classic mirrored queues removed: migrating to quorum queues&lt;/h1>
&lt;p>If you upgraded RabbitMQ and your &lt;code>ha-mode&lt;/code> policies silently stopped doing anything, that is not a bug. Classic queue mirroring was deprecated in 3.9 and removed in 4.0. On 4.x the mirroring-related keys in your policies (&lt;code>ha-mode&lt;/code>, &lt;code>ha-params&lt;/code>, &lt;code>ha-sync-mode&lt;/code>, &lt;code>ha-promote-on-shutdown&lt;/code>, &lt;code>ha-promote-on-failure&lt;/code>, &lt;code>ha-sync-batch-size&lt;/code>) have no effect. The classic queues themselves keep working, but each one now runs as a single, non-replicated queue on one node.&lt;/p></description></item><item><title>RabbitMQ connection blocked / blocking: publishers frozen by a resource alarm</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-connection-blocked-blocking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-connection-blocked-blocking/</guid><description>&lt;h1 id="rabbitmq-connection-blocked--blocking-publishers-frozen-by-a-resource-alarm">RabbitMQ connection blocked / blocking: publishers frozen by a resource alarm&lt;/h1>
&lt;p>Your publishers are hanging. No errors, no exceptions, no disconnections. Publish calls simply never return, and queue depth stops growing. When you check the management UI or &lt;code>rabbitmqctl list_connections&lt;/code>, you see connections in state &lt;code>blocking&lt;/code> or &lt;code>blocked&lt;/code> instead of &lt;code>running&lt;/code>.&lt;/p>
&lt;p>This is not a network problem and not a client bug. RabbitMQ has raised a resource alarm (memory or disk) and has deliberately stopped reading from publisher connections across the entire cluster. It is a circuit breaker doing its job. The danger is that many client libraries hide this completely: from the application&amp;rsquo;s perspective, the publish call just hangs with no error, which sends operators chasing ghosts in the wrong place.&lt;/p></description></item><item><title>RabbitMQ connection in flow state: credit-based backpressure explained</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-connection-state-flow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-connection-state-flow/</guid><description>&lt;h1 id="rabbitmq-connection-in-flow-state-credit-based-backpressure-explained">RabbitMQ connection in flow state: credit-based backpressure explained&lt;/h1>
&lt;p>You opened the management UI or ran &lt;code>rabbitmqctl list_connections state&lt;/code> and saw one or more connections sitting in &lt;code>state: flow&lt;/code>. No alarm fired. Nothing is blocked cluster-wide. Is it a problem? Usually no, and treating it like one is a common source of alert noise.&lt;/p>
&lt;p>Connection state &lt;code>flow&lt;/code> is RabbitMQ&amp;rsquo;s internal, per-connection, credit-based backpressure doing what it was designed to do. A specific publishing connection is outrunning something downstream: a queue process, the message store, disk I/O, or an inter-node link. The broker throttles just that connection, transiently, toggling between blocked and unblocked many times per second. It is surgical. It is not a resource alarm.&lt;/p></description></item><item><title>RabbitMQ connection storm: reconnect loops, FD pressure, and CPU spent on handshakes</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-connection-storm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-connection-storm/</guid><description>&lt;h1 id="rabbitmq-connection-storm-reconnect-loops-fd-pressure-and-cpu-spent-on-handshakes">RabbitMQ connection storm: reconnect loops, FD pressure, and CPU spent on handshakes&lt;/h1>
&lt;p>A connection storm happens when many clients open connections to RabbitMQ at the same time, or when a smaller set of clients reconnect in a tight loop. The broker tolerates thousands of idle connections far better than it tolerates creating them. Connection setup is expensive: TCP handling, TLS handshake, AMQP negotiation, authentication, a new Erlang process per connection, plus one process per channel the client opens.&lt;/p></description></item><item><title>RabbitMQ consumer timeout: delivery acknowledgement timed out and the channel is closed</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-consumer-timeout/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-consumer-timeout/</guid><description>&lt;h1 id="rabbitmq-consumer-timeout-delivery-acknowledgement-timed-out-and-the-channel-is-closed">RabbitMQ consumer timeout: delivery acknowledgement timed out and the channel is closed&lt;/h1>
&lt;p>You found this in the broker log or your client logs:&lt;/p>
&lt;pre tabindex="0">&lt;code>delivery acknowledgement on channel 1 timed out
&lt;/code>&lt;/pre>&lt;p>In 3.13+ the fuller broker-side message names the consumer, queue, vhost, delivery tag, and the timeout value used, and the channel is closed with a &lt;code>PRECONDITION_FAILED&lt;/code> (406) channel exception. The client library then typically reopens the channel and resubscribes, until it happens again.&lt;/p></description></item><item><title>RabbitMQ consumer_utilisation low: consumers attached but not keeping up</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-consumer-utilisation-low/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-consumer-utilisation-low/</guid><description>&lt;h1 id="rabbitmq-consumer_utilisation-low-consumers-attached-but-not-keeping-up">RabbitMQ consumer_utilisation low: consumers attached but not keeping up&lt;/h1>
&lt;p>The queue has messages. It has consumers. And yet the backlog keeps growing. The management UI shows &lt;code>consumer_utilisation&lt;/code> (renamed &lt;code>consumer_capacity&lt;/code> in newer RabbitMQ versions) at 0.2 or 0.3, and your first instinct, &amp;ldquo;just add more consumers&amp;rdquo;, may or may not be the right move.&lt;/p>
&lt;p>&lt;code>consumer_utilisation&lt;/code> is a per-queue estimate from the broker: the fraction of time the queue was able to deliver a message immediately to a waiting consumer. A value of 1.0 means every time a message was ready, a consumer could take it. A value below 0.5 with a non-empty backlog means the queue had messages sitting ready while no consumer was in a position to accept them. The bottleneck is on the delivery path between the queue and the consumers, not on publishing, and not on routing.&lt;/p></description></item><item><title>RabbitMQ consumers connected but not acknowledging: the consumer black hole</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-consumers-not-acking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-consumers-not-acking/</guid><description>&lt;h1 id="rabbitmq-consumers-connected-but-not-acknowledging-the-consumer-black-hole">RabbitMQ consumers connected but not acknowledging: the consumer black hole&lt;/h1>
&lt;p>The queue has consumers. The management UI shows &lt;code>consumers: 3&lt;/code>. Yet &lt;code>messages_ready&lt;/code> keeps climbing, the ack rate is flat at zero, and nothing is draining. Everything looks connected and nothing is working. This is the consumer black hole: dangerous because every surface-level health check passes.&lt;/p>
&lt;p>The trap is confusing connection health with consumer health. An open TCP connection and a registered consumer tag do not mean messages are being processed. A consumer can be connected, have channels open, and be completely stuck: deadlocked, blocked on a failed downstream dependency, or a zombie where the application process died but the OS never closed the socket. The broker will hold unacknowledged messages for it, pin them in RAM, and wait. Left alone, this escalates into the &lt;a href="https://www.netdata.cloud/guides/rabbitmq/rabbitmq-memory-resource-limit-alarm/">memory wall&lt;/a>: unacked messages are not paged out, memory grows, the watermark is crossed, and every publisher in the cluster is blocked.&lt;/p></description></item><item><title>RabbitMQ dead-letter queue growing: TTL expiry, max-length overflow, and rejections</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-dead-letter-queue-growing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-dead-letter-queue-growing/</guid><description>&lt;h1 id="rabbitmq-dead-letter-queue-growing-ttl-expiry-max-length-overflow-and-rejections">RabbitMQ dead-letter queue growing: TTL expiry, max-length overflow, and rejections&lt;/h1>
&lt;p>Your dead-letter queue (DLQ) has 400,000 messages and no consumer. Nothing paged you, because RabbitMQ does not alarm on a DLQ by default. But every message in that queue is a record of something that already failed upstream: a consumer that rejected a delivery, a message that sat past its TTL, or a queue that overflowed its length limit and pushed the oldest message out.&lt;/p></description></item><item><title>RabbitMQ disk free limit alarm: free disk space insufficient and publishing halted</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-disk-free-limit-alarm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-disk-free-limit-alarm/</guid><description>&lt;h1 id="rabbitmq-disk-free-limit-alarm-free-disk-space-insufficient-and-publishing-halted">RabbitMQ disk free limit alarm: free disk space insufficient and publishing halted&lt;/h1>
&lt;p>Your RabbitMQ cluster just stopped accepting messages. Publishers are connected but frozen. Consumers are still draining queues normally. The broker log shows a disk alarm, and the management UI shows &lt;code>disk_free_alarm: true&lt;/code> on at least one node.&lt;/p>
&lt;p>This is the RabbitMQ disk free limit alarm. It fires when free space on the node&amp;rsquo;s data partition drops below &lt;code>disk_free_limit&lt;/code>, and it blocks every publisher on every node in the cluster, not just the affected node. It is a hard circuit breaker, not a gradual degradation: one threshold crossing and ingestion stops instantly.&lt;/p></description></item><item><title>RabbitMQ disk_free_limit at the default 50MB: the production footgun</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-disk-free-limit-default-50mb/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-disk-free-limit-default-50mb/</guid><description>&lt;h1 id="rabbitmq-disk_free_limit-at-the-default-50mb-the-production-footgun">RabbitMQ disk_free_limit at the default 50MB: the production footgun&lt;/h1>
&lt;p>RabbitMQ ships with &lt;code>disk_free_limit&lt;/code> set to 50MB. When free disk space on the node&amp;rsquo;s data partition drops below that limit, the broker raises a disk alarm and blocks every publisher on every node in the cluster. Consumers keep draining, but message ingestion stops until free space climbs back above the threshold.&lt;/p>
&lt;p>The 50MB default exists so development installs on tiny machines do not silently eat a laptop&amp;rsquo;s disk. On a production server with terabytes of storage, it is not a safety margin; it is a tripwire one inch off the floor. A single log rotation, an Erlang crash dump, or a burst of persistent messages can consume 50MB in seconds, and the resulting incident looks exactly like a broker outage: publishers frozen, applications timing out, queue depth flat at zero growth while upstream systems back up.&lt;/p></description></item><item><title>RabbitMQ Erlang distribution port saturation: the single link that carries all cluster traffic</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-erlang-distribution-port-saturation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-erlang-distribution-port-saturation/</guid><description>&lt;h1 id="rabbitmq-erlang-distribution-port-saturation-the-single-link-that-carries-all-cluster-traffic">RabbitMQ Erlang distribution port saturation: the single link that carries all cluster traffic&lt;/h1>
&lt;p>Your RabbitMQ cluster is acting haunted. Quorum queues lag behind their leaders. Metadata operations time out intermittently. Nodes occasionally report network partitions even though latency between nodes is sub-millisecond and nothing is actually down. You investigate each symptom separately and find nothing.&lt;/p>
&lt;p>The likely common cause is Erlang distribution port saturation. In a RabbitMQ cluster, all inter-node traffic flows over a single TCP connection per node pair, by default on port 25672. Mnesia metadata replication, quorum queue Raft consensus traffic, management stats aggregation, and internal RPC all share that one connection. There is no separate channel, no QoS, no prioritization. When the volume of inter-node traffic exceeds what that one connection can carry, everything it carries degrades at once.&lt;/p></description></item><item><title>RabbitMQ Erlang process exhaustion: proc_used near the process limit</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-erlang-process-limit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-erlang-process-limit/</guid><description>&lt;h1 id="rabbitmq-erlang-process-exhaustion-proc_used-near-the-process-limit">RabbitMQ Erlang process exhaustion: proc_used near the process limit&lt;/h1>
&lt;p>Your monitoring shows &lt;code>proc_used&lt;/code> climbing toward &lt;code>proc_total&lt;/code> on a RabbitMQ node. The default limit is 1,048,576 Erlang processes, and when the count hits the ceiling, the BEAM VM terminates with a &lt;code>system_limit&lt;/code> error. There is no graceful degradation: the node crashes, taking every connection, channel, and non-replicated queue on it down.&lt;/p>
&lt;p>Process exhaustion is almost never the root cause. Every connection, channel, and queue in RabbitMQ is at least one Erlang process, so when the process table fills, something upstream is creating these objects faster than they are being destroyed. The usual suspects are channel-per-message publishers, leaked temporary queues (auto-delete or exclusive queues whose owning connections never cleanly close), and connection proliferation. Raising the &lt;code>+P&lt;/code> limit buys time; it does not fix anything.&lt;/p></description></item><item><title>RabbitMQ Erlang run queue high: scheduler saturation and slow heartbeats</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-run-queue-scheduler-saturation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-run-queue-scheduler-saturation/</guid><description>&lt;h1 id="rabbitmq-erlang-run-queue-high-scheduler-saturation-and-slow-heartbeats">RabbitMQ Erlang run queue high: scheduler saturation and slow heartbeats&lt;/h1>
&lt;p>The RabbitMQ node is alive, queues are accepting messages, but everything feels slow: publishes lag, acks lag, the management API responds sluggishly, and the cluster log starts showing &amp;ldquo;missed heartbeats&amp;rdquo; from peers or clients. The node&amp;rsquo;s &lt;code>run_queue&lt;/code> metric sits persistently above the CPU core count. OS-level CPU may even look unremarkable.&lt;/p>
&lt;p>This is Erlang scheduler saturation. The BEAM VM has more runnable processes than its scheduler threads can execute, so work queues up and every operation on the node, including heartbeat processing, waits its turn. The secondary effect is worse than the primary one: delayed heartbeats get misread as dead peers, and the cluster starts reporting network partitions that do not exist.&lt;/p></description></item><item><title>RabbitMQ file descriptor exhaustion: fd_used near fd_total and refused connections</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-file-descriptor-exhaustion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-file-descriptor-exhaustion/</guid><description>&lt;h1 id="rabbitmq-file-descriptor-exhaustion-fd_used-near-fd_total-and-refused-connections">RabbitMQ file descriptor exhaustion: fd_used near fd_total and refused connections&lt;/h1>
&lt;p>Clients that were connected keep working, but every new connection attempt fails. Publishers in a reconnect loop after a deployment start timing out. The broker log shows &lt;code>too many open files&lt;/code>, and the management API shows &lt;code>fd_used&lt;/code> sitting at or near &lt;code>fd_total&lt;/code>. This is RabbitMQ file descriptor exhaustion, and it is a cliff-edge failure: no graceful degradation, just a hard refusal.&lt;/p></description></item><item><title>RabbitMQ flow control vs resource alarms: the two throttling mechanisms operators confuse</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-flow-control-vs-resource-alarms/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-flow-control-vs-resource-alarms/</guid><description>&lt;h1 id="rabbitmq-flow-control-vs-resource-alarms-the-two-throttling-mechanisms-operators-confuse">RabbitMQ flow control vs resource alarms: the two throttling mechanisms operators confuse&lt;/h1>
&lt;p>Your RabbitMQ dashboard shows connections that are not in &lt;code>running&lt;/code> state, your alert fired, and you need to know: is the broker in trouble, or working as designed? The answer depends entirely on whether those connections show &lt;code>flow&lt;/code> or &lt;code>blocked&lt;/code>. The difference is not a matter of degree. They are two independent mechanisms with different scope, different causes, and different required responses.&lt;/p></description></item><item><title>RabbitMQ head message age: the queue latency that depth alone cannot show</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-head-message-age/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-head-message-age/</guid><description>&lt;h1 id="rabbitmq-head-message-age-the-queue-latency-that-depth-alone-cannot-show">RabbitMQ head message age: the queue latency that depth alone cannot show&lt;/h1>
&lt;p>A queue with 10 messages whose oldest is 3 hours old is in worse shape than a queue with 10,000 messages whose oldest is 5 seconds old. Queue depth tells you volume. It says nothing about how long messages are actually waiting. Operators who alert on depth alone end up paged for healthy batch queues and blind to a real-time queue that has been stalled for an hour.&lt;/p></description></item><item><title>RabbitMQ memory resource limit alarm: publishers blocked across the whole cluster</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-memory-resource-limit-alarm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-memory-resource-limit-alarm/</guid><description>&lt;h1 id="rabbitmq-memory-resource-limit-alarm-publishers-blocked-across-the-whole-cluster">RabbitMQ memory resource limit alarm: publishers blocked across the whole cluster&lt;/h1>
&lt;p>Your RabbitMQ cluster just stopped accepting messages. Publishers are connected but nothing flows. The broker log shows:&lt;/p>
&lt;pre tabindex="0">&lt;code>memory resource limit alarm set on node rabbit@node1.
*** Publishers will be blocked until this alarm clears ***
&lt;/code>&lt;/pre>&lt;p>One node crossed its memory high watermark, and RabbitMQ responded by blocking every publisher on every node in the cluster. There is no gradual degradation: the transition from &amp;ldquo;fine&amp;rdquo; to &amp;ldquo;all ingestion halted&amp;rdquo; is a single threshold crossing.&lt;/p></description></item><item><title>RabbitMQ memory usage climbing toward the watermark: mem_used vs mem_limit</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-memory-usage-climbing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-memory-usage-climbing/</guid><description>&lt;h1 id="rabbitmq-memory-usage-climbing-toward-the-watermark-mem_used-vs-mem_limit">RabbitMQ memory usage climbing toward the watermark: mem_used vs mem_limit&lt;/h1>
&lt;p>The memory alarm has not fired yet. Publishers are still running. But &lt;code>mem_used&lt;/code> has been creeping up for hours and &lt;code>mem_used / mem_limit&lt;/code> just crossed 0.7. This is the last quiet window you get: RabbitMQ&amp;rsquo;s memory failure mode is a cliff edge. When &lt;code>mem_used&lt;/code> reaches &lt;code>mem_limit&lt;/code>, the alarm fires and every publisher on every node in the cluster is blocked at once.&lt;/p></description></item><item><title>RabbitMQ message TTL expiry: messages vanishing before consumers read them</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-message-ttl-expiry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-message-ttl-expiry/</guid><description>&lt;h1 id="rabbitmq-message-ttl-expiry-messages-vanishing-before-consumers-read-them">RabbitMQ message TTL expiry: messages vanishing before consumers read them&lt;/h1>
&lt;p>A queue shows a stable, modest depth. Publish rate is healthy. Consumers are connected. Then a downstream team reports missing data, and you discover the queue was never keeping up. Messages were expiring faster than consumers could read them, and RabbitMQ silently discarded every one.&lt;/p>
&lt;p>This is the signature failure of message TTL without a dead-letter exchange. A queue-level &lt;code>x-message-ttl&lt;/code> argument or a per-message &lt;code>expiration&lt;/code> property tells RabbitMQ to discard messages that sit too long. Unless a dead-letter exchange (DLX) is configured, expired messages are dropped with no error, no return to the publisher, and no counter that obviously screams &amp;ldquo;data loss.&amp;rdquo; Expiry also works against your monitoring: queue depth stays flat because the backlog is being deleted, and head message age resets every time the head message expires.&lt;/p></description></item><item><title>RabbitMQ messages lost on restart: durable queues, persistent messages, and transient traps</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-messages-lost-on-restart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-messages-lost-on-restart/</guid><description>&lt;h1 id="rabbitmq-messages-lost-on-restart-durable-queues-persistent-messages-and-transient-traps">RabbitMQ messages lost on restart: durable queues, persistent messages, and transient traps&lt;/h1>
&lt;p>You restarted a RabbitMQ node, it came back healthy, and now downstream systems are reporting missing data. The queues are there. The exchanges and bindings are there. But messages that were sitting in queues before the restart are gone, or a queue itself vanished entirely.&lt;/p>
&lt;p>This is almost never a RabbitMQ bug. It is a mismatch between what the operator thinks durability means and what RabbitMQ actually guarantees. The broker did exactly what it was configured to do; the configuration just guarantees less than you assumed.&lt;/p></description></item><item><title>RabbitMQ Mnesia growth: too many queues and bindings, slow declarations and rejoins</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-mnesia-table-growth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-mnesia-table-growth/</guid><description>&lt;h1 id="rabbitmq-mnesia-growth-too-many-queues-and-bindings-slow-declarations-and-rejoins">RabbitMQ Mnesia growth: too many queues and bindings, slow declarations and rejoins&lt;/h1>
&lt;p>Your cluster still routes messages fine, but everything else has gone soft. &lt;code>queue.declare&lt;/code> calls that used to return in milliseconds now take a second or more. The management UI takes ten seconds to render the queue list. A node restarted for a routine upgrade has been &amp;ldquo;starting&amp;rdquo; for five minutes and is serving no traffic. No resource alarm has fired, and yet the system is clearly sick.&lt;/p></description></item><item><title>RabbitMQ monitoring checklist: the signals every production broker needs</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-monitoring-checklist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-monitoring-checklist/</guid><description>&lt;h1 id="rabbitmq-monitoring-checklist-the-signals-every-production-broker-needs">RabbitMQ monitoring checklist: the signals every production broker needs&lt;/h1>
&lt;p>Most RabbitMQ incidents are not exotic. They are memory alarms nobody saw coming, disk alarms triggered by a 50MB default limit, unacked messages pinning RAM while the queue depth graph looked fine, and silent routing loss that only surfaced when a downstream team reported missing data. The broker exposed the signals the whole time. The gap is in what the team chose to collect and alert on.&lt;/p></description></item><item><title>RabbitMQ monitoring maturity model: from survival to expert</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-monitoring-maturity-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-monitoring-maturity-model/</guid><description>&lt;h1 id="rabbitmq-monitoring-maturity-model-from-survival-to-expert">RabbitMQ monitoring maturity model: from survival to expert&lt;/h1>
&lt;p>Most RabbitMQ monitoring setups fail in one of two ways. Either they watch almost nothing and discover outages from user reports, or they chart everything and page on noise. The difference is rarely tooling. It is knowing which signals actually predict the failure modes RabbitMQ is prone to: the memory wall, the disk halt, consumer black holes, split-brain, and silent message loss.&lt;/p></description></item><item><title>RabbitMQ network partition detected: split-brain in cluster_status</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-network-partition-detected/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-network-partition-detected/</guid><description>&lt;h1 id="rabbitmq-network-partition-detected-split-brain-in-cluster_status">RabbitMQ network partition detected: split-brain in cluster_status&lt;/h1>
&lt;p>You ran &lt;code>rabbitmqctl cluster_status&lt;/code> (or your monitoring scraped &lt;code>/api/nodes&lt;/code>) and saw the &amp;ldquo;Network Partitions&amp;rdquo; section listing node names, or a non-empty &lt;code>partitions&lt;/code> array on one or more nodes. The cluster has split: some nodes can no longer see each other over the Erlang distribution link, and each side now has its own view of the world.&lt;/p>
&lt;p>This is a paging condition. What happens next depends on &lt;code>cluster_partition_handling&lt;/code>: the two sides may be accepting writes independently and diverging (the &lt;code>ignore&lt;/code> default), the minority side may have frozen and stopped serving clients (&lt;code>pause_minority&lt;/code>), or nodes may be about to restart themselves (&lt;code>autoheal&lt;/code>). Each outcome has a different blast radius, and the wrong response makes it worse.&lt;/p></description></item><item><title>RabbitMQ node down: telling a dead broker apart from a partitioned one</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-node-down/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-node-down/</guid><description>&lt;h1 id="rabbitmq-node-down-telling-a-dead-broker-apart-from-a-partitioned-one">RabbitMQ node down: telling a dead broker apart from a partitioned one&lt;/h1>
&lt;p>A node has disappeared from your cluster view. The first question is not &amp;ldquo;how do I bring it back&amp;rdquo; but &amp;ldquo;what actually happened to it.&amp;rdquo; A dead broker (VM crashed, process killed, host gone) and a partitioned broker (Erlang node still running but cut off from its peers) look almost identical from one vantage point and completely different from another. The recovery steps are opposite: you restart a dead node, but restarting a partitioned node mid-partition can make split-brain worse.&lt;/p></description></item><item><title>RabbitMQ node is quorum critical: checking before a rolling restart</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-node-quorum-critical/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-node-quorum-critical/</guid><description>&lt;h1 id="rabbitmq-node-is-quorum-critical-checking-before-a-rolling-restart">RabbitMQ node is quorum critical: checking before a rolling restart&lt;/h1>
&lt;p>You are about to restart a RabbitMQ node: a rolling upgrade, an OS patch, an instance resize. Before you stop it, one question decides whether this is routine maintenance or a queue outage: if this node goes down right now, does any quorum queue or stream lose its online majority?&lt;/p>
&lt;p>RabbitMQ ships a purpose-built check for exactly this. &lt;code>rabbitmq-diagnostics check_if_node_is_quorum_critical&lt;/code> returns unhealthy when stopping the target node would drop a quorum queue below the number of online members it needs to accept writes. The same logic is exposed over HTTP at &lt;code>GET /api/health/checks/node-is-quorum-critical&lt;/code>, which makes it usable from automation, load balancer health gates, and CI-driven upgrade pipelines.&lt;/p></description></item><item><title>RabbitMQ NOT_FOUND - no queue or exchange: publishing to something that does not exist</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-not-found-no-queue-exchange/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-not-found-no-queue-exchange/</guid><description>&lt;h1 id="rabbitmq-not_found---no-queue-or-exchange-publishing-to-something-that-does-not-exist">RabbitMQ NOT_FOUND - no queue or exchange: publishing to something that does not exist&lt;/h1>
&lt;p>Your publisher or consumer logs show &lt;code>NOT_FOUND - no exchange 'orders.events' in vhost '/'&lt;/code>, or the queue variant, &lt;code>NOT_FOUND - no queue 'billing.jobs' in vhost '/'&lt;/code>. The RabbitMQ server log has the matching line: &lt;code>operation basic.publish caused a channel exception not_found: no exchange 'orders.events' in vhost '/'&lt;/code>. The channel that raised it is now closed, and depending on the client library, your application may be spinning in a declare-fail-reconnect loop.&lt;/p></description></item><item><title>RabbitMQ paging messages to disk: the paging ratio as an early memory warning</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-paging-messages-to-disk/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-paging-messages-to-disk/</guid><description>&lt;h1 id="rabbitmq-paging-messages-to-disk-the-paging-ratio-as-an-early-memory-warning">RabbitMQ paging messages to disk: the paging ratio as an early memory warning&lt;/h1>
&lt;p>RabbitMQ does not usually go from healthy to blocked in one step. Before the memory alarm blocks publishers cluster-wide, the broker can cross a quieter threshold: queues begin paging message contents out of RAM and onto disk.&lt;/p>
&lt;p>That threshold is controlled by &lt;code>vm_memory_high_watermark_paging_ratio&lt;/code>, which defaults to 0.5 of the effective memory limit. If &lt;code>vm_memory_high_watermark&lt;/code> is 0.40 of RAM, paging starts near 20 percent of RAM. If the watermark is 0.60, paging starts near 30 percent. Check the configured values rather than inferring them from the RabbitMQ version.&lt;/p></description></item><item><title>RabbitMQ partition handling: pause_minority vs autoheal vs ignore</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-partition-handling-pause-minority/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-partition-handling-pause-minority/</guid><description>&lt;h1 id="rabbitmq-partition-handling-pause_minority-vs-autoheal-vs-ignore">RabbitMQ partition handling: pause_minority vs autoheal vs ignore&lt;/h1>
&lt;p>When a RabbitMQ cluster splits across a network fault, the broker cannot keep every node writable without risking divergent state, and it cannot keep every node consistent without taking some nodes out of service. The &lt;code>cluster_partition_handling&lt;/code> setting in &lt;code>rabbitmq.conf&lt;/code> is where you decide, in advance, which one gives: availability, or data.&lt;/p>
&lt;p>Most teams set this once during cluster setup and never test what it does. Then a real partition happens at 3 a.m. and they discover their choice the hard way: &lt;code>autoheal&lt;/code> restarts nodes and drops non-replicated messages, &lt;code>pause_minority&lt;/code> freezes nodes that might be serving most of your clients, and &lt;code>ignore&lt;/code> lets both sides accept writes and silently discards one side&amp;rsquo;s state when the network heals. None of these is a bug. They are the documented behavior you opted into.&lt;/p></description></item><item><title>RabbitMQ permission denied on vhost: configure, write, and read access errors</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-permission-denied-vhost/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-permission-denied-vhost/</guid><description>&lt;h1 id="rabbitmq-permission-denied-on-vhost-configure-write-and-read-access-errors">RabbitMQ permission denied on vhost: configure, write, and read access errors&lt;/h1>
&lt;p>Your application connected to RabbitMQ, authenticated successfully, and then failed the moment it tried to do actual work. The client log shows something like &lt;code>ACCESS_REFUSED - access to exchange 'events' in vhost 'billing' refused for user 'svc-billing'&lt;/code> or &lt;code>403 ACCESS_REFUSED&lt;/code> on a queue declare, publish, or consume call.&lt;/p>
&lt;p>This is a distinct failure class from a login failure. The credentials are valid; the broker rejected a specific operation because the user&amp;rsquo;s permissions on that vhost or resource do not cover it. The fix is completely different: a login failure means wrong credentials or a broken auth backend, while ACCESS_REFUSED means the authorization layer is doing its job and the user, vhost, or permission set is wrong.&lt;/p></description></item><item><title>RabbitMQ poison message loop: a stuck queue head and endless redelivery</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-poison-message-blocking-queue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-poison-message-blocking-queue/</guid><description>&lt;h1 id="rabbitmq-poison-message-loop-a-stuck-queue-head-and-endless-redelivery">RabbitMQ poison message loop: a stuck queue head and endless redelivery&lt;/h1>
&lt;p>A queue with active consumers is making no progress. Queue depth is flat, messages are being delivered, but almost nothing is being acknowledged. The oldest message in the queue keeps getting older. This is a poison message loop: one message at the head of the queue crashes or is rejected by every consumer that picks it up, gets requeued, and is delivered again, forever.&lt;/p></description></item><item><title>RabbitMQ PRECONDITION_FAILED - inequivalent arg: redeclaring a queue with different properties</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-precondition-failed-inequivalent-arg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-precondition-failed-inequivalent-arg/</guid><description>&lt;h1 id="rabbitmq-precondition_failed---inequivalent-arg-redeclaring-a-queue-with-different-properties">RabbitMQ PRECONDITION_FAILED - inequivalent arg: redeclaring a queue with different properties&lt;/h1>
&lt;p>Your application logs are filling with channel exceptions and consumers or publishers keep reconnecting:&lt;/p>
&lt;pre tabindex="0">&lt;code>PRECONDITION_FAILED - inequivalent arg &amp;#39;x-queue-type&amp;#39; for queue &amp;#39;email.queue&amp;#39;
in vhost &amp;#39;Email&amp;#39;: received none but current is the value &amp;#39;quorum&amp;#39; of type &amp;#39;longstr&amp;#39;
&lt;/code>&lt;/pre>&lt;p>This is AMQP error 406, a channel-level exception. A client declared a queue (or exchange) that already exists, but one or more of the declared properties do not match how the entity was originally created. RabbitMQ refuses the declaration and closes the channel. The connection usually survives, but most client libraries treat a channel exception as fatal and tear down the whole connection, so a single mismatched declaration often looks like a reconnect storm.&lt;/p></description></item><item><title>RabbitMQ prefetch count: unacked hoarding versus idle consumers</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-prefetch-count-tuning/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-prefetch-count-tuning/</guid><description>&lt;h1 id="rabbitmq-prefetch-count-unacked-hoarding-versus-idle-consumers">RabbitMQ prefetch count: unacked hoarding versus idle consumers&lt;/h1>
&lt;p>The &lt;code>basic.qos&lt;/code> prefetch count is the most consequential consumer-side setting in RabbitMQ, and the one most teams never touch. The default is unlimited. That default is why a single slow consumer can pin thousands of messages in RAM while every other consumer on the same queue sits idle, and why &amp;ldquo;we added more consumers but nothing got faster&amp;rdquo; is such a common report.&lt;/p></description></item><item><title>RabbitMQ publish outpacing deliver: reading the rate imbalance before the backlog</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-publish-deliver-imbalance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-publish-deliver-imbalance/</guid><description>&lt;h1 id="rabbitmq-publish-outpacing-deliver-reading-the-rate-imbalance-before-the-backlog">RabbitMQ publish outpacing deliver: reading the rate imbalance before the backlog&lt;/h1>
&lt;p>When publish rate runs ahead of deliver rate on a RabbitMQ broker, nothing is broken yet. That is exactly why this signal matters. Queue depth is a lagging indicator: by the time &lt;code>messages_ready&lt;/code> looks alarming, the imbalance has usually been running for minutes. The rate comparison tells you the same thing earlier, and it tells you which side of the pipe changed.&lt;/p></description></item><item><title>RabbitMQ publisher confirms: proving the broker actually accepted your message</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-publisher-confirms/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-publisher-confirms/</guid><description>&lt;h1 id="rabbitmq-publisher-confirms-proving-the-broker-actually-accepted-your-message">RabbitMQ publisher confirms: proving the broker actually accepted your message&lt;/h1>
&lt;p>By default, AMQP publishing is fire-and-forget. Your client writes a message to the socket, the write succeeds, and the application moves on. That TCP write proves exactly one thing: the bytes left your process. It says nothing about whether the broker routed the message, persisted it, or even finished reading it before the connection dropped.&lt;/p>
&lt;p>Publisher confirms close this gap. When enabled, the broker sends an explicit acknowledgement for every published message, after it has taken responsibility for it. Combined with the mandatory flag, confirms are the only way to get end-to-end proof that a message was both accepted and routed. Without them, entire classes of message loss are invisible: unroutable messages are silently discarded, in-flight messages vanish on connection failure, and the first symptom is a downstream consumer reporting missing data hours later.&lt;/p></description></item><item><title>RabbitMQ queue backlog growing: messages_ready climbing and how to drain it</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-queue-backlog-growing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-queue-backlog-growing/</guid><description>&lt;h1 id="rabbitmq-queue-backlog-growing-messages_ready-climbing-and-how-to-drain-it">RabbitMQ queue backlog growing: messages_ready climbing and how to drain it&lt;/h1>
&lt;p>A queue&amp;rsquo;s &lt;code>messages_ready&lt;/code> counter has been climbing for 20 minutes and it is not coming back down. Publishers are still publishing; upstream is fine. You need two answers fast: why consumers are not keeping up, and whether the backlog triggers a memory or disk alarm before you fix it.&lt;/p>
&lt;p>Rising &lt;code>messages_ready&lt;/code> means exactly one thing: messages arrive faster than they are delivered. The cause is one of three: consumers are absent, consumers are present but too slow, or consumers are present but stuck. The diagnostic work is separating those cases, because the fix differs for each and the wrong fix (restart the broker, purge the queue) can turn a slow drain into data loss.&lt;/p></description></item><item><title>RabbitMQ queue with zero consumers: zombie queues that grow until they OOM the node</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-queue-no-consumers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-queue-no-consumers/</guid><description>&lt;h1 id="rabbitmq-queue-with-zero-consumers-zombie-queues-that-grow-until-they-oom-the-node">RabbitMQ queue with zero consumers: zombie queues that grow until they OOM the node&lt;/h1>
&lt;p>A queue with zero consumers and a non-zero publish rate is a memory leak with a routing key. Every published message lands in the queue, nothing drains it, and the backlog grows until something stops it: a TTL, a queue length limit, a manual purge, or the node&amp;rsquo;s memory alarm. If none of the first three happen, you find out when publishers across the whole cluster get blocked.&lt;/p></description></item><item><title>RabbitMQ quorum queue in minority: lost majority and read-only queues</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-quorum-queue-minority/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-quorum-queue-minority/</guid><description>&lt;h1 id="rabbitmq-quorum-queue-in-minority-lost-majority-and-read-only-queues">RabbitMQ quorum queue in minority: lost majority and read-only queues&lt;/h1>
&lt;p>You are looking at a queue with &lt;code>state: minority&lt;/code> in the management API, or publishers are timing out on a queue that was healthy an hour ago. A quorum queue enters minority when fewer than a majority of its Raft members are online. Without a majority, the queue cannot elect a leader and cannot commit new writes.&lt;/p>
&lt;p>This is not a queue-level bug. It is the direct, by-design consequence of a network partition or the loss of multiple cluster nodes. The queue is protecting your data by refusing writes it cannot replicate safely.&lt;/p></description></item><item><title>RabbitMQ quorum queue uncommitted Raft entries growing: followers falling behind</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-quorum-uncommitted-raft-entries/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-quorum-uncommitted-raft-entries/</guid><description>&lt;h1 id="rabbitmq-quorum-queue-uncommitted-raft-entries-growing-followers-falling-behind">RabbitMQ quorum queue uncommitted Raft entries growing: followers falling behind&lt;/h1>
&lt;p>You are watching &lt;code>rabbitmq_raft_log_uncommitted_entries&lt;/code> climb on a quorum queue and it is not coming back down. In a healthy quorum queue this metric hovers near zero with brief spikes during publish bursts. Sustained growth means the leader is appending entries to its Raft log faster than a quorum of followers can replicate and acknowledge them.&lt;/p>
&lt;p>This is a durability problem before it is an availability problem. Every uncommitted entry is a message that exists only on the leader. If the leader fails now, those messages are lost even though publishers may already have received confirms for some of them, depending on client behavior. A sustained count above roughly 1000 entries is a replication bottleneck that needs diagnosis, not observation.&lt;/p></description></item><item><title>RabbitMQ quorum queue WAL explosion: Raft log outpacing snapshots</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-quorum-queue-wal-growth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-quorum-queue-wal-growth/</guid><description>&lt;h1 id="rabbitmq-quorum-queue-wal-explosion-raft-log-outpacing-snapshots">RabbitMQ quorum queue WAL explosion: Raft log outpacing snapshots&lt;/h1>
&lt;p>Every operation on a quorum queue is appended to a Raft write-ahead log on disk. That log is supposed to be bounded: the queue periodically snapshots its state and discards the log segments the snapshot made redundant. When appends outpace snapshots, the WAL grows without bound, the data partition fills, and the node trips the disk alarm.&lt;/p>
&lt;p>The disk alarm is not a quorum-queue-local event. When free disk on any node drops below &lt;code>disk_free_limit&lt;/code>, RabbitMQ blocks all publishers on all nodes in the cluster. Consumers keep draining, but nothing new comes in. A single hot quorum queue can halt message ingestion for the entire cluster, including classic queues and streams that share the node.&lt;/p></description></item><item><title>RabbitMQ redelivered messages climbing: nacks, requeues, and retry storms</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-redelivered-messages-climbing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-redelivered-messages-climbing/</guid><description>&lt;h1 id="rabbitmq-redelivered-messages-climbing-nacks-requeues-and-retry-storms">RabbitMQ redelivered messages climbing: nacks, requeues, and retry storms&lt;/h1>
&lt;p>The redeliver counter on your broker is climbing and it will not stop. Deliveries look healthy on the dashboard, throughput appears fine, but ack rate is flat or falling, and the same messages keep cycling through consumers. This is not message loss. Every one of those messages is being delivered, rejected or abandoned, requeued, and delivered again. You are paying full processing cost for zero net progress.&lt;/p></description></item><item><title>RabbitMQ RESOURCE_LOCKED - cannot obtain exclusive access to queue</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-resource-locked-exclusive-queue/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-resource-locked-exclusive-queue/</guid><description>&lt;h1 id="rabbitmq-resource_locked---cannot-obtain-exclusive-access-to-queue">RabbitMQ RESOURCE_LOCKED - cannot obtain exclusive access to queue&lt;/h1>
&lt;p>Your application logs show a channel-level exception, the channel closes, and the consumer never comes back:&lt;/p>
&lt;pre tabindex="0">&lt;code>reply-code=405, reply-text=RESOURCE_LOCKED - cannot obtain exclusive access to locked queue &amp;#39;reply.xyz&amp;#39; in vhost &amp;#39;/&amp;#39;
&lt;/code>&lt;/pre>&lt;p>This is AMQP error 405, a channel exception raised when a connection tries to declare, consume from, purge, or delete an exclusive queue that is still owned by a different connection. Exclusive queues are bound to the lifecycle of the connection that declared them: only that connection may use them, and they are deleted when that connection closes or is lost. The error is not a capacity problem, not an alarm, and not a permissions failure. It is an ownership conflict.&lt;/p></description></item><item><title>RabbitMQ silent message loss: unroutable messages dropped when mandatory is false</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-silent-routing-loss/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-silent-routing-loss/</guid><description>&lt;h1 id="rabbitmq-silent-message-loss-unroutable-messages-dropped-when-mandatory-is-false">RabbitMQ silent message loss: unroutable messages dropped when mandatory is false&lt;/h1>
&lt;p>Your publisher is healthy. The broker is healthy. Publish rate is non-zero, connections are up, no alarms, no errors in the log. And yet downstream systems are missing data. Queue depth is flat. Deliver rate is zero. Nothing looks broken, because nothing is broken in the usual sense: RabbitMQ is doing exactly what it was told to do.&lt;/p>
&lt;p>When a message is published to an exchange and no queue binding matches its routing key, the broker has nowhere to route it. If the publisher did not set &lt;code>mandatory=true&lt;/code> (and most client libraries default it to false), the broker silently discards the message. No return, no log line, no queue growth, no error surfaced to the publisher.&lt;/p></description></item><item><title>RabbitMQ TLS certificate expiry: expired certs and handshake failures that lock everyone out</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-tls-certificate-expiry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-tls-certificate-expiry/</guid><description>&lt;h1 id="rabbitmq-tls-certificate-expiry-expired-certs-and-handshake-failures-that-lock-everyone-out">RabbitMQ TLS certificate expiry: expired certs and handshake failures that lock everyone out&lt;/h1>
&lt;p>Every client that connects to your RabbitMQ cluster over TLS fails at the same time. No memory alarm, no disk alarm, no queue buildup, no crash. The broker process is running, the management API may even respond, but every AMQP connection attempt dies during the TLS handshake. If inter-node (Erlang distribution) TLS is also enabled, cluster nodes cannot talk to each other and CLI tools may fail to connect as well.&lt;/p></description></item><item><title>RabbitMQ unacknowledged messages growing: the pinned-memory leak behind most alarms</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-unacked-messages-growing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-unacked-messages-growing/</guid><description>&lt;h1 id="rabbitmq-unacknowledged-messages-growing-the-pinned-memory-leak-behind-most-alarms">RabbitMQ unacknowledged messages growing: the pinned-memory leak behind most alarms&lt;/h1>
&lt;p>The queue depth chart looks fine. &lt;code>messages_ready&lt;/code> is flat or low. Then the memory alarm fires and every publisher in the cluster freezes. When you dig in, the culprit is almost always the same: &lt;code>messages_unacknowledged&lt;/code> had been climbing for hours, quietly pinning RAM that RabbitMQ cannot page out.&lt;/p>
&lt;p>Watching total queue depth while ignoring unacknowledged messages as a separate signal is the most common RabbitMQ memory monitoring mistake. A consumer holding 10,000 unacked messages with no acks for 5 minutes is the top precursor to memory alarms, and it is invisible if you only chart &lt;code>messages_ready&lt;/code>.&lt;/p></description></item><item><title>RabbitMQ unroutable messages returned: mandatory publishes with no matching binding</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-unroutable-messages-returned/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-unroutable-messages-returned/</guid><description>&lt;h1 id="rabbitmq-unroutable-messages-returned-mandatory-publishes-with-no-matching-binding">RabbitMQ unroutable messages returned: mandatory publishes with no matching binding&lt;/h1>
&lt;p>Your broker is accepting publishes, no queues are growing, and yet the &lt;code>return_unroutable&lt;/code> counter is climbing. Messages are being published with &lt;code>mandatory=true&lt;/code> to an exchange that cannot route them to any queue, and RabbitMQ is handing them back to the publisher instead of delivering them.&lt;/p>
&lt;p>This is a configuration fault, not an infrastructure fault. The broker is healthy. The routing topology is not. Something changed: a binding was deleted, a queue was removed, an exchange was redeployed without its bindings, or a publisher is using a routing key that matches nothing. Because the publishers set &lt;code>mandatory=true&lt;/code>, RabbitMQ is telling you exactly that messages have nowhere to go. The worse case is the default, &lt;code>mandatory=false&lt;/code>, where unroutable messages are silently dropped and you see nothing at all.&lt;/p></description></item><item><title>RabbitMQ vhost stopped or partially available: queues unreachable on some nodes</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-vhost-stopped/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-vhost-stopped/</guid><description>&lt;h1 id="rabbitmq-vhost-stopped-or-partially-available-queues-unreachable-on-some-nodes">RabbitMQ vhost stopped or partially available: queues unreachable on some nodes&lt;/h1>
&lt;p>You are looking at &lt;code>GET /api/vhosts&lt;/code> and one vhost does not report &lt;code>running&lt;/code> on every node. Its &lt;code>cluster_state&lt;/code> map shows &lt;code>stopped&lt;/code> on one or more nodes, or &lt;code>nodedown&lt;/code>, while the rest of the cluster looks fine. Applications that connect to the affected node and target that vhost fail to open connections, or their channels error out immediately.&lt;/p>
&lt;p>This is a per-node condition, which is what makes it confusing. A vhost is not a single process with one state; it is a supervision tree that runs independently on each cluster node. When it shows &lt;code>stopped&lt;/code> on one node, that node&amp;rsquo;s message store, vhost supervisor, and queue processes for that vhost are not running. Clients pinned to that node by a load balancer or connection string see failures, while clients on other nodes keep working.&lt;/p></description></item><item><title>RabbitMQ vm_memory_high_watermark: setting the memory alarm threshold correctly</title><link>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-vm-memory-high-watermark/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/rabbitmq/rabbitmq-vm-memory-high-watermark/</guid><description>&lt;h1 id="rabbitmq-vm_memory_high_watermark-setting-the-memory-alarm-threshold-correctly">RabbitMQ vm_memory_high_watermark: setting the memory alarm threshold correctly&lt;/h1>
&lt;p>Your publishers are blocked cluster-wide because one node crossed its memory watermark. Or the alarm is firing and clearing every few seconds, and every flap sends a wave of &lt;code>connection.blocked&lt;/code> / &lt;code>connection.unblocked&lt;/code> notifications through your clients. Both investigations land on the same setting: &lt;code>vm_memory_high_watermark&lt;/code>.&lt;/p>
&lt;p>This threshold is easy to get wrong in both directions. Set it too low and normal peak traffic trips a cluster-wide publishing halt. Set it too high (or inherit the new 0.6 default on a small node) and the OS OOM killer gets to the broker before the alarm ever fires, which is how you end up with Mnesia corruption instead of a clean circuit breaker.&lt;/p></description></item></channel></rss>