RabbitMQ

Why Not Use RabbitMQ? Real Limits and Kafka Myths

Why Not Use RabbitMQ? Real Limits and Kafka Myths
Scott Sternloff

By Scott Sternloff, Senior Enterprise Architect

LinkedIn · Updated

Do not use RabbitMQ when your workload is high-volume event streaming, when consumers need to replay history, or when stream processing and real-time analytics sit downstream. Apache Kafka is built for those jobs; a general-purpose message broker is not, and no amount of tuning closes that gap. Most of the other objections you will hear — that it is outdated, that it is slow, that it cannot scale — are either already fixed or a misreading of a deliberate design trade-off.

Both halves of that answer matter. There are real reasons not to use it, and there are myths that get repeated until teams make an expensive migration they did not need. The distinction below is the one an engineer who has run both in production would draw.

The Real Reasons Not to Choose RabbitMQ

Very high-throughput event streaming. It handles large volumes of messages perfectly well, but RabbitMQ messages each carry server-side state the broker has to track: delivery tags, acknowledgements, redelivery counts, index entries. That bookkeeping is what makes a general-purpose message broker useful, and it is also what caps sustained throughput. When a single stream must absorb millions of messages per second, Kafka's append-only log wins by construction, because it batches, writes sequentially, and pushes almost all per-consumer state onto the consumer.

Event replay and log retention. Messages are deleted once acknowledged, and queues store messages only until a consumer confirms them. Kafka retains records for a specified retention period whether or not anyone consumed them, so a new service can rewind to offset zero and rebuild its own view of history. If your architecture depends on replay — reprocessing after a bug, bootstrapping a new consumer from the full event log, or event sourcing — Kafka is the better answer. Its own streams feature, added in 3.9, does give you a replayable append-only log with a retention period, and it is a genuinely good feature; the surrounding ecosystem is simply much smaller.

Stream processing. Kafka Streams, ksqlDB, and Flink give you windowed joins, aggregations, and stateful transformations over a data stream as a first-class capability. No equivalent exists on the queueing side, and building one yourself is work nobody should sign up for.

Analytics and data pipelines. Kafka Connect exists to land Kafka topics in warehouses, lakes, and search indexes with configuration rather than code. Feeding an analytics platform through a message queue means writing and operating those sinks yourself.

Version lifecycle pressure. This one is operational rather than architectural, and it is a real reason teams reconsider. Its release series have relatively short community support windows, and each major upgrade — the move to quorum queues, the Khepri metadata store, Erlang/OTP version floors — is genuine project work. Teams stuck on an end-of-life release either budget that upgrade or arrange extended LTS support for RabbitMQ to stay patched while they plan. What is not a good reason is abandoning a working broker because an upgrade was deferred too long.

Kafka vs RabbitMQ: The Architectural Difference

Almost every practical difference between the two follows from one decision: RabbitMQ is a message broker that routes and then forgets, and Kafka is an event streaming platform built on a distributed log that stores and lets you read again.

RabbitMQ uses exchanges and bindings. Producers send messages to an exchange with a routing key, and the exchange decides which queues receive a copy — direct, topic, fanout, or header matching. That indirection is why complex routing is easy: a single publish can fan out to six services, and you change who receives what by editing bindings, not code. It implements the Advanced Message Queuing Protocol, and since 4.0 speaks AMQP 1.0 natively alongside MQTT and STOMP, which makes it a practical message bus for communication between applications that do not share a stack.

Kafka has no routing layer. Producers write to a partition of a topic, usually chosen by hashing a key, and consumers in a group each own a subset of partitions. Kafka supports no per-message selection, no selective acknowledgement, and no priority; consumers filter for themselves. In exchange you get ordering per partition, a horizontally scalable cluster you grow by adding brokers, and retention that is independent of consumption.

Delivery differs too. The queueing side uses a push model with a prefetch window: the broker pushes messages to consumers and waits for an ack, and it can requeue, dead-letter, or delay them. Kafka uses a pull model, where consumers fetch batches and commit offsets. Push with per-message ack gives fine-grained control over a single work item. Pull with offsets gives throughput and replay. Neither is a defect.

Is RabbitMQ Outdated?

No. It is one of the more actively developed brokers in the category, and the "outdated" claim usually reflects knowledge of the broker as it was around 2018.

Quorum queues replaced classic mirrored queues with a Raft-based replication design that behaves predictably under network splits and node failure, and they are now the default recommendation for high availability. Streams added log-structured, replayable storage. Version 4.0 reworked the metadata store around Khepri for more reliable cluster recovery, and removed long-standing behaviour that caused operational surprises. Development continues under Broadcom, and the release cadence has been steady.

What is fair to say is that upgrading is not free, and that a cluster still running classic mirrored replication on an old release is carrying real risk. That is an operating problem, not evidence the technology has stalled.

Is RabbitMQ Slower Than Kafka?

It is not slow. It is optimised for a different thing.

For end-to-end latency on a single message, it is frequently the faster of the two: messages are delivered in low single-digit milliseconds, published and routed with no batching window to wait on. For aggregate throughput on one topic, Kafka wins decisively, because sequential writes, large batches, and zero per-message broker state are exactly what a high-performance streaming platform needs.

A well-provisioned RabbitMQ server sustains tens of thousands of messages per second, and a cluster scales that further; quorum queues cost throughput relative to the classic type in exchange for safety. Kafka clusters routinely run an order of magnitude higher. If your real requirement is tens of thousands of messages per second with rich fan-out, the throughput headline is irrelevant to you. If it is a firehose of telemetry, it is the only number that matters.

The performance limitation worth knowing is queue depth. The broker is designed to drain, not to accumulate. When consumers fall behind and the server has to queue messages by the million, memory and disk pressure rise, flow control engages, and publishers slow down. Kafka treats a large backlog as normal, because a backlog is just an offset that has not been reached. Any system where consumers routinely lag by hours should be on a log, not a queue.

When RabbitMQ Is the Right Choice

It is the better fit when the unit of work is a task rather than an event:

  • Asynchronous processing and job queues — image processing, PDF generation, email dispatch, anything where a worker takes one item, does real work, and acknowledges it.
  • Complex routing — one publish, many selective subscribers, decided by routing key or headers rather than by consumer-side filtering.
  • Per-message control — priority queue support, per-message TTL, delayed delivery, and dead-letter exchanges that isolate poison messages without stalling the queue.
  • Microservices command traffic — request/reply over a message queue, with a reply-to address and correlation id, is a common use case the broker handles cleanly and Kafka does not.
  • Protocol bridging — MQTT devices, STOMP clients, and modern application clients all reaching the same durable message broker.

Those are the main use cases, and they cover a large share of what a microservices architecture actually needs. AceMQ's enterprise RabbitMQ services exist because most of them are still running on it for good reasons.

When Not to Use a Message Queue at All

Sometimes the right answer is neither broker. Not every workload needs an event-driven design: do not introduce a messaging system when the caller needs an answer before it can continue — that is a synchronous API call, and wrapping it in a queue adds latency and failure modes without adding decoupling. Skip it when a single service owns the work end to end, when a database table or a scheduled job would do, and when total volume is low enough that operating a clustered broker costs more attention than the problem is worth. Message queues buy you decoupling, buffering, and retries. If you need none of those three, you are paying for infrastructure you will still have to patch at 2am.

Alternatives to RabbitMQ

Kafka is the obvious alternative for event streaming, but it is not the only one. Redis Streams suits low-latency work where losing some history is acceptable and you already run Redis. ActiveMQ remains the pragmatic choice for JMS-centric Java estates. Apache Pulsar combines queueing and streaming with tiered storage and multi-tenancy, at the cost of a more complex operational footprint. NATS is excellent when you want something small and fast. Managed cloud services — SQS, Service Bus, Pub/Sub — remove operational load and add lock-in.

Common Mistakes When Choosing Between Kafka and RabbitMQ

The most common mistake is choosing on benchmarks instead of workload. Published throughput numbers describe a test nobody runs in production; your delivery patterns, message sizes, and how producers and consumers actually behave matter far more.

The second is assuming one broker must serve everything. Plenty of mature systems run both: RabbitMQ for commands and task distribution, Kafka for the event log and analytics. That is a reasonable system design, not a failure to decide.

The third is underestimating operational cost. Running Kafka well means partition sizing, consumer-group tuning, and rebalance behaviour you did not have to think about before. Migrating away from a broker your team knows, to fix a problem you do not have, usually trades a familiar constraint for an unfamiliar one.

AceMQ supports RabbitMQ, Kafka, Redis, ActiveMQ, Pulsar and 40 other platforms for over 130 enterprise customers across 26 countries, with 11 senior subject matter experts and a 15-minute emergency response SLA. As Broadcom's exclusive strategic RabbitMQ MSP partner we have every reason to recommend it, and we regularly point customers to Kafka instead. Whether to use Kafka or RabbitMQ depends on the workload, and it is worth getting that judgement from someone who runs both.

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