rocketMq理论与实践

rocketMq - commitLog

2018-04-24  本文已影响152人  晴天哥_王志

概述

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

commitLog存储数据格式

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

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

rocketMq数据存储图


commitLog数据存储过程

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

    commitLog保存消息的过程如下

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

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

commitLog的数据结构 mappedFile的大小 获取MappedFile对象 获取writeBuffer并开始写入 前置计算消息大小等操作 存在消息体的过程

mappedFile文件生成逻辑

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

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

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

参考

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

上一篇下一篇

猜你喜欢

热点阅读