---
title: 消息队列协议
url: https://doc.liz6.com/networking/11-messages-and-events/02-message-queue-protocols
locale: zh
area: networking
tags:
- networking
- 消息与事件
date: 2026-06-30
modified: 2026-06-30
description: AMQP(RabbitMQ)用 exchange/queue/binding 做智能路由,Kafka 让消费者自己跟踪 offset 实现高吞吐,NATS 以极简文本协议追求最低延迟。三者代表消息系统的三种设计哲学:smart broker、dumb broker、minimal broker。
---

# 消息队列协议

> AMQP(RabbitMQ)用 exchange/queue/binding 做智能路由,Kafka 让消费者自己跟踪 offset 实现高吞吐,NATS 以极简文本协议追求最低延迟。三者代表消息系统的三种设计哲学:smart broker、dumb broker、minimal broker。

## 概述

消息队列解耦了生产者和消费者——发送方不等待处理完成，接收方按自身节奏消费。AMQP（2003）以 exchange/queue/binding 模型著称，RabbitMQ 是最流行的实现。Kafka（2011）反转了模型：消费者自己跟踪 offset，broker 不做推送——更适合高吞吐事件流。NATS 以极简文本协议和最低延迟在轻量场景中占优。三者代表了消息系统的三种设计哲学：smart broker、dumb broker、minimal broker。

## AMQP 0-9-1

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

Exchange types:
  direct:   routing key 精确匹配 → queue
  topic:    pattern match (stock.us.*) → 多 queue
  fanout:   广播到所有 bound queue

Ack:
  每条消息被 consumer 处理后 → basic.ack(delivery_tag) → broker 删除
  未 ack 的消息: consumer 断开 → requeue

Prefetch (QoS):
  basic.qos(prefetch_count=1): 每次只发 1 条未完成 → 公平分发
```

## Kafka Wire Protocol

Kafka 是 append-only log, 与 AMQP 的 broker-push 完全不同:

```
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: 自己跟踪 offset, 拉取 (poll) → 处理 → commit offset

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

## NATS

极简文本协议:

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

JetStream (持久化层): 在 core NATS 上加 stream/consumer → Kafka-like 功能
```

## 对比

| | AMQP | Kafka | NATS |
|---|---|---|---|
| 模型 | broker push | consumer pull | pub/sub + JetStream |
| 持久化 | 默认 | 默认 | JetStream |
| 吞吐 | ~50K msg/s | ~1M msg/s | ~1M msg/s |
| 延迟 | ~1ms | ~5ms | ~0.1ms |

## 参考

- **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*
