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

  • 相关阅读:
    java——注解Annotation
    java——maven
    sklearn——回归评估指标
    java——单例模式
    java——极简handler机制
    java——为什么要有接口?和抽象类有什么不一样?
    java——cmd命令编译带包名的源程序
    [loj 2478][luogu P4843]「九省联考 2018」林克卡特树
    「线性基」学习小结
    FOI 冬令营 Day6
  • 原文地址:https://www.cnblogs.com/allenwas3/p/11703459.html
Copyright © 2011-2022 走看看