rocketMq - commitLog
概述
? ? 這篇博文主要是想講清楚rocketMq中commitLog的存儲格式和存儲過程的,在整理文章的過程中發(fā)現(xiàn)有篇來自CSDN的文章的有一張圖片畫的非常完整,就套用過來了,不過在博文的末尾把參考文章的地址列出來了。
commitLog存儲數(shù)據(jù)格式
? ? commtLog的存儲其實是分多層的,commitLog -> mappedFileQueue -> mappedFile,其中真正存儲數(shù)據(jù)的是mappedFile。
? ? commitLog在mappedFile當中存儲消息的格式是【msg + msg + msg + ......+msg+blank】。也就是當最后的位置放不下消息的時候就填充空白。
rocketMq數(shù)據(jù)存儲圖commitLog數(shù)據(jù)存儲過程
????commitLog內(nèi)部的數(shù)據(jù)結(jié)構(gòu),核心的在于MappedFileQueue這個對象,以及每個MappedFile的大小(1G=20124*1024*1024)。
? ? commitLog保存消息的過程如下
? ? ? ? 1、在mappedFileQueue里面選擇最近的mappedFile文件,如果沒有mappedFile文件或者mappedFile數(shù)據(jù)已經(jīng)滿的情況下就新建一個mappedFile文件。
? ? ? ? 2、選擇mappedFile文件之后,開始計算消息體大小并保存至mappedFile文件當中,在整個保存過程中先用臨時的byteBuffer(msgStoreItemMemory)保存,如果mappedFile文件能夠保存下最新的消息體就保存消息至mappedFile文件,否則就保存一個結(jié)束符。
commitLog的數(shù)據(jù)結(jié)構(gòu) mappedFile的大小 獲取MappedFile對象mappedFile文件生成邏輯
? ? mappedFile的文件生成其實有一定的規(guī)則,首先mappedFile文件的命名是以1024*1024*1024=1073741824進行遞增,也就是說第一個文件名字為000000001073741824,第二個名字是以00000000002147483648進行命令,以次遞增。體現(xiàn)在代碼中就是以上一個文件的便宜量加上1073741824即可。
? ? 在創(chuàng)建過程如果文件不存在我們就創(chuàng)建新文件,這里的創(chuàng)建也分兩種類型,一種就是同時創(chuàng)建兩個mappedFile文件,這個創(chuàng)建過程是異步的,在allocateMappedFileService內(nèi)部其實有個線程在不停run執(zhí)行文件創(chuàng)建過程;一種是同步創(chuàng)建文件過程。
? ? 在內(nèi)部還涉及一些預熱之類的邏輯,暫時沒仔細看。
參考
????RocketMQ消息存儲流程圖及數(shù)據(jù)結(jié)構(gòu)圖
總結(jié)
以上是生活随笔為你收集整理的rocketMq - commitLog的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基础-迭代器(Iterator)
- 下一篇: aio 爬虫,去重,入库