RocketMQ源码分析(三)之Remoting模块(二)

本文深入分析RocketMQ的RemotingCommand模块,包括消息头格式、编码解码过程以及批量消息处理。RemotingCommand是自定义的协议格式,其中code表示命令码,language指定调用语言,version是版本号,opaque作为请求标识,flag用于标记请求响应状态,remark和extFields提供额外信息。批量消息处理时,多个消息体被封装进MessageBatch,保持与单条消息处理流程一致。
摘要由CSDN通过智能技术生成

版本声明

  1. 基于rocketmq-all-4.3.1版本

RemotingCommand

  1. RocketMQ自定义的协议格式

    4字节 4字节 n字节 m字节
    总长度(大端字节) 序列化类型(1个字节)+消息头长度(3个字节) 消息头数据 消息体数据
  2. 消息头格式

    大小 2Byte 1Byte 2Byte 4Byte 4Byte 4Byte 4Byte
    类型 int byte int int int String HashMap<String,String>
    字段 code language version opaque flag remark extFields
  3. 消息头格式详解

    • code: 请求命令码(ReqeustCode)或响应命令码(ResponseCode)
    • language: 调用语言实现. 对应LanguageCode枚举。
    • version: 请求或响应的版本号, 对应RemotingCommand.version
    • opaque: 请求发起方在同一连接上不同的请求标识代码,多线程连接复用使用.响应直接返回
    • flag: 通信层标志, 比如标识是否为请求(偶数)还是响应(奇数),单向(2的倍数+2)还是双向
    • remark: 请求的自定义文本信息或响应的错误描述信息
    • extFields: 请求或响应自定义字段

编码和解码

  1. 消息的编码和解码分别在RemotingCommand类的encodedecode方法中完成,数据在网络中传输是按照字节流的方式传输,所以需要把数据编码为字节。encode方法将RemotingCommand转换为ByteBuffer

    public ByteBuffer encode() {
         
        // 1> header length size
        int length = 4; //消息头长度4字节
    
        // 2> header data length  消息头数据长度
        byte[] headerData = this.headerEncode();
        length += headerData.length;
    
        // 3> body data length 消息体数据长度
        if (this.body != null) {
         
            length <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值