rocketMq - commitLog

系列

rocketMq概念介绍

rocketMq-namesrv介绍

rocketMq-Topic创建过程

rocketMq-producer介绍

rocketMq-consumer介绍

rocketMq - rebalance介绍

rocketMq - 并发消费过程

rocketMq - 串行消费过程

rocketMq-broker介绍

rocketMq-broker消息存储介绍

rocketMq - commitLog

rocketMq - index介绍

rocketMq-延迟消息介绍

rocketMq-事务消息介绍

rocketMq消息查询

rocketMq和kafka的架构区别

rocketMq - master/slave同步


概述

    这篇博文主要是想讲清楚rocketMq中commitLog的存储格式和存储过程的,在整理文章的过程中发现有篇来自CSDN的文章的有一张图片画的非常完整,就套用过来了,不过在博文的末尾把参考文章的地址列出来了。


commitLog存储数据格式

    commtLog的存储其实是分多层的,commitLog -> mappedFileQueue -> mappedFile,其中真正存储数据的是mappedFile。

    commitLog在mappedFile当中存储消息的格式是【msg + msg + msg + ......+msg+blank】。也就是当最后的位置放不下消息的时候就填充空白。

rocketMq - commitLog_第1张图片
rocketMq数据存储图


commitLog数据存储过程

    commitLog内部的数据结构,核心的在于MappedFileQueue这个对象,以及每个MappedFile的大小(1G=20124*1024*1024)。

    commitLog保存消息的过程如下

        1、在mappedFileQueue里面选择最近的mappedFile文件,如果没有mappedFile文件或者mappedFile数据已经满的情况下就新建一个mappedFile文件。

        2、选择mappedFile文件之后,开始计算消息体大小并保存至mappedFile文件当中,在整个保存过程中先用临时的byteBuffer(msgStoreItemMemory)保存,如果mappedFile文件能够保存下最新的消息体就保存消息至mappedFile文件,否则就保存一个结束符。

rocketMq - commitLog_第2张图片
commitLog的数据结构
rocketMq - commitLog_第3张图片
mappedFile的大小
rocketMq - commitLog_第4张图片
获取MappedFile对象


rocketMq - commitLog_第5张图片
获取writeBuffer并开始写入


rocketMq - commitLog_第6张图片
前置计算消息大小等操作
rocketMq - commitLog_第7张图片
存在消息体的过程


mappedFile文件生成逻辑

    mappedFile的文件生成其实有一定的规则,首先mappedFile文件的命名是以1024*1024*1024=1073741824进行递增,也就是说第一个文件名字为000000001073741824,第二个名字是以00000000002147483648进行命令,以次递增。体现在代码中就是以上一个文件的便宜量加上1073741824即可。

    在创建过程如果文件不存在我们就创建新文件,这里的创建也分两种类型,一种就是同时创建两个mappedFile文件,这个创建过程是异步的,在allocateMappedFileService内部其实有个线程在不停run执行文件创建过程;一种是同步创建文件过程。

    在内部还涉及一些预热之类的逻辑,暂时没仔细看。

rocketMq - commitLog_第8张图片

参考

    RocketMQ消息存储流程图及数据结构图

你可能感兴趣的:(rocketMq - commitLog)