Skip to content

这是我学习 AMQP 协议时整理的笔记。接触 RabbitMQ 时经常看到"AMQP 0-9-1"这个说法,一开始只知道 RabbitMQ 是消息队列,没搞懂协议层到底在讲什么。这篇把 AMQP 拆清楚:它是什么、为什么存在、核心模型长什么样,以及它和 RabbitMQ 的关系。


一、一句话理解

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是消息队列领域的"通用语言"——一个开放的、跨厂商的应用层协议。RabbitMQ 是它最著名的实现(RabbitMQ 实现了 AMQP 0-9-1 规范)。

类比一下:HTTP 是 Web 的通用协议(浏览器和服务端都按它说话),AMQP 就是消息队列的 HTTP——生产者和消费者、不同语言的客户端之间,都按同一套协议对话,互操作才成为可能。

二、为什么需要协议

没有协议会怎样?每个消息中间件自己发明一套交互规则(端口、消息格式、确认机制各不相同),就会出现:

  • 换一个消息队列,客户端代码全要重写
  • 不同语言的客户端行为不一致(Java 的确认方式和 Python 的不同)
  • 消息格式不统一,跨系统解析困难

AMQP 把"消息如何定义、如何路由、如何确认"这些规则标准化了。你学会 AMQP 的核心模型,就等于学会了 RabbitMQ 90% 的底层逻辑,以后看其他 AMQP 实现(比如 Apache Qpid)也很快。

补充:broker 是什么

文章里经常出现 broker 这个词,这里先解释一下。

broker(消息代理)就是消息队列系统里的"中间服务器"——生产者和消费者之间的中介:

Producer --发消息--> [Broker:接收/存储/路由/投递] --> Consumer
  • 没有 broker:生产者直接找消费者,双方必须同时在线、互相认识,耦合严重(像打电话)
  • 有 broker:生产者只把消息交给 broker,不用管谁在消费(像寄信给邮局)

broker 带来三个好处

  1. 解耦:生产者不认识消费者,上下游互不影响
  2. 缓冲:消费者处理不过来时,消息先存在 broker 里
  3. 异步:发完消息生产者就能干别的,不用等消费者处理完

RabbitMQ 就是一个 broker(用 Erlang 实现的 AMQP broker);Kafka、ActiveMQ 也都是 broker,只是协议和模型不同。

三、AMQP 核心模型(协议层看消息流转)

RabbitMQ 的六个概念(生产者/消费者/队列/交换机/绑定/路由键)其实就是按 AMQP 模型设计的。AMQP 0-9-1 的核心模型:

Producer --发消息--> Exchange --按 Binding 路由--> Queue --> Consumer
                          (fanout/direct/topic)

协议层面有三个"角色"概念:

角色协议里的职责
Exchange(交换机)接收消息,按类型和绑定规则决定路由
Queue(队列)存储消息,等待消费者拉取
Binding(绑定)声明"某交换机把符合规则的消息发给某队列"

这正好对应 RabbitMQ 里的概念——所以 RabbitMQ 的管理界面里你看到的就是 Exchange/Queue/Binding 这三类对象

四、消息长什么样

AMQP 消息由两部分组成:

  1. 消息属性(Properties):路由键、持久化标志、优先级、过期时间、消息 ID 等"元数据"
  2. 消息体(Body):业务数据本身(字节数组)

比如持久化就是靠属性里的 delivery_mode=2 标志实现的——消息要不要持久化,是协议层的属性决定的,不是 MQ 随便定的。

五、两个重要机制

AMQP 的可靠性和这两个机制强相关:

  1. 发布确认(Publisher Confirm):生产者发消息后,broker 确认收到(confirm),生产者才知道消息真的进队列了——这是"防丢消息"的第一层。
  2. 消费者确认(Consumer Ack):消费者处理完手动 ack,broker 才删消息;不 ack 就重投——这是"防丢消息"的第二层。

我整理的消息队列"防丢/防重/防乱序"问题里,这两条就是核心(见架构设计 FAQ)。

六、AMQP 和 MQTT / HTTP 的区别

协议定位特点典型场景
AMQP消息队列(broker 路由)交换机路由、可靠性强、功能全企业级消息、任务分发
MQTT物联网轻量消息极轻量、低带宽、发布订阅IoT、传感器
HTTP请求-响应同步、无状态Web 接口

AMQP 和 MQTT 都是"消息"协议,但 AMQP 面向"可靠的消息队列 + 复杂路由"(broker 模式),MQTT 面向"低功耗设备间轻量发布订阅"。别混用。

七、AMQP 和 RabbitMQ 的关系

  • AMQP 0-9-1 是规范/协议(只定义了规则)
  • RabbitMQ 是这个规范的一个实现(用 Erlang 写的 broker)
  • 所以:AMQP 是标准,RabbitMQ 是产品。RabbitMQ 的交换机类型、确认机制、消息模型,全部源自 AMQP 0-9-1

小结

  • AMQP = 消息队列的开放协议("消息队列的 HTTP"),解决跨系统互操作
  • 核心模型:Exchange → Binding → Queue(RabbitMQ 的概念全部由此而来)
  • 消息 = 属性(路由键/持久化标志)+ 消息体(业务数据)
  • 可靠性靠 Publisher Confirm + Consumer Ack 两层机制
  • RabbitMQ 是 AMQP 0-9-1 的实现,学 AMQP 就是学 RabbitMQ 的底层

想上手实战可以看《RabbitMQ 快速入门》;想知道这些机制怎么防丢消息,看架构设计 FAQ 里的消息队列问答。