このページの目次
メッセージキュープロトコル
AMQP(RabbitMQ)はexchange/queue/bindingによるインテリジェントルーティングを行い、Kafkaはコンシューマーがオフセットを自身で追跡して高スループットを実現し、NATSは極限まで簡素なテキストプロトコルで最低レイテンシを追求します。これら3つはメッセージングシステムの3つの設計哲学を表しています:smart broker、dumb broker、minimal broker。
概要
メッセージキューはプロデューサーとコンシューマーの結合を解消します。送信側は処理の完了を待たず、受信側は自身のペースで消費します。AMQP(2003年)はexchange/queue/bindingモデルで知られており、RabbitMQが最も一般的な実装です。Kafka(2011年)はこのモデルを逆転させ、コンシューマーがオフセットを自身で追跡し、brokerはプッシュを行いません。これは高スループットなイベントストリームにより適しています。NATSは極限まで簡素なテキストプロトコルと最低レイテンシにより、軽量なユースケースで優位性を持っています。これら3つはメッセージングシステムの3つの設計哲学を表しています: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