rocketMq-broker消息存储介绍

简介: broker的消息存储做了那些事    rocketMq的broker消息存储主要包括3个部分,分别commitLog的存储,consumeQueue的存储,index的存储,这章分享会把这三个过程分解清楚,同时会对里面涉及的存储位置的偏移量着重讲解清楚。

broker的消息存储做了那些事

    rocketMq的broker消息存储主要包括3个部分,分别commitLog的存储,consumeQueue的存储,index的存储,这章分享会把这三个过程分解清楚,同时会对里面涉及的存储位置的偏移量着重讲解清楚。

    1、commitLog的存储是producer发送消息给broker端broker同步处理的

    2、consumeQueue和index两者存储其实是一个定时任务从commitLog中获取偏移量然后存储过去的

    3、consumeQueue和index的存储 与 commitLog的存储是隔离开的,非同步的


broker的消息存储过程


img_4bbe359db4b712e255b4175e59c26749.png
消息存储过程

说明:分享自再说rocketmq消息存储

    1、commitLog其实有两层够层,其中MappendFileQueue是逻辑的存储队列概念,里面保存着顺序增长的MappedFile文件。

    2、MappedFile文件是真正存储实际数据的文件

    3、在整个broker的存储体系中,MappedFile文件保存了commitLog、consumeQueue、Index等,是核心的数据结构。


broker的消息存储过程


img_1be29be705ea7f595acb23cbb3fa882d.png
注册消息消费函数

说明:参见BrokerController类

    1、其中sendProcessor就是broker端接收message的入口函数


img_7058e683f1589d36de01e2c8fe03eaa7.png
处理发送消息

说明:参见SendMessageProcessor类

    1、这里我们先看下单个消息的处理过程,也就是sendMessage过程


img_e6cd27da6ab752971c6eeb5e76ba38e8.png
组装消息并开始存储

说明:参见SendMessageProcessor类

    1、putMessage函数开始执行数据的保存


img_7f01bb00a29f4ea1259766a5ab8999e3.png
commitLog消息存储

说明:参见DefaultMessageStore类

    1、commitLog.putMessage开始进入commitLog的保存逻辑


img_4da135daa6575701ce2b190909576056.png
获取mappedFile文件并存储消息

说明:参见CommitLog类

    1、先从mappedFileQueue获取最后一个MappedFile文件,如果为空就创建一个commitLog对应的MappedFile文件,文件命名以实际以文件大小命名,分别是00000000000000000000、00000000001073741824、00000000002147483648,文件名之间差1G=1024*1024*1224B=1073741824。每个commitLog的MappedFile文件大小是1G,剩余多余无非存入新消息就用填充字符填充到1G。

    2、mappedFile.appendMessage执行保存消息到MappedFile的动作


img_30b414f1ff7bc4a2b1e8c4110bdc7bc9.png
通过回调函数来执行message的保存

说明:参见MappedFile类

    1、这里我们以单个消息存储为例继续说明



img_c752ee632f609fa9f0f5a71006f138df.png
计算存储位置及计算consumeQueue偏移

说明:参见CommitLog类

    1、做一些前置准备,包括计算下一个存储位置等



img_f460554004fdb7effde393e01978405b.png
判断剩余空间

说明:参见CommitLog类

    1、这里有个特别的地方需要注意,就是如果剩余空间无法装下消息+8个字节的结束标识符,就默认结束了,结束标识符应该用于标识mappedFile是否结束。


img_5f6fabc3f5c37c02c8ce4c4fd19c5991.png
按照格式写入缓存

说明:参见CommitLog类

    1、这里的消息写入过程我们分析暂时到写入缓存就结束了,真正实际上是还会有刷盘的动作的,这里暂时不展开分析,后续单独开一章刷盘的的分析。


img_7b2a1c6329e4307e9c7a7726bc020f8e.png
消息存储格式

说明:

    commitLog的MappedFile文件中保存的数据格式如上图所示,在末尾不能保存整个消息的时候就会重新生成一个MappedFile文件,当然在末尾应该会有填充结束标识符,文件结束符是以特殊magic_code结束的,为BLANK_MAGIC_CODE=0xBBCCDDEE ^1880681586 +8;


comsumeQueue的存储过程


img_aca704db1d9f9b11495d37543d447e30.png
consumeQueue的保存过程

说明:参见DefaultMessageStore类

    1、该实现类是一个线程函数,内部通过run操作循环去commitLog去消息位移信息保存到consumeQueue当中



img_209fac7f48c7e241f3bf3bc7769910cf.png
循环拉取commitLog消息并生成dispatch消息

说明:参见DefaultMessageStore类



img_42c77ae531a9c598b89cc625de17c684.png
dispatchList保存consumeQueue和index

说明:参见DefaultMessageStore类

    1、this.dispatcherList.addLast(new CommitLogDispatcherBuildConsumeQueue());

     2、this.dispatcherList.addLast(new CommitLogDispatcherBuildIndex());



img_742d5d19e4698d7c606c4fab69d5dd0e.png
consumeQueue保存操作



img_1d8454c609384f5b726629338baa2049.png
consumeQueue保存逻辑

说明:参见ConsumeQueue类

    1、ConsumeQueue的消息单元格式如下图。


img_d82f417382a572ac1baae3823ad3197d.png
ConsumeQueue的消息格式
相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1月前
|
消息中间件 存储 数据库
RocketMQ 流存储解析:面向流场景的关键特性与典型案例
RocketMQ 流存储解析:面向流场景的关键特性与典型案例
88358 0
|
1月前
|
存储 消息中间件 缓存
RocketMQ 5.0 分级存储背后技术优化包含那几个方面
RocketMQ 5.0 分级存储背后的技术优化是一个综合性的系统工程,需要考虑多个方面,包括存储介质的选择、数据读写策略的设计、数据压缩和解压缩技术的引入、自动的数据分级和迁移机制的实现,以及高可用性和容错性的保证等。这些技术优化的目的是为了实现存储成本和性能的最优平衡,提高系统的可靠性和可用性,满足大规模数据处理的需求。
104 1
|
1月前
|
消息中间件 存储 运维
|
1月前
|
消息中间件 存储 数据库
深度剖析 RocketMQ 5.0,流存储:流场景的诉求是什么?
本文将从使用的角度出发,来更详细的展示一下流存储的场景,看看它和业务消息的场景有哪些区别。 RocketMQ 5.0 面向流存储的场景,提供了哪些特性。再结合两个数据集成的案例,来帮助大家了解流存储的用法。
3348 2
|
1月前
|
存储 消息中间件 负载均衡
RocketMQ 5.0 分级存储背后的技术优化与挑战
RocketMQ 5.0 分级存储背后的技术优化与挑战
|
1月前
|
存储 消息中间件 Apache
谈谈 RocketMQ 5.0 分级存储背后一些有挑战的技术优化
谈谈 RocketMQ 5.0 分级存储背后一些有挑战的技术优化
|
2月前
|
存储 消息中间件 对象存储
谈谈 RocketMQ 5.0 分级存储背后一些有挑战的技术优化
谈谈 RocketMQ 5.0 分级存储背后一些有挑战的技术优化
132200 231
|
3月前
|
消息中间件 存储 Java
RocketMQ-初体验RocketMQ(06)-使用API操作RocketMQ ,理解RocketMQ的存储结构
RocketMQ-初体验RocketMQ(06)-使用API操作RocketMQ ,理解RocketMQ的存储结构
175 0
|
4月前
|
消息中间件 存储 NoSQL
SpringBoot项目整合Redis,Rabbitmq发送、消费、存储邮件
SpringBoot项目整合Redis,Rabbitmq发送、消费、存储邮件
569 2
|
6月前
|
存储 消息中间件 Java
3分钟白话RocketMQ系列—— 如何存储消息
3分钟白话RocketMQ系列—— 如何存储消息
166 0