このページの目次

メッセージキュープロトコル

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 功能

比較

AMQPKafkaNATS
模型broker pushconsumer pullpub/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