AMQP 0-9-1 分层与生产、消费协议流转
RabbitMQ 客户端与 Broker 之间使用 AMQP 0-9-1 :命令在信道(Channel)上收发,底层由帧 在 TCP 上传输。本文从协议分层 理解「业务命令 → 会话 → 传输」,并梳理建连、发消息、消费、确认 阶段的典型方法/命令对应关系(非完整规范抄录)。
目录
- 为什么需要分层
- [AMQP 三层模型](#AMQP 三层模型)
- [帧与消息体:Publish / Deliver 长什么样](#帧与消息体:Publish / Deliver 长什么样)
- [生产者侧:从建连到 Basic.Publish](#生产者侧:从建连到 Basic.Publish)
- [消费者侧:从 Qos 到 Ack](#消费者侧:从 Qos 到 Ack)
- [常用命令与 Java API 对照(摘录)](#常用命令与 Java API 对照(摘录))
- 时序总览(Mermaid)
- [与 RabbitMQ 管理视角的衔接](#与 RabbitMQ 管理视角的衔接)
- 免责声明
为什么需要分层
| 诉求 | 分层带来的好处 |
|---|---|
| 多路复用 | 单条 TCP 上跑多个 Channel,互不混用命令状态 |
| 可靠交互 | 会话层处理同步应答、错误码,业务层只关心「声明队列 / 发布」等语义 |
| 二进制传输 | 传输层统一组帧、长度与错误检测,适配不同语言客户端 |
AMQP 三层模型
| 层次 | 英文 | 职责 |
|---|---|---|
| 模块层 | Module Layer | 命令语义 :Queue.Declare、Basic.Publish、Basic.Consume 等 |
| 会话层 | Session Layer | 请求/响应配对、同步点、错误通知 |
| 传输层 | Transport Layer | 帧(frame) 、channel id、多路复用、心跳等 |
应用代码
Channel.basicPublish / basicConsume ...
Module Layer
AMQP 命令
Session Layer
请求-应答与错误
Transport Layer
帧序列 / TCP
text
┌─────────────────────────────────────┐
│ Module:业务命令(Declare/Publish) │
├─────────────────────────────────────┤
│ Session:Method 与 Content 的配对 │
├─────────────────────────────────────┤
│ Transport:Frame 在 Connection 上交错 │
└─────────────────────────────────────┘
帧与消息体:Publish / Deliver 长什么样
发布与投递类操作除 Method 帧外,通常还带:
| 部分 | 内容 |
|---|---|
| Content Header | 属性:投递模式、content-type、priority、headers 等 |
| Content Body | 一帧或多帧承载的 payload |
因此抓包或调试时,一条「消息」在链路上往往是 Method + Header + Body 的组合。
生产者侧:从建连到 Basic.Publish
- Protocol Header :声明使用 AMQP 0-9-1(版本以协商为准)。
- Connection 启动 :
Connection.Start↔Start-Ok,交换能力与安全机制。 - Connection 调优 :
Tune↔Tune-Ok(如帧大小、channel 数量等上限的协商)。 - Connection.Open ↔
Open-Ok。 - Channel.Open ↔
Open-Ok。 - (可选)
Exchange.Declare、Queue.Declare、Queue.Bind等。 - Basic.Publish + Content Header + Body。
- 关闭:
Channel.Close、Connection.Close及对应-Ok。
Connection.Tune 通俗理解:Broker 与客户端对齐「一条连接上能开多少信道、单帧多大」等约束,避免一方发送过大帧或资源耗尽。
消费者侧:从 Qos 到 Ack
- 建连、Channel.Open 同生产者。
- Basic.Qos ↔
Qos-Ok:设置 prefetch (未确认消息窗口),影响分发速率 与公平性。 - Basic.Consume ↔
Consume-Ok:注册消费;之后 Broker 推送Basic.Deliver(+ Header + Body)。 - 业务处理完后 Basic.Ack ;失败场景可用 Nack / Reject(是否重入队依参数)。
- 关闭 Channel / Connection。
常用命令与 Java API 对照(摘录)
| 场景 | AMQP 命令(节选) | Java 客户端常见入口(示意) |
|---|---|---|
| 建连握手 | Connection.Start...Open-Ok | ConnectionFactory.newConnection() |
| 开信道 | Channel.Open / Open-Ok | connection.createChannel() |
| 发布 | Basic.Publish + Content | channel.basicPublish(...) |
| 消费 | Consume / Deliver / Ack | basicConsume / basicAck |
| 流控窗口 | Basic.Qos / Qos-Ok | basicQos(prefetch) |
| 释放 | Channel.Close、Connection.Close | close() |
时序总览(Mermaid)
Broker Client Broker Client Connection:Start / Tune / Open alt [发布] [消费] Channel.Open Channel.Open-Ok Basic.Publish + Properties + Body Basic.Qos(可选) Basic.Qos-Ok Basic.Consume Basic.Consume-Ok Basic.Deliver + Body Basic.Ack Channel.Close / Connection.Close
与 RabbitMQ 管理视角的衔接
管理界面或 HTTP API 上看到的 connection、channel、publish rate、deliver rate ,与上述命令一一对应:排查未确认堆积 时常同时看 Channel 的 prefetch 、队列深度 与 Broker 侧资源告警、连接级流控是否生效。
免责声明
本文仅为学习用骨架 ;安全机制(SASL 等)、完整方法列表、帧边界 请以 AMQP 0-9-1 规范与 RabbitMQ 当前实现为准。
主题:AMQP、协议分层、Basic.Publish、Basic.Consume、帧。