本页目录

消息队列协议

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

对比

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