本页目录
消息队列协议
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