tcp前4字节消息长度_RocketMQ的消息存储格式
总体代码
我们可以通过阅读RocketMQ的消息存储代码来了解RocketMQ的消息存储格式,消息的存储入口是DefaultMessageStore,我们可以通过DefaultMessageStore.putMessage方法来查看消息的存储,整个存储过程示例图如下:
- NettyRemotingServer是broker用于处理收发消息请求的入口,是通过netty处理的tcp请求以及rpc过程
- SendMessageProcessor是处理发消息请求的类,发送消息的处理都是由此类完成
- DefaultMessageStore则是消息存取的服务,其中有putMessage和getMessage方法用于处理消息的存储和读取
- CommitLog是对消息存储文件的抽象,消息经过编码后存入CommitLog
- MappedFile是对内存映射文件操作的封装,可以认为就是MappedByteBuffer
- DefaultAppendMessageCallback中处理消息的格式编码,是一个内部类
- GroupCommitLogService实现了将内存中的数据刷盘,分有同步和异步两种方式
- HAService封装了对消息的replication的处理,支持同步和异步两种方式
详细格式
根据前文的描述,想要知道消息存储的编码格式,我们可以进入到DefaultMessageAppendCallback中,阅读一下doAppend方法的逻辑:
其中包含一个msgStoreItemMemory,它是个ByteBuffer,用于存储编码后的消息,消息的编码实际上就是将消息转换成字节的方式,但是这个过程又与对象的二进制序列化不一样,消息中的消息体是对象经过了序列化之后的数据,由生产者发送给了broker,而这里的二进制转换是通过编码的方式实现的,其中不仅需要有消息体的内容,还需要包括很多额外的数据,DefaultAppendMessageCallback的doAppend方法中,我们可以看到具体的消息编码代码:
根据这段代码能够清晰的看到消息编码的过程,我们可以看到每个消息在存储时所需要携带的附加信息,在Java中,int占4字节,long占8字节,char占2字节,由此可以得到RocketMQ的消息在编码后的结构如下图:
- 4字节表示消息的长度,消息的长度是整个消息体所占用的字节数的大小
- 4字节的魔数,是固定值,有MESSAGE_MAGIC_CODE和BLANK_MAGIC_CODE
- 4字节的CRC,是消息体的校验码,用于防止网络、硬件等故障导致数据与发送时不一样带来的问题
- 4字节的queueId,表示消息发到了哪个MessageQueue(逻辑上相当于kakka的partition)
- 4字节的flag,flag是创建Message对象时由生产者通过构造器设定的flag值
- 8字节的queueOffset,表示在queue中的偏移量
- 8字节的physicalPosition,表示在存储文件中的偏移量
- 4字节sysFlag,是生产者相关的信息标识,具体生产逻辑可以看相关代码
- 8字节消息创建时间
- 8字节消息生产者的host
- 8字节消息存储时间
- 8字节消息存储的机器的host
- 4字节表示重复消费次数
- 8字节消息事务相关偏移量
- 4字节表示消息体的长度
- 消息休,不是固定长度,和前面的4字节的消息体长度值相等
- 1字节表示topic的长度,因此topc的长度最多不能超过127个字节,超过的话存储会出错(有前置校验)
- Topic,存储topic,因为topic不是固定长度,所以这里所占的字节是不固定的,和前一个表示topic长度的字节的值相等
- 2字节properties的长度,properties是创建消息时添加到消息中的,因此,添加在消息中的poperties不能太多太大,所有的properties的kv对在拼接成string后,所占的字节数不能超过2^15-1
- Properties的内容,也不是固定长度,和前面的2字节properties长度的值相同
tcp前4字节消息长度_RocketMQ的消息存储格式相关推荐
- tcp前4字节消息长度_网络基础篇之TCP
网络分层 什么是 TCP TCP 是面向连接的.可靠的.基于字节流的传输层通信协议. - 面向连接:通过三次握手建立一对一的连接( UDP 协议 可以一个主机同时向多个主机发送消息,即一对多): - ...
- rocketmq 消息 自定义_RocketMQ的消息发送及消费
RocketMQ消息支持的模式: 消息支持的模式分为三种:NormalProducer(普通同步),消息异步发送,OneWay. 消息同步发送: 普通消息的发送和接收在前面已经演示过了,在前面的案例中 ...
- 消息长度_【消息】听说咱安阳的第一条封闭外环即将全线通车了?是的,长度相当于北京五环...
安阳广播电视报 知你冷暖 懂你生活 安阳十万知本家庭的共同选择 盼望着,盼望着 国道341 已进入通车倒计时! 9月24日,国道341主体工程完工,已具备通车条件.建成后与新东北外环形成环绕市区的封 ...
- rocketmq python消息堆积_RocketMQ消息存储和查询原理
前言 RocketMQ 作为一款优秀的分布式消息中间件,可以为业务方提供高性能低延迟的稳定可靠的消息服务.其核心优势是可靠的消费存储.消息发送的高性能和低延迟.强大的消息堆积能力和消息处理能力. 从存 ...
- TCP/IP总结(4)TCP 之最大消息长度
1. MSS最大消息长度(Maximum Segment Size) TCP在传送大量数据时,是以MSS的大小将数据进行分割发送. . 最理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据 ...
- tcp/ip协议中消息传输对帧消息的操作
2019独角兽企业重金招聘Python工程师标准>>> 接口:Framer.java: package com.tcpip;import java.io.IOException; i ...
- 【Java TCP/IP Socket】应用程序协议中消息的成帧与解析(含代码)
程序间达成的某种包含了信息交换的形式和意义的共识称为协议,用来实现特定应用程序的协议叫做应用程序协议.大部分应用程序协议是根据由字段序列组成的离散信息定义的,其中每个字段中都包含了一段以位序列编码(即 ...
- IP、TCP、UDP数据包长度问题
IP数据包长度问题总结 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或U ...
- 消息长度_nsq消息队列源码分析
nsq的源码比较简单,值得一读,特别是golang开发人员,下面重点介绍nsqd,nsqd是nsq的核心,其他的都是辅助工具,看完这篇文章希望你能对消息队列的原理和实现有一定的了解. nsqd是一个守 ...
最新文章
- java获取mysql表结构
- 不是所有的事情都要达成共识
- python—内置函数-字符串,eval,isinstance
- [css] 如何让大小不同的图片等比缩放不变形显示在固定大小的div里?写个例子
- labview随机数序列_labview产生随机数
- Java笔记-解决Cause: java.sql.SQLException: 试图在只读事务中修改数据(达梦数据库)
- 生产环境究竟是使用mysqldump还是xtrabackup来备份与恢复数据库?
- socket.io php 聊天室,WebSocket学习(一)——基于socket.io实现简单多人聊天室
- 米粒搜---团购信息搜索软件 Android平台
- comsol奶酪模型 comsol多孔材料
- CTF_ctfshow_meng新_web1-web24
- java和mysql实现点餐功能_java+mysql餐馆点餐系统的设计与开发
- android ibeacon service,android – iBeacon后台扫描
- matlab箭头大小固定,科学网—Matlab 粗箭头绘制 - 肖鑫的博文
- Faster R-CNN论文翻译笔记
- 【JD1-100漏电继电器】
- Quartz使用详解!
- VS平台账号注册机--源码--详细文档--分析-原理-实现
- 【Redis系列】Redis布隆过滤之8亿大数据集实战
- 计量经济学笔记2-Eviews操作