Skip to content

RobustMQ AMQP 协议支持

本文列出 RobustMQ 作为 AMQP Broker 对 AMQP 0-9-1 协议各 Class/Method 的实际支持状态。状态分三档:

  • 完整支持:协议语义正确实现。
  • 🟡 部分支持:协议握手/接口可用,但功能上是简化实现或存在已知限制,见备注。
  • 不支持:方法本身返回错误或不做真实语义。

参考文档:

逐项的原因与影响见 兼容性与限制


协议基础

AMQP 0-9-1 基于 TCP,采用帧(Frame)传输。每帧由类型、通道号、长度、payload 和帧结束符(0xCE)组成。

  • 连接相关 img

  • 生产消费相关

img

  • broker 内部逻辑 img

帧类型

帧类型编号说明
Method Frame1控制命令(所有 Class/Method)
Content Header Frame2消息属性(content-type、delivery-mode、headers 等)
Content Body Frame3消息体 payload(可分片)
Heartbeat Frame8心跳保活

消息发布和投递均由 Method + Content Header + Content Body 三帧组合完成。


一、Connection 类

Class.Method编号方向说明状态
connection.start10.10S→CBroker 发起握手,告知支持的 SASL 机制和 locale
connection.start-ok10.11C→S客户端选择 SASL 机制并发送认证响应✅ 仅 PLAIN
connection.secure10.20S→CBroker 发送 SASL challenge(多轮认证)🟡 未使用(PLAIN 不需要)
connection.secure-ok10.21C→S客户端响应 SASL challenge🟡 纯 ack 桩
connection.tune10.30S→CBroker 提议 channel-max、frame-max、heartbeat 参数
connection.tune-ok10.31C→S客户端确认连接参数✅ 服务端会取客户端协商值与自身提议值的较小者
connection.open10.40C→S客户端打开 virtual host(映射为租户)
connection.open-ok10.41S→CBroker 确认 vhost 连接成功
connection.close10.50双向任一方发起关闭连接(携带错误码)
connection.close-ok10.51双向确认关闭
connection.blocked10.60S→C连接级流控告警🟡 未使用(不做主动限流)
connection.unblocked10.61S→C解除流控告警🟡 未使用
connection.update-secret10.70C→S更新已建立连接的认证凭据🟡 纯 ack 桩,不做真实凭据轮换
connection.update-secret-ok10.71S→C确认更新🟡

二、Channel 类

Class.Method编号方向说明状态
channel.open20.10C→S客户端开启一个 channel
channel.open-ok20.11S→CBroker 确认 channel 开启
channel.flow20.20双向暂停或恢复消息流(背压控制)🟡 仅对本节点的推送生效,见 兼容性与限制
channel.flow-ok20.21双向确认 flow 命令
channel.close20.40双向关闭 channel(携带错误码)
channel.close-ok20.41双向确认关闭

三、Exchange 类

Exchange 是消息路由的核心,支持 directfanouttopicheaders 四种类型。

Class.Method编号方向说明状态
exchange.declare40.10C→S创建或验证 exchange(type/passive/durable/no-wait)✅ 含 passive 语义(不存在返回 404)
exchange.declare-ok40.11S→C确认创建
exchange.delete40.20C→S删除 exchange(if-unused 选项)
exchange.delete-ok40.21S→C确认删除
exchange.bind40.30C→SExchange-to-Exchange 绑定(RabbitMQ 扩展)✅ 支持链式路由,对循环绑定有保护
exchange.bind-ok40.31S→C确认绑定
exchange.unbind40.40C→S解除 Exchange-to-Exchange 绑定
exchange.unbind-ok40.51S→C确认解绑

四、Queue 类

Class.Method编号方向说明状态
queue.declare50.10C→S创建或验证队列(passive/durable/exclusive/auto-delete)✅ 含 passive 语义
queue.declare-ok50.11S→C确认创建,返回队列名、消息数、消费者数✅ 真实统计值(基于当前存储位点与共享消费组成员数)
queue.bind50.20C→S绑定队列到 exchange(指定 routing-key)
queue.bind-ok50.21S→C确认绑定
queue.unbind50.50C→S解除队列与 exchange 的绑定
queue.unbind-ok50.51S→C确认解绑
queue.purge50.30C→S清空队列中所有消息
queue.purge-ok50.31S→C确认清空,返回清除消息数
queue.delete50.40C→S删除队列(if-unused / if-empty 选项)
queue.delete-ok50.41S→C确认删除,返回删除消息数

五、Basic 类

Basic 类是 AMQP 0-9-1 的核心,包含消息发布、投递、确认的全部逻辑。

5.1 消费者管理

Class.Method编号方向说明状态
basic.qos60.10C→S设置预取(prefetch-size、prefetch-count、global)🟡 消费者与队列 leader 同节点时强制生效,跨节点为尽力而为;prefetch-size 不生效
basic.qos-ok60.11S→C确认 QoS 设置
basic.consume60.20C→S注册消费者,开启 push 模式消费(no-local/no-ack/exclusive)exclusive 已强制;no-local 不生效(与 RabbitMQ 经典队列一致)
basic.consume-ok60.21S→C返回 consumer-tag✅ 客户端留空时由 Broker 生成
basic.cancel60.30C→S取消消费者
basic.cancel-ok60.31S→C确认取消

5.2 消息发布

Class.Method编号方向说明状态
basic.publish60.40C→S发布消息(指定 exchange、routing-key、mandatory、immediate),后跟 Content Header + Body 帧immediate 已废弃标志,不做特殊处理(与现代 RabbitMQ 一致)
basic.return60.50S→C退回无法路由的消息(mandatory 标志触发)

5.3 消息投递

Class.Method编号方向说明状态
basic.deliver60.60S→CBroker 推送消息给消费者(push 模式),后跟 Content Header + Body 帧
basic.get60.70C→S同步拉取一条消息(pull 模式)✅ 跨节点自动转发到队列 leader
basic.get-ok60.71S→C返回消息,后跟 Content Header + Body 帧
basic.get-empty60.72S→C队列为空时的响应

5.4 消息确认

Class.Method编号方向说明状态
basic.ack60.80C→S确认消息已处理(支持 multiple 批量 ack)
basic.reject60.90C→S拒绝消息(requeue=true 重新入队,false 丢弃)
basic.recover-async60.100C→S要求 Broker 重新投递所有未 ack 的消息(不等待确认)
basic.recover60.110C→S要求 Broker 重新投递所有未 ack 的消息
basic.recover-ok60.111S→C确认 recover
basic.nack60.120C→S批量拒绝消息(RabbitMQ 扩展)

六、Tx 类(未实现真实语义)

Class.Method编号方向说明状态
tx.select90.10C→S开启事务模式🟡 仅握手,回复 select-ok
tx.select-ok90.11S→C确认事务模式开启🟡
tx.commit90.20C→S提交事务(publish + ack 原子生效)🟡 仅回复 commit-ok,不做真实原子提交
tx.commit-ok90.21S→C确认提交🟡
tx.rollback90.30C→S回滚事务🟡 仅回复 rollback-ok,不做真实回滚
tx.rollback-ok90.31S→C确认回滚🟡

使用 Tx.Select 之后,publish 和 ack 依然是立即生效的,不会被缓冲到 commit 才可见,也不支持 rollback 撤销。需要可靠发布语义的场景请使用 Publisher Confirm


七、Confirm 类(Publisher Confirm,RabbitMQ 扩展)

Class.Method编号方向说明状态
confirm.select85.10C→S开启 Publisher Confirm 模式
confirm.select-ok85.11S→C确认开启

开启后,该 channel 上每条 basic.publish 都会在消息落盘后收到匹配的 basic.ack(成功)或 basic.nack(失败),详见 Publisher Confirm


Broker 核心业务逻辑

AMQP 0-9-1 中约一半的 method 是 *-ok 的确认回包,Broker 直接构造返回即可。真正承载业务逻辑的是以下方面:

核心能力涉及 Method状态
认证connection.start / start-ok✅ SASL PLAIN
路由exchange.declare + queue.bind + basic.publish✅ direct/fanout/topic/headers + exchange 链式绑定
共享队列 / Push 投递basic.consume + basic.deliver✅ 基于共享消费组 leader 推送,见 共享队列组
消息确认basic.ack / reject / nack / recover✅ 驱动消息状态变更(unacked → acked / requeued)
可靠发布confirm.select + basic.ack/nack✅ 见 Publisher Confirm
预取流控basic.qos🟡 本节点强制,跨节点尽力而为
事务tx.select / commit / rollback🟡 仅握手,无真实语义

延伸阅读

🎉 既然都登录了 GitHub,不如顺手给我们点个 Star 吧!⭐ 你的支持是我们最大的动力 🚀