总体的编码结构
rocketmq符合以下经典的字段长度的编码方案:
L1,4字节大端存储,用来表示其余部分的总大小;
L2,4字节大端存储,低三字节表示报头的大小,最重要的字节来表示报头如何序列化: 0代表 JSON,1代表自定义的格式;
Header为当前请求定义各种信息,下面将列举和详细说明。
主体是可选的二进制载体。
Header
一个 RocketMQ 请求头有两部分: 基础与额外的部分.基础部分包含字段有code
,flag
,language
,opaque
,serializeTypeCurrentRPC
,version
,remark
和extFields
.
额外字段的内容根据代码而变化,以满足每个请求的不同要求。
RoktMQ目前支持两种用于请求头的序列化方法:JSON和RocketMQ定义的自定义协议。
JSON格式的报头遵循以下结构:
{
"code":10,
"extFields":{
"topic":"Topic_sample",
"flag":"4", "bornTimestamp":"1534853535790", "queueId":"1",
"batch":"false",
"unitMode":"false",
"sysFlag":"6", "producerGroup":"ProducerGroup_sample"
},
"flag":2,
"language":"JAVA",
"opaque":0,
"serializeTypeCurrentRPC":"JSON",
"remark": "Sample remark",
"version":0
}
续图显示了自定义报头序列化的结构。
Code
RocketMQ通过代码定义了各种类型的请求和响应。由于社区需要新的特性,可以添加更多的内容。目前定义如下:
请求代码:
- 10 用于当 MQ producer 要向 brokers 发消息时
- 11 用于当 MQ consumer 要从 brokers 收消息时
- 12 此代码用于MQ客户端,作为生产者、消费者或管理工具,尝试查询来自经纪人的消息。在额外字段中指定所有必要的信息,例如topic名称、消息的key等
- 13 已过时
- 14 用于查询每个consumer group、topic和队列ID的消费的偏移量
- 15 用于更新每个consumer group、topic和队列ID的消费的偏移量
- 17 主要被当做管理工具用作创建或更改新的topic,指定topic的配置
- 21 用于向brokers查询所有的topic和它们的配置
- 25 用于更新broker的配置
- 28 用于获取代理运行时信息,包括broker版本、磁盘容量、系统负载等
- 29 用于查询每个topic的偏移量,以便生成后续的时间戳,消息将等于或大于规定的时间戳
- 30 获取topic/队列偏移量的最大值
- 31 获取topic/队列偏移量的最小值
- 32 获取仍然有效的消息的存储时间戳
- 33 通过指定的消息ID获取消息
- 34 客户端使用此code向brokers/name server发送心跳,brokers也使用此code发送心跳到name server,以确保存活
- 35 客户端使用此code从brokers中注销,这是正常退出过程的一部分
- 36 当consumer客户端无法处理消息时,他们使用此code将这些消息发送回brokers,以便将来将这些消息重新发送给consumers
- 37 producer客户端使用此code来完成正在进行的事务性消息
- 38 consumer客户端使用此code来查询每个consumer group的存活成员
- 39 当一个存在事务的消息在很长一段时间内未解决时,brokers使用此code来查询替代producers以调用决策:回滚或提交
- 40 当broker得知一个consumer宕机时,它会通知其他工作的consumers尽快重新平衡
- 41 当消费有序消息时,consumers需要在重新平衡时锁定队列重新平衡时负责和解锁.consumer客户端使用此code发送请求brokers锁定指定的队列
- 42 与code 41相似,用来解锁队列
- 43 此code主要是管理工具来使用,获取所有的消费的偏移量
- 45 此code用来获取延迟topic的偏移量
- 100 客户端使用此code在指定的命名空间下将键值对放到name server
- 101 客户端使用此code从指定命名空间中的name server检索键值对
- 102 从指定的命名空间下的name server中删除键值对
- 105 从name server获取topic路由信息.客户端将使用响应路由信息来确定哪些brokers具有此topic以及如何连接到这些brokers
- 106 获取群集信息:响应应包含每个工作broker的简要信息
- 200 管理客户端通常使用此code来创建新的consumer group或更新现有的consumer group以更改属性
- 201 从broker查询所有已知的consumer group配置。
- 202 查询topic相关的统计信息
- 203 查询所有在线的consumers的连接
- 204 查询所有在线的producers的连接
- 205 擦除broker的写权限
- 206 从给定的name server查询所有topic
- 208 查询由broker记录的所有队列的消耗统计信息
- 215 从broker中删除topic并删除本topic下的数据。
- 216 从name server中移除topic的配置
- 220 告诉consumer通过broker重置当前的偏移量
- 221 获取consumer客户端记录的当前状态,此代码将很快被弃用
- 222 要求broker从consumer客户端按给定的时间戳重置偏移量
- 223 从broker获取当前consumer的状态
- 224 通过集群名称从broker获取所有topic的列表
- 300 从broker通过topic查询所有consumer group的列表
- 303 通过远程的broker查询consumer的时间跨度记录
- 304 从name server查询系统topic列表
- 305 从broker查询系统topic列表
- 306 告诉broker通过管理工具清除过期的consumer队列
- 307 从broker查询当前客户端的运行信息
- 308 从broker查询校正偏移量
- 309 由broker直接从msgid获取消息
- 315 从broker查询所有统计信息,如总消息计数、Recv消息计数、平均UPS等
- 316 从broker中清除未使用的topic包含有关此topic的所有信息/消息
- 317 查询此broker的所有的consumers状态
- 318 更新name server上保存的属性
- 319 查询name server当前的属性
- 320 当RocketMQ producer使用批处理模式发送消息时使用此code
- 321 查询当前consumer group使用的broker中保存的所有consumer队列
- 322 查询当前的server版本
响应代码
- 10 如果brokers经历磁盘刷新超时,则此code将在发送消息时返回。
- 11 主brokers返回此code以指示所发送的消息没有复制到从brokers,因为它们目前不可用.producers可以根据特定的应用标准将消息发送解释为成功或失败
- 12 主brokers返回此code以指示发送的消息被复制到从时超时
- 13 此code当消息不合法时,由producer返回
- 14 当发送消息时而brokers不在线时,返回此code
- 15 此code被废弃
- 16 当没有权限发送或拉取消息时,返回此code
- 17 当发送或拉取消息而topic在brokers中不存在时,返回此code
- 19 内部响应代码,当在broker中没找到相应的消息时由pull api返回
- 20 见19
- 21 见19
- 22 如果查询请求接受时但在brokers/name server中未找到目标,返回此代码
- 23 内部响应代码,当无法解析订阅信息时返回此代码
- 24 内部响应代码,当brokers不存在订阅信息时返回此代码
- 25 内部响应代码,如果当前订阅与brokers中的最新版本不匹配时返回此代码
- 26 当发送或拉取消息而brokers中不存在此consumer group时,返回此code
- 206 consumer不在线时查询它的状态,返回此code
- 207 管理工具拉取消息超时时,返回此code
- 208 当在管理工具中使用查询命令没有找到消息时,将返回此代码
Body
主体部分是可选的二进制数据块,其长度可以由L1-L2-4来计算