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