- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
RocketMQ的消息存储格式
总体代码
我们可以通过阅读RocketMQ的消息存储代码来了解RocketMQ的消息存储格式,消息的存储⼊⼝是DefaultMessageStore,我们可以通过
DefaultMessageStore.putMessage⽅法来查看消息的存储,整个存储过程⽰例图如下:
image
NettyRemotingServer是broker⽤于处理收发消息请求的⼊⼝,是通过netty处理的tcp请求以及rpc过程
SendMessageProcessor是处理发消息请求的类,发送消息的处理都是由此类完成
DefaultMessageStore则是消息存取的服务,其中有putMessage和getMessage⽅法⽤于处理消息的存储和读取
CommitLog是对消息存储⽂件的抽象,消息经过编码后存⼊CommitLog
MappedFile是对内存映射⽂件操作的封装,可以认为就是MappedByteBuffer
DefaultAppendMessageCallback中处理消息的格式编码,是⼀个内部类
GroupCommitLogService实现了将内存中的数据刷盘,分有同步和异步两种⽅式
HAService封装了对消息的replication的处理,⽀持同步和异步两种⽅式
详细格式
根据前⽂的描述,想要知道消息存储的编码格式,我们可以进⼊到DefaultMessageAppendCallback中,阅读⼀下doAppend⽅法的逻辑:
image
其中包含⼀个msgStoreItemMemory,它是个ByteBuffer,⽤于存储编码后的消息,消息的编码实际上就是将消息转换成字节的⽅式,但是这
个过程⼜与对象的⼆进制序列化不⼀样,消息中的消息体是对象经过了序列化之后的数据,由⽣产者发送给了broker,⽽这⾥的⼆进制转换是通
过编码的⽅式实现的,其中不仅需要有消息体的内容,还需要包括很多额外的数据,DefaultAppendMessageCallback的doAppend⽅法中,
我们可以看到具体的消息编码代码:
image
根据这段代码能够清晰的看到消息编码的过程,我们可以看到每个消息在存储时所需要携带的附加信息,在Java中,int占4字节,long占8字
节,char占2字节,由此可以得到RocketMQ的消息在编码后的结构如下图:
image
4字节表⽰消息的长度,消息的长度是整个消息体所占⽤的字节数的⼤⼩
4字节的魔数,是固定值,有MESSAGE_MAGIC_CODE和BLANK_MAGIC_CODE
4字节的CRC,是消息体的校验码,⽤于防⽌⽹络、硬件等故障导致数据与发送时不⼀样带来的问题
4字节的queueId,表⽰消息发到了哪个Me ageQueue(逻辑上相当于kakka的partition)
4字节的flag,flag是创建Me age对象时由⽣产者通过构造器设定的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长度的值相同
原创力文档


文档评论(0)