总体代码

我们可以通过阅读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的消息存储格式相关推荐

  1. tcp前4字节消息长度_网络基础篇之TCP

    ​网络分层 什么是 TCP TCP 是面向连接的.可靠的.基于字节流的传输层通信协议. - 面向连接:通过三次握手建立一对一的连接( UDP 协议 可以一个主机同时向多个主机发送消息,即一对多): - ...

  2. rocketmq 消息 自定义_RocketMQ的消息发送及消费

    RocketMQ消息支持的模式: 消息支持的模式分为三种:NormalProducer(普通同步),消息异步发送,OneWay. 消息同步发送: 普通消息的发送和接收在前面已经演示过了,在前面的案例中 ...

  3. 消息长度_【消息】听说咱安阳的第一条封闭外环即将全线通车了?是的,长度相当于北京五环...

    安阳广播电视报 知你冷暖  懂你生活 安阳十万知本家庭的共同选择 盼望着,盼望着 国道341 已进入通车倒计时! 9月24日,国道341主体工程完工,已具备通车条件.建成后与新东北外环形成环绕市区的封 ...

  4. rocketmq python消息堆积_RocketMQ消息存储和查询原理

    前言 RocketMQ 作为一款优秀的分布式消息中间件,可以为业务方提供高性能低延迟的稳定可靠的消息服务.其核心优势是可靠的消费存储.消息发送的高性能和低延迟.强大的消息堆积能力和消息处理能力. 从存 ...

  5. TCP/IP总结(4)TCP 之最大消息长度

    1. MSS最大消息长度(Maximum Segment Size) TCP在传送大量数据时,是以MSS的大小将数据进行分割发送. . 最理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据 ...

  6. tcp/ip协议中消息传输对帧消息的操作

    2019独角兽企业重金招聘Python工程师标准>>> 接口:Framer.java: package com.tcpip;import java.io.IOException; i ...

  7. 【Java TCP/IP Socket】应用程序协议中消息的成帧与解析(含代码)

    程序间达成的某种包含了信息交换的形式和意义的共识称为协议,用来实现特定应用程序的协议叫做应用程序协议.大部分应用程序协议是根据由字段序列组成的离散信息定义的,其中每个字段中都包含了一段以位序列编码(即 ...

  8. IP、TCP、UDP数据包长度问题

      IP数据包长度问题总结 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或U ...

  9. 消息长度_nsq消息队列源码分析

    nsq的源码比较简单,值得一读,特别是golang开发人员,下面重点介绍nsqd,nsqd是nsq的核心,其他的都是辅助工具,看完这篇文章希望你能对消息队列的原理和实现有一定的了解. nsqd是一个守 ...

最新文章

  1. java获取mysql表结构
  2. 不是所有的事情都要达成共识
  3. python—内置函数-字符串,eval,isinstance
  4. [css] 如何让大小不同的图片等比缩放不变形显示在固定大小的div里?写个例子
  5. labview随机数序列_labview产生随机数
  6. Java笔记-解决Cause: java.sql.SQLException: 试图在只读事务中修改数据(达梦数据库)
  7. 生产环境究竟是使用mysqldump还是xtrabackup来备份与恢复数据库?
  8. socket.io php 聊天室,WebSocket学习(一)——基于socket.io实现简单多人聊天室
  9. 米粒搜---团购信息搜索软件 Android平台
  10. comsol奶酪模型 comsol多孔材料
  11. CTF_ctfshow_meng新_web1-web24
  12. java和mysql实现点餐功能_java+mysql餐馆点餐系统的设计与开发
  13. android ibeacon service,android – iBeacon后台扫描
  14. matlab箭头大小固定,科学网—Matlab 粗箭头绘制 - 肖鑫的博文
  15. Faster R-CNN论文翻译笔记
  16. 【JD1-100漏电继电器】
  17. Quartz使用详解!
  18. VS平台账号注册机--源码--详细文档--分析-原理-实现
  19. 【Redis系列】Redis布隆过滤之8亿大数据集实战
  20. 计量经济学笔记2-Eviews操作

热门文章

  1. 《Java入门经典(第7版)》—— 6.11 练习
  2. C中的野指针—如何避免
  3. BestCoder Round #80 1002
  4. Magento如何自定义404页面?
  5. js计算两个时间之间天数差的实例代码
  6. Android中解决debug.keystore到期的问题
  7. 一个有价值的 Sharepoint WebPart 页签部件
  8. python3 decode encode 字符串 字节 互转
  9. windows 远程桌面 启动方式
  10. golang range 遍历读写数据问题