RocketMQ(7)——通信协议
RocketMQ(7)——通信协议
RocketMQ的通信协议其实很简单,但是无论是官方的用户手册,还是网上的博客,并没有很清晰简单地把其中所有的内容和原理讲明白。 对于需要扩展其他语言SDK的开发来说,意味着必须要深入到Java源码才能弄懂其概念。
笔者通过深入源码,本文希望以尽量简短的语言描述清楚协议的每个字段及其意义。注:现最新版RocketMQ已经可以支持Protobuf协议,但本文只探究默认的基于JSON的协议。
无论是发送消息,拉取消息,还是发送心跳等所有的网络通讯层协议(客户端与broker/nameserver间,broker与nameserver间)都使用一套一样的协议。并且无论请求还是响应,协议是一样的,协议头的字段也是固定的。
通讯协议
协议分为以下四部分:
其中后两部分是通讯的实际数据。前两段都是四个字节的整形,分别表示两段实际数据的长度。
- header: 协议的头,数据是序列化后的json。json的每个key字段都是固定的,不同的通讯请求字段不一样。后面解释
- body: 请求的二进制实际数据。例如发送消息的网络请求中,body中传输实际的消息内容。
- length:2 3 4 端整体的长度。四个字节整数。
- header length: header的长度。四个字节整数。