---
title: Message Queue Protocols
url: https://doc.liz6.com/en/networking/11-messages-and-events/02-message-queue-protocols
locale: en
area: networking
tags:
- networking
- messages-and-events
date: 2026-06-30
modified: 2026-07-16
description: 'AMQP (RabbitMQ) uses exchange/queue/binding for intelligent routing, Kafka has consumers track offsets themselves for high throughput, and NATS pursues minimal latency with a minimalist text protocol. The three represent three design philosophies of messaging systems: smart broker, dumb broker, and minimal broker.'
---

# Message Queue Protocols

> AMQP (RabbitMQ) uses exchange/queue/binding for intelligent routing, Kafka has consumers track offsets themselves for high throughput, and NATS pursues minimal latency with a minimalist text protocol. The three represent three design philosophies of messaging systems: smart broker, dumb broker, and minimal broker.

## Overview

Message queues decouple producers and consumers—the sender does not wait for processing to complete, and the receiver consumes at its own pace. AMQP (2003) is known for its exchange/queue/binding model, with RabbitMQ being the most popular implementation. Kafka (2011) inverts the model: consumers track offsets themselves, and brokers do not push—making it better suited for high-throughput event streams. NATS excels in lightweight scenarios with its minimalist text protocol and minimal latency. The three represent three design philosophies of messaging systems: smart broker, dumb broker, and minimal broker.

## AMQP 0-9-1

```
Model:
  Publisher → Exchange → (binding rules) → Queue → Consumer

Exchange types:
  direct:   routing key exact match → queue
  topic:    pattern match (stock.us.*) → multiple queues
  fanout:   broadcast to all bound queues

Ack:
  After each message is processed by the consumer → basic.ack(delivery_tag) → broker deletes it
  Unacknowledged messages: consumer disconnects → requeue

Prefetch (QoS):
  basic.qos(prefetch_count=1): sends only 1 uncompleted message at a time → fair distribution
```

## Kafka Wire Protocol

Kafka is an append-only log, completely different from AMQP's broker-push model:

```
Topic → Partition 0: [offset 0][offset 1]...[offset N]
        Partition 1: [offset 0][offset 1]...[offset N]
        Partition 2: [offset 0][offset 1]...[offset N]

Consumer: tracks offsets itself, pulls (polls) → processes → commits offset

Wire protocol (TCP):
  ApiVersions → Metadata → Fetch → Produce → OffsetCommit
  Binary, length-prefixed frames
```

## NATS

Minimalist text protocol:

```
PUB subject reply-to size\r\npayload\r\n
SUB subject queue-group sid\r\n

JetStream (persistence layer): adds stream/consumer on top of core NATS → Kafka-like features
```

## Comparison

| | AMQP | Kafka | NATS |
|---|---|---|---|
| Model | broker push | consumer pull | pub/sub + JetStream |
| Persistence | default | default | JetStream |
| Throughput | ~50K msg/s | ~1M msg/s | ~1M msg/s |
| Latency | ~1ms | ~5ms | ~0.1ms |

## References

- **AMQP**: rabbitmq.com/resources/specs/amqp0-9-1.pdf
- **Kafka**: kafka.apache.org/protocol
- **NATS**: docs.nats.io/reference/reference-protocols/

*Keywords: AMQP, RabbitMQ, Kafka, partition, consumer group, offset, NATS, JetStream*
