RocketMQ的消息存储格式.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

文库垃圾佬 + 关注
实名认证
文档贡献者

这个人很懒

1亿VIP精品文档

相关文档