zoukankan      html  css  js  c++  java
  • rocketMQ 通信协议格式

    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);
        }
    }

  • 相关阅读:
    视频4K技术的解读
    C语言野指针
    获取一个整数所有的质因数(C语言实现)
    乘法口诀表(C语言实现)
    完全平方数(C语言实现)
    Socket网络编程系列教程序
    求1-2/3+3/5-4/7+......49/97和(C语言实现)
    反射
    Cloneable接口和Object的clone()方法
    Comparable和Comparator的区别
  • 原文地址:https://www.cnblogs.com/allenwas3/p/11703459.html
Copyright © 2011-2022 走看看