RocketMQ 的消息传输协议是什么?

RocketMQ 使用了一套自定义的二进制协议来传输消息和控制信息。这套协议包含两层:

  1. 传输层:使用 Netty NIO 框架实现,负责网络连接,数据读写和编解码。
  2. 应用层:RocketMQ 自定义的协议,用于消息和控制命令传输。

RocketMQ 消息传输协议的主要特征:

  1. 基于长度字段的消息体,每条消息都有一个 4 字节的消息长度字段,以及真实消息体。
  2. 消息ID唯一,消息体按页传输,每页默认4K。
  3. 采用异步确认机制,消费端需向服务器端返回 ACK,确认消息已消费,否则服务器端重发。
  4. 支持批量消息,多个消息体可以合并在一次传输中,每条消息仍然有自己的长度字段。
  5. 支持压缩,消息体超过一定大小(默认1K)会启用压缩。
  6. 支持双向通信,消费端和服务器端都可以主动发起请求。
  7. 采用自定义的控制命令协议,用于消费组管理,主题管理等。
  8. 支持定时报警和推送,服务器可以定期推送topic状态等。

具体的消息结构为:

Message Length(4 bytes)   消息总长度
Magic Code(4 bytes)       魔法数字,0xCAFEBABE
Body CRC(4 bytes)         消息体CRC校验
Queue ID(4 bytes)          消息队列ID
Flag(4 bytes)              消息标志
Properties Length         属性长度
Properties                消息属性
Body                     消息体

所以,理解 RocketMQ 的消息传输协议,对分析 RocketMQ 源码和排查问题有很大帮助。RocketMQ 基于此协议实现了高效、可靠的消息中间件。