Cheatsheet: Kafka vs RabbitMQ: Choose the Right Broker for Your Use Case
One-line model: ==Kafka is a replayable log; RabbitMQ is a broker-managed queue with a routing graph.== Pick the storage model that matches how you need to consume.
Module 1: Architecture and delivery semantics
1.1 Log vs queue: what each broker really stores
| Dimension | Kafka | RabbitMQ |
|---|---|---|
| Storage unit | Append-only partition log | Broker-managed queue |
| Consumer position | Client-side offset (consumer owns it) | Broker-side delivery state (unacked set) |
| After consumption | Message stays until retention expires | Message removed once acked |
| Replay | Yes, seek any offset within retention | No, once acked it is gone |
| Fan-out | Free: N consumer groups read same log | Costly: one copy per queue |
| Retention driver | Time/size, independent of consumers | Driven by consumption |
| Delete on consume | No | Yes (default) |
- Kafka retention is decoupled from consumption: a slow consumer does not slow the log.
- RabbitMQ queue length is a pressure signal: backlog lives in the broker, watch memory.
- Replay is Kafka's killer feature. If the answer is "we might need to reprocess", the answer is Kafka.
1.2 At-most-once vs at-least-once, worked through both brokers
[!IMPORTANT] Delivery semantics are not a broker switch. They are the position of one line of code relative to your business logic.
Kafka: the decision is commitSync
// at-most-once: commit BEFORE processing
while (true) {
ConsumerRecords<String,String> recs = consumer.poll(Duration.ofMillis(100));
consumer.commitSync(); // offset advanced first
process(recs); // crash here = lost messages
}
// at-least-once: commit AFTER processing
while (true) {
ConsumerRecords<String,String> recs = consumer.poll(Duration.ofMillis(100));
process(recs); // crash here = redelivery
consumer.commitSync();
}
RabbitMQ: the decision is basic.ack
This cheatsheet is part of the paid section. Sign in and purchase the course to view the full content. Sign in