rocketMQ 通信协议格式
2024-09-05 18:25:55
rocketMQ 使用 netty 通信,端对端的通信,为了避免粘包、分包,需要指定发送数据的边界。
使用的解码器是 LengthFieldBasedFrameDecoder
// org.apache.rocketmq.remoting.protocol.RemotingCommand#encode
public ByteBuffer encode() {
// 1> header length size
int length = 4; // 2> header data length
byte[] headerData = this.headerEncode();
length += headerData.length; // 3> body data length
if (this.body != null) {
length += body.length;
} ByteBuffer result = ByteBuffer.allocate(4 + length); // length
result.putInt(length); // header length
result.put(markProtocolType(headerData.length, serializeTypeCurrentRPC)); // header data
result.put(headerData); // body data;
if (this.body != null) {
result.put(this.body);
} result.flip(); return result;
}
从中可以看出数据的格式:4, 4, headerData, bodyData
4 字节存储数据的总长度
4 字节存储头的长度和元数据
headerData 存储头数据
bodyData 存储内容
RocketMQ 使用的解码器:
public class NettyDecoder extends LengthFieldBasedFrameDecoder {
private static final InternalLogger log = InternalLoggerFactory.getLogger(RemotingHelper.ROCKETMQ_REMOTING); private static final int FRAME_MAX_LENGTH =
Integer.parseInt(System.getProperty("com.rocketmq.remoting.frameMaxLength", "16777216")); public NettyDecoder() {
super(FRAME_MAX_LENGTH, 0, 4, 0, 4);
}
}
最新文章
- java基本数据类型
- MongoDB replica set IDs do not match
- Sql Server系列:Transact-SQL变量
- CSS3打造3D效果——perspective transform的深度剖析
- Vector Calculus
- NRF51822之GPIOTE介绍
- [Android实例] Scroll原理-附ScrollView源码分析
- Oracle 中 根据值 查询 所在 表和字段
- 手写PE文件(二)
- codeigniter框架扩展核心类---实现前台后台视图的分离
- c#语音
- java基础之数组常用操作
- git一键部署代码到远程服务器(linux)(采坑总结)
- Diverse Garland CodeForces - 1108D (贪心+暴力枚举)
- Tools - UML
- GraphQL入门3(Mutation)
- docker端口映射,批量删除容器
- TZOJ 数据结构期末历年题目
- HDU 1301Jungle Roads(最小生成树 prim,输入比较特殊)
- python基础之内置异常对象