quyennv.com

Senior DevOps Engineer · Healthcare, Singapore

Kafka vs RabbitMQ: Architecture, How They Work, and Comparison

#kafka#rabbitmq#messaging#event-streaming#devops#infrastructure

Apache Kafka and RabbitMQ are both widely used for messaging and event-driven systems, but they have different architectures and design goals. Kafka is built for high-throughput event streaming and log retention; RabbitMQ is a traditional message broker with flexible routing and strong delivery guarantees. This post describes each system’s architecture in detail, then compares them and outlines typical use cases.


Apache Kafka: architecture and how it works

Overview

Kafka is a distributed event streaming platform. It stores streams of records in topics; each topic is split into partitions spread across brokers. Producers append to topics; consumers read in order from partitions. Data is retained for a configurable period (or size), so Kafka doubles as a distributed log and a message bus.

Core components

ComponentRole
BrokerA Kafka server. Stores partitions; serves produce and fetch requests. Multiple brokers form a cluster.
TopicA named stream of records (e.g. orders, page-views). Logically one log; physically implemented as one or more partitions.
PartitionAn ordered, immutable sequence of records. Each partition is stored on one or more brokers (replication). Records get a partition key (optional); same key goes to same partition to preserve order per key.
ProducerPublishes records to topics. Can specify key and partition (or let the broker choose).
ConsumerReads records from topics. Consumers are grouped in consumer groups; each partition is consumed by at most one consumer in the group (parallel consumption).
Consumer groupSet of consumers that share the work of consuming one or more topics. Kafka assigns each partition to one consumer in the group; rebalancing happens when consumers join or leave.
ZooKeeper / KRaftZooKeeper (or KRaft in newer Kafka) stores cluster metadata, broker registration, topic config, and consumer group state. KRaft is Kafka’s built-in consensus mode, removing the ZooKeeper dependency.

Data model: log and offsets

  • Each partition is an append-only log. Records are assigned a sequential offset within the partition. Consumers read from an offset and commit their position (e.g. per consumer group) so they can resume after restart.
  • Retention: Records are kept for a configured time (e.g. 7 days) or total size. After that they are deleted. So Kafka is both a pub/sub system and a replayable log.
  • Ordering: Guaranteed per partition only. Total order across a topic requires a single partition (or a consistent partition key).

Replication and durability

  • Each partition has a leader broker and zero or more replica brokers. Producers and consumers talk to the leader; the leader replicates to in-sync replicas (ISR). If the leader fails, a replica is promoted. acks (e.g. all) control how many replicas must acknowledge a write before the producer gets a success.

Architecture diagram (simplified)

+------------------+     produce      +------------------------------------------+
|   Producer A     | --------------->|  Broker 1 (leader P0, replica P1)        |
|   Producer B     |                 |  Broker 2 (leader P1, replica P0, P2)    |
+------------------+                 |  Broker 3 (leader P2, replica P1)        |
                                     |  Topic "events" : P0, P1, P2            |
+------------------+     fetch       +------------------------------------------+
|  Consumer Group  | <---------------+
|  C1 <- P0        |        |
|  C2 <- P1        |        |  (each partition consumed by one consumer
|  C3 <- P2        |        |   in the group)
+------------------+        v
                     +------------------------------------------+
                     |  Partitions = ordered, replicated logs   |
                     |  Retention = time or size                |
                     +------------------------------------------+

Flow (simplified)

  1. Produce: Producer sends records to a topic (with optional key). Broker (or partitioner) chooses partition; record is appended and replicated; producer gets ack per config.
  2. Consume: Consumer (in a group) subscribes to topics; Kafka assigns partitions to consumers; each consumer fetches from the tail (or from a committed offset); consumer commits offsets (e.g. periodically or after process).
  3. Rebalance: When consumers join or leave, the group coordinator reassigns partitions so each partition has one consumer in the group.

Important Kafka traits

  • High throughput: Sequential disk I/O, batching, and partitioning allow very high write and read rates.
  • Replay: Consumers can reset to an earlier offset and reprocess (e.g. new consumer, reprocess after bug fix).
  • Scalability: Scale by adding brokers and partitions; more partitions allow more parallel consumers per group.
  • Ecosystem: Kafka Connect (connectors), Kafka Streams (stream processing), ksqlDB; often used as the backbone for event-driven and stream processing.

RabbitMQ: architecture and how it works

Overview

RabbitMQ is a message broker that implements AMQP (and other protocols). Producers send messages to exchanges; exchanges route messages to queues via bindings; consumers consume from queues. The model is push to consumers (broker delivers), with flexible routing (direct, topic, fanout, headers) and strong delivery semantics (ack, nack, dead-letter).

Core components

ComponentRole
BrokerThe RabbitMQ server. Hosts virtual hosts, exchanges, queues, and connections.
Virtual host (vhost)Logical namespace: exchanges, queues, and permissions are scoped to a vhost. Isolates tenants or environments.
ExchangeReceives messages from producers and routes them to queues (or other exchanges) according to type and bindings. Does not store messages (except for delayed/plugin cases).
QueueFIFO buffer of messages. Messages stay until consumed (and acked) or TTL/overflow. Consumers pull by accepting deliveries (push from broker’s perspective).
BindingRule from an exchange to a queue (and optionally another exchange): routing key, headers, or pattern. Defines which messages go where.
ConnectionTCP connection from client to broker. Typically long-lived; multiple channels (lightweight) are multiplexed over one connection.
ChannelLightweight context for publishing and consuming. Almost all API operations use a channel.

Exchange types and routing

Exchange typeRoutingUse case
DirectRouting key must match exactly. One-to-one or simple routing.Point-to-point, single queue per key.
TopicRouting key matched by pattern (e.g. orders.*.created). Wildcards: * (one word), # (zero or more words).Pub/sub with categories (e.g. by event type, region).
FanoutIgnores routing key; copies to all bound queues.Broadcast to many consumers.
HeadersMatch on message headers (all or any).Content-based routing.

Message lifecycle and guarantees

  • Publish: Producer publishes to an exchange with optional routing key and headers. Exchange routes to zero or more queues. If mandatory or immediate flags are used, broker can return or confirm delivery.
  • Storage: Messages live in queues (in memory and/or on disk, per queue config). They are removed when a consumer acks them (or after nack/requeue or TTL).
  • Consume: Broker pushes messages to consumers (delivery). Consumer acks (removes from queue), nacks (requeue or dead-letter), or rejects. Prefetch limits unacked messages per consumer so one slow consumer doesn’t starve others.
  • Dead letter: Unacked or rejected messages can be sent to a dead-letter exchange and then to a DLQ for inspection or retry.

Architecture diagram (simplified)

+-------------+  publish   +------------------+
|  Producer   | --------->|    Exchange       |
+-------------+  (key/    |  (direct/topic/  |
                  headers) |   fanout/headers)|
                           +--------+---------+
                                    | bindings
              +---------------------+---------------------+
              |                     |                     |
              v                     v                     v
     +-------------+       +-------------+       +-------------+
     |   Queue A   |       |   Queue B   |       |   Queue C   |
     +------+------+       +------+------+       +------+------+
            |                     |                     |
            | deliver             | deliver             | deliver
            v                     v                     v
     +-------------+       +-------------+       +-------------+
     |  Consumer 1  |       |  Consumer 2  |       |  Consumer 3  |
     +-------------+       +-------------+       +-------------+

Flow (simplified)

  1. Publish: Producer opens connection and channel, publishes to an exchange with routing key (and optional headers). Exchange evaluates bindings and pushes a copy of the message to each matching queue.
  2. Store: Each queue holds messages until they are consumed. Queues can be durable (survive broker restart) and support TTL, length limit, and dead-letter.
  3. Consume: Consumer subscribes to a queue; broker pushes messages (deliveries). Consumer processes and acks (or nacks). Unacked messages can be requeued or sent to DLQ.

Important RabbitMQ traits

  • Flexible routing: Exchanges and bindings support direct, topic, fanout, and header-based routing; one message can go to many queues.
  • Delivery guarantees: Acks, confirms, persistent messages, and optional transactions support at-least-once or at-most-once patterns; dead-letter aids error handling.
  • Protocols: AMQP 0-9-1 is native; plugins add MQTT, STOMP, and HTTP (management). Many client libraries and integrations.
  • Operability: Management UI, clustering, federation, shovel; fine-grained permissions per vhost.

Kafka vs RabbitMQ: comparison

AspectKafkaRabbitMQ
Primary modelDistributed log / event stream. Consumers pull (fetch) by offset.Message broker. Broker pushes to consumers (delivery).
OrderingPer partition (and per key if key is used). Total order only with one partition or stable key.Per queue (FIFO by default). No global order across queues.
RetentionConfigurable by time and/or size. Messages stay after consumption; replay by offset.Messages removed when acked. No built-in replay; queue is a buffer, not a log.
RoutingProducer chooses topic (and optionally key/partition). No built-in fan-out to multiple “queues” (use separate topics or consumer groups).Exchanges + bindings: direct, topic, fanout, headers. One publish can go to many queues.
ThroughputVery high: sequential I/O, batching, partitioning. Suited to millions of messages per second.High but typically lower than Kafka for the same hardware; routing and ack handling add cost.
LatencyCan be low (e.g. single-digit ms) with tuning; batching can add latency.Typically low; push model and in-memory queues suit request/response and task queues.
Consumption modelPull (consumer fetches). Multiple consumer groups can read the same topic independently (each has its own offset).Push (broker delivers). Competing consumers share a queue; each message is delivered to one consumer.
BackpressureNatural: consumer fetches at its own rate.Prefetch (QoS) limits unacked messages; slow consumer can block a queue.
Replay / reprocessYes: reset offset and read again. Good for new consumers, reprocessing, analytics.No: once acked, message is gone. Need to republish or use a separate log.
Message sizeOptimized for larger batches; very large single messages possible but not the main use case.Suited to small–medium messages; very large messages need tuning.
DurabilityReplication (ISR); configurable acks. Log on disk.Persistent messages and durable queues; optional publisher confirms.
ComplexityCluster, partitions, consumer groups, offsets, retention. Concepts: log, stream.Exchanges, queues, bindings, vhosts. Concepts: routing, queue.
Typical useEvent streaming, log aggregation, activity tracking, stream processing, event sourcing.Task queues, RPC, fan-out to multiple apps, complex routing, traditional messaging.

Use cases: when to use Kafka

  • Event streaming and log aggregation — High-volume streams of events (clicks, logs, metrics) with retention and multiple consumers (real-time and batch).
  • Activity and audit trails — Append-only log of what happened; replay and analytics.
  • Event sourcing — Store event log; rebuild state or new views by replaying.
  • Stream processing — Feed for Kafka Streams, Flink, ksqlDB; windowing, joins, aggregations.
  • Multiple independent consumers — Many consumer groups reading the same stream at their own pace and from their own offset.
  • Replay and reprocessing — New consumer or bug fix; reset offset and read again.
  • High throughput — Millions of messages per second; partitioning and batching scale out.

Use cases: when to use RabbitMQ

  • Task queues and work distribution — Jobs (e.g. image resize, email send); competing consumers; ack when done; dead-letter on failure.
  • Request/reply and RPC — Temporary reply queues, correlation IDs; low latency.
  • Complex routing — Route by topic pattern, headers, or fan-out to many queues from one publish.
  • Decoupling services — Producer doesn’t know consumers; exchanges and bindings add/remove subscribers without code change.
  • Traditional messaging — Need at-most-once or at-least-once with ack; need TTL, priority, dead-letter, and DLQ.
  • Multiple protocols — AMQP, MQTT, STOMP, or management over HTTP via plugins.
  • Lower volume, higher flexibility — When throughput is moderate but routing, guarantees, and operational features matter more than replay.

Summary

SystemArchitecture in shortStrengthTypical role
KafkaBrokers, topics, partitions (replicated logs); producers append; consumers fetch by offset; consumer groups; retention by time/size.Throughput, retention, replay, multiple consumer groups, stream processing.Event streaming, logs, event sourcing, analytics, high-volume pipelines.
RabbitMQBroker, vhosts, exchanges (direct/topic/fanout/headers), queues, bindings; producers publish to exchanges; broker pushes to consumers; ack/nack.Routing, delivery guarantees, flexibility, task queues, RPC.Task queues, RPC, decoupling, complex routing, traditional messaging.

Choose Kafka when you need a durable, replayable event stream, high throughput, and multiple consumers (including stream processing). Choose RabbitMQ when you need flexible routing, strong delivery semantics, task queues, and a classic message broker model. In some architectures both are used: e.g. RabbitMQ for request/reply and task queues, Kafka for event streaming and analytics.

← All posts

Comments