AMQP 协议与消息模型
AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是 RabbitMQ 支持的底层协议,RabbitMQ 实现的版本是 AMQP 0-9-1。理解了协议规定的"角色"与"模型",就理解了 RabbitMQ 的全部概念。
协议中的三种角色
AMQP 把参与者分成三类。普通消息系统只有"生产、消费"两头,AMQP 在中间多设计了一级交换机,这是它路由灵活的根源:
| 角色 | 英文 | 职责 |
|---|---|---|
| 生产者 | Producer | 发布消息,只跟交换机打交道,不直接接触队列 |
| 消息代理 | Broker | 就是 RabbitMQ 服务端:负责接收、路由、存储消息 |
| 消费者 | Consumer | 从队列取消息处理,可推模式(push)也可拉模式(pull) |
核心消息模型
从生产到消费,一条消息在 Broker 内部的完整链路(文字版):
生产者 Producer
│ ① publish:发出消息,携带 routing key(路由键)
▼
虚拟主机 Virtual Host(隔离空间,见下文)
▼
交换机 Exchange
│ ② 拿 routing key 与各"绑定"逐一比对
▼
绑定 Binding ──────► 队列 Queue1、Queue2(比中的每个队列都进一份)
│ ③ 投递给队列上的消费者
▼
消费者 Consumer(处理完返回 ack 确认)
队列不会直接收到消息:消息总是先进交换机,再由交换机按绑定关系投进零个、一个或多个队列;一条都匹配不上就丢弃(配了死信则进死信队列,见第 16 章)。
虚拟主机 Virtual Host
Virtual Host(vhost)是 Broker 内部的"命名空间":一个 RabbitMQ 实例可建多个 vhost,各自拥有独立的交换机、队列和权限,互相不可见。多项目共用一台 RabbitMQ 时按 vhost 隔离最省事,默认自带一个名为 / 的 vhost。
消息的结构
一条 AMQP 消息 = 属性(Properties)+ 正文(Body),路由判断只看属性、不看正文:
Message
├── Properties 属性
│ ├── delivery_mode 投递模式:1 瞬态 / 2 持久(须配合 durable 队列才落盘)
│ ├── headers 自定义键值表(headers 交换机靠它路由)
│ ├── expiration 消息过期时间 TTL(毫秒)
│ ├── content_type / content_encoding 正文类型与编码
│ └── correlation_id / reply_to RPC 请求应答用
└── Body 正文(任意字节,RabbitMQ 不关心内容格式)
信道 Channel:一条连接上的多路复用
客户端先与 Broker 建立 TCP 连接(Connection),连接上再开多个逻辑信道 Channel。声明队列、发布、消费都在 Channel 上进行:
Connection(1 条 TCP 连接,保持长连)
├── Channel 1:发送订单消息
├── Channel 2:接收处理结果
└── Channel 3:声明队列与交换机
多信道共用一条 TCP 省去了反复握手的开销,一个连接开几十个 Channel 是常见做法;某个 Channel 出错关闭也不影响其他 Channel 和整条连接。
协议版本说明
上面整套模型描述的是 AMQP 0-9-1,即 RabbitMQ 长期使用的核心协议版本:路由职责完全在服务端,客户端只需按规则发布与消费。在此之上,RabbitMQ 还能通过插件兼容 MQTT、STOMP 等协议,但内部模型仍是同一套交换机 + 队列体系。
小结
AMQP 模型一句话:生产者把带 routing key 的消息交给交换机,交换机按绑定规则投进匹配的队列,消费者取走。记住 vhost 隔离、消息属性、Channel 复用三个细节,后面所有章节都是这套模型的展开。