Home/Infrastructure/Kafka vs RabbitMQ vs NATS vs Redis Streams: A 6-Question Decision Guide
InfrastructureKafkaRabbitMQ

Kafka vs RabbitMQ vs NATS vs Redis Streams: A 6-Question Decision Guide

Compare Kafka, RabbitMQ, NATS JetStream and Redis Streams by delivery model, replay, ordering and ops burden. A 6-question decision table, how to size retention correctly, and first-week metrics.

Kafka vs RabbitMQ vs NATS vs Redis Streams: A 6-Question Decision Guide
Contents
  1. Why "just use Kafka" isn't always right
  2. Start with the delivery model
  3. A 30-second decision table: 6 questions
  4. Cost: get these numbers right before the price list
  5. Metrics to watch in the first week
  6. FAQ

Why "just use Kafka" isn't always right

The most common mistake when picking a message queue is choosing the best-known product instead of the guarantees you need. One million messages a day sounds like a lot, but it averages about 11.6 messages per second (1,000,000 ÷ 86,400). At that volume, Kafka, RabbitMQ, NATS JetStream and Redis Streams can all handle the throughput. What decides it is the delivery model, replay, the unit of ordering, and the operational burden.

Start with the delivery model

ItemKafkaRabbitMQNATS (Core / JetStream)Redis Streams
Core modelPartitioned append-only logExchange → queue routing (stream queues also available)Core: pub/sub; JetStream: persistent streamsAppend-only log as a Redis data type
After a message is readKept for the retention period (consumers track offsets)Classic and quorum queues delete on ack; streams keep itCore: not stored; JetStream: kept per retention policyKept until trimmed (XTRIM/MAXLEN)
ReplayReset offsets and reprocessStreams (3.9+) only, not regular queuesSet a JetStream consumer's start positionXRANGE / read from an ID
Ordering unitWithin a partitionPer queue (multiple competing consumers can process out of order; Single Active Consumer helps)Per stream/subjectPer stream
Delivery guaranteeAt-least-once by default; exactly-once processing via idempotent producer + transactionsAt-least-once with publisher confirms + consumer acksCore: at-most-once; JetStream: at-least-once, exactly-once via message-ID dedupAt-least-once with consumer groups + XACK
Fan-outEach consumer group reads everything independentlyfanout/topic exchanges copy to each queueEvery subscriber receives; JetStream per consumerEach consumer group reads independently
High availabilityReplication factor (typically 3), KRaft controllersQuorum queues (Raft)JetStream cluster replicas (R1/R3/R5)Redis replication/cluster (asynchronous)

Some of this changed in recent versions, so don't trust older articles blindly:

  • Kafka 4.0 (March 2025) removed ZooKeeper mode; only KRaft is supported. "Kafka means running a ZooKeeper cluster too" is no longer true.
  • RabbitMQ 4.0 removed classic queue mirroring. Use quorum queues or streams for replication.
  • Since Kafka 3.0, producers default to enable.idempotence=true and acks=all (unless conflicting settings are present).
  • NATS JetStream deduplication uses the Nats-Msg-Id header and the stream's duplicate window (2 minutes by default).
  • In Redis Streams, unacked messages stay in the PEL (pending entries list). Find a dead consumer's messages with XPENDING and take them over with XAUTOCLAIM (6.2+).

A 30-second decision table: 6 questions

  1. Do you need to re-read past messages? (e.g. a new service consuming the last 7 days from the start)
  2. If you need ordering, at what level? Global, per key (order ID, etc.), or per queue
  3. Is it a work queue where messages disappear once consumed, or an event log that several teams read independently?
  4. Are the routing rules complex? (header/pattern routing, priorities, delayed retries, DLQ)
  5. Must loss be zero? Then you need broker replication, producer confirmations and consumer acks, all three
  6. Who will run it? Upgrades, disks, rebalances, monitoring
SituationFirst choiceWhyWatch out for
Many consumers read the same events independently; replay and long retention are keyKafkaLog + consumer groups + offset reset are built in; ecosystem (Connect, Streams, Schema Registry)Partition count and key design drive ordering and scale. You can add partitions, but the key→partition mapping changes
Work queues with retries, DLQ, priorities, complex routingRabbitMQExchanges, bindings, DLX and TTL are built in; per-message acksDon't use it as an unbounded backlog store; replicate with quorum queues
Lightweight service-to-service messaging, request-reply, edge/IoT, small ops teamNATS (+JetStream)Single binary, low ops burden, add JetStream persistence only where neededCore NATS drops messages when no subscriber is listening; create JetStream streams explicitly for persistence
You already run Redis and need small-scale async jobsRedis StreamsNo extra infrastructure; consumer groupsData lives in memory, so retention costs memory. Asynchronous replication can lose recent writes on failover

Cost: get these numbers right before the price list

Cloud prices change by region and over time, so this article doesn't quote fixed prices. Instead, normalize your inputs so you can quote any product the same way. Example: 1M messages/day × 2 KB average × 7-day retention.

InputCalculationResult
Average throughput1,000,000 ÷ 86,400~11.6 msg/s (measure peak separately)
Daily ingest1,000,000 × 2 KB~2 GB/day
Monthly ingest2 GB × 30~60 GB/month (use for transfer costs)
Retained data2 GB × 7 days~14 GB
With replication factor 314 GB × 3~42 GB (+ headroom, index/overhead)

A common mistake is multiplying monthly ingest (60 GB) by the retention days again. With 7-day retention, what sits on disk is 7 days' worth (~14 GB, ~42 GB replicated). At this scale, the minimum broker footprint (usually 3 nodes) and people's time drive the cost far more than storage.

Easy-to-miss line items:

  1. Cross-AZ transfer: with RF 3 across AZs, producer → leader, leader → followers and consumer reads can all cross AZs. Check your cloud's rates; in Kafka, client.rack lets consumers read from the nearest replica (follower fetching).
  2. Managed-service billing units: broker-hours, partition-hours, stored GB, processed GB: each service differs. Feed the same workload table into each vendor's official calculator.
  3. Labor for self-hosting: even when instances are cheapest, write down how many hours a month go to upgrades, disk growth and incidents.

Metrics to watch in the first week

ProductMust-watch metricsWarning signs
KafkaConsumer lag, under-replicated partitions, disk usageLag keeps growing; URP > 0 persists
RabbitMQQueue depth (ready/unacked), memory and disk alarms, connections/channelsUnacked keeps growing (stuck consumer); alarms block publishers
NATS JetStreamConsumer pending / ack pending, redeliveries, stream sizeAck pending grows; max deliver reached
Redis StreamsStream length (XLEN), PEL size (XPENDING), memoryPEL never shrinks (dead consumer); near maxmemory

FAQ

Q. Can RabbitMQ replay messages? A. RabbitMQ Streams (3.9+) retain messages and let you re-read by offset. Classic and quorum queues delete messages on ack, so they aren't meant for replay.

Q. Does Kafka guarantee global ordering? A. Only within a partition. Send the same key (e.g. order ID) to the same partition to get per-key ordering. Global ordering requires a single partition and gives up parallelism.

Q. Is NATS alone loss-free? A. Core NATS is at-most-once; messages are lost if no subscriber is connected. Use JetStream streams with explicit acks when you need durability.

As of 2026-10-15, based on the official Apache Kafka, RabbitMQ, NATS and Redis docs. Check defaults against the docs for the version you run.

Verification
✦ ✦ ✦
Sources and verification

Sources and checks vary by article. Only articles with a recorded check date, scope and sources below were checked, and only within that scope. For other articles, verify against the current docs for your version before applying anything, and email us about errors. Editorial policy · email us

This article has no recorded human check (date and scope) yet.

Editorial owner · Tive Fi·Published ·
Topic-related official docs (auto-linked · not per-claim sources)Redis documentation ↗Apache Kafka documentation ↗

Comments

Be the first to comment.