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

  • 相关阅读:
    16 把第 i 个结点从链表中删除
    15 在特定结点前插入新的元素
    14 求链表的表长
    13 返回特定数据域的结点个数
    12 按号定位
    11 按值定位
    11 头插入法创建链表)
    09 尾插入法创建单链表(实现2)
    08 尾插入法创建单链表(实现1)
    centos6.5 安装gcc 4.9.0
  • 原文地址:https://www.cnblogs.com/allenwas3/p/11703459.html
Copyright © 2011-2022 走看看