RocketMQ(八)——消息的存儲(chǔ)

RocketMQ中的消息存儲(chǔ)在本地文件系統(tǒng)中晴股,這些相關(guān)文件默認(rèn)在當(dāng)前用戶主目錄下的store目錄中。

image.png
  • abort:該文件在Broker啟動(dòng)后會(huì)自動(dòng)創(chuàng)建肺魁,正常關(guān)閉Broker队魏,該文件會(huì)自動(dòng)消失。若在沒有啟動(dòng)Broker的情況下,發(fā)現(xiàn)這個(gè)文件是存在的胡桨,則說明之前Broker的關(guān)閉時(shí)非正常關(guān)閉
  • checkpoint:其中存儲(chǔ)著commitlog官帘、consumequeue、index文件的最后刷盤時(shí)間戳
  • commitlog:存放commitlog文件昧谊,而消息是寫在commitlog文件中的
  • config:存放著Broker運(yùn)行期間的一些配置數(shù)據(jù)
  • consumequeue:存放consumequeue文件刽虹,隊(duì)列存放在這個(gè)目錄
  • index:存放著消息索引文件indexFile
  • lock:運(yùn)行期間使用到的全局資源鎖

1.commitlog文件

說明:在很多資料中commitlog目錄中的文件簡(jiǎn)單就稱為commitlog文件。但在源碼中呢诬,該文件被命名為mappedFile涌哲。

目錄與文件
commitlog目錄中存放著很多的mappedFile文件,當(dāng)前Broker中的所有消息都落盤到這些mappedFile文件中尚镰。mappedFile文件大小為1G阀圾。文件名由20位十進(jìn)制數(shù)構(gòu)成,表示當(dāng)前文件的第一天消息的起始位置偏移量狗唉。

第一個(gè)文件名一定是20位的0初烘。因?yàn)榈谝粋€(gè)文件的第一條消息的偏移量commitlog offset為0
當(dāng)?shù)谝粋€(gè)文件放滿時(shí),則會(huì)自動(dòng)生成第二個(gè)文件繼續(xù)存放消息分俯。加入第一個(gè)文件大小是1073741820字節(jié)肾筐,則第二個(gè)文件名就是 00000000001073741824 。
以此類推缸剪,第n個(gè)文件名應(yīng)該是n-1個(gè)文件大小之和吗铐。
一個(gè)Broker中所有mappedFile文件的commitlog offset是連續(xù)的

需要注意的是,一個(gè)Broker中僅包含一個(gè)commitlog目錄杏节,所有的mappedFile文件都是存放在該目錄中的唬渗。即無論當(dāng)前Broker中存放著多少Topic的消息,這些消息都是被順序?qū)懭氲搅薽appedFile文件中的奋渔。也就是說镊逝,這些消息在Broker中存放時(shí)并沒有被按照Topic進(jìn)行分類存放。

mappedFile文件時(shí)順序讀寫的文件卒稳,所以其訪問效率很高

消息單元

image.png

mappedFile文件內(nèi)容由一個(gè)個(gè)的消息單元構(gòu)成。每個(gè)消息單元包含消息總長(zhǎng)度MsgLen他巨、消息的物理位置physicalOffset充坑、消息內(nèi)容Body、消息體長(zhǎng)度BodyLength染突、消息主題Topic捻爷、Topic長(zhǎng)度TopicLength、消息生產(chǎn)者BornHost份企、消息發(fā)送時(shí)間戳BornTimestamp也榄、消息所在的隊(duì)列QueueId、消息在Queue中存儲(chǔ)的偏移量QueueOffset等近20個(gè)相關(guān)屬性。

2.consumequeue

image.png

目錄與文件
為了提高效率甜紫,會(huì)為每個(gè)Topic在~/store/consumequqeue中創(chuàng)建一個(gè)目錄降宅,目錄名稱為Topic名稱。在該Topic目錄下囚霸,會(huì)再為每個(gè)該Topic的Queue建立一個(gè)目錄腰根,目錄名為queueId。每個(gè)目錄中存放著若干consumequeue文件拓型,consumequeue文件是commitlog的索引文件额嘿,可以根據(jù)consumequeue定位到具體的消息。

consumequeue文件名也是由20位數(shù)字構(gòu)成劣挫,表示當(dāng)前文件的第一個(gè)索引條目的起始位移偏移量册养。與mappedFiel文件名不同的是,其后續(xù)文件名是固定的压固。因?yàn)閏onsumequeue文件大小是固定不變的球拦。

索引條目

image.png

每個(gè)consumequeue文件可以包含30W個(gè)索引條目,每個(gè)索引條目包含了三個(gè)消息的重要屬性:消息在mappedFile文件中的偏移量CommitLog Offset邓夕、消息長(zhǎng)度刘莹、消息Tag的hashcode值。這三個(gè)屬性占20個(gè)字節(jié)焚刚,所以每個(gè)文件打大小是固定的30W * 20字節(jié)点弯。

一個(gè)consumequeue文件中所有的消息Topic一定是相同的。但每條消息的Tag可能是不同的

3.對(duì)文件的讀寫

image.png

消息寫入
一條消息進(jìn)入到Broker后經(jīng)歷了以下幾個(gè)過程才最終被持久化矿咕。

  • Broker根據(jù)queueId抢肛,獲取到該消息對(duì)應(yīng)索引條目要在consumequeue目錄中的寫入偏移量,即QueueOffset碳柱。
  • 將queueId捡絮、queueOffset等數(shù)據(jù),與消息一起封裝為消息單元
  • 將消息單元寫入到commitlog
  • 同時(shí)莲镣,形成消息索引條目
  • 將消息索引條目分發(fā)到相應(yīng)的consumequeue

消息拉取

  • 當(dāng)Consumer來拉取消息時(shí)會(huì)經(jīng)歷以下幾個(gè)步驟:
    consumer獲取到消費(fèi)消息所在Queue的消費(fèi)偏移量offset福稳,計(jì)算出其要消費(fèi)消息的offset

offset即消費(fèi)進(jìn)度,consumer對(duì)某個(gè)Queue的消費(fèi)offset瑞侮,即消費(fèi)到了該Queue的第幾條消息

  • Consumer向Broker發(fā)送拉取請(qǐng)求的圆,其中會(huì)包含其他要拉取消息的Queue、消息offset及消息Tag半火。
  • Broker計(jì)算在consumerqueue中的queueOffset
  • 從該queueOffset處開始向后查找第一個(gè)指定Tag的索引條目越妈。
  • 解析該索引條目的前8個(gè)字節(jié),即可定位到該消息在commitlog中的commitlog offset
  • 從對(duì)應(yīng)commitlog offset中讀取消息單元钮糖,并發(fā)送給Consumer

性能提升
RocketMQ中梅掠,無論是消息本身還是消息索引,都是存儲(chǔ)在磁盤上的。系統(tǒng)通過一系列的機(jī)制大大提升了性能阎抒。
首先酪我,RocketMQ對(duì)文件的讀寫操作是通過mmap零拷貝進(jìn)行的,將對(duì)文件的操作轉(zhuǎn)化為直接對(duì)內(nèi)存地址進(jìn)行操作挠蛉,從而極大地提高了文件的讀寫效率祭示。
其次,consumequeue中的數(shù)據(jù)是順序存放的谴古,還引入了PageCache的 預(yù)讀取機(jī)制质涛,使得對(duì)consumequeue文件得讀取幾乎接近于內(nèi)存讀取,即使在有消息堆積得情況下也不會(huì)影響性能掰担。

mmap 通過內(nèi)存映射汇陆,將文件映射到內(nèi)核緩沖區(qū),同時(shí)带饱,用戶空間可以共享內(nèi)核空間的數(shù)據(jù)毡代。這樣,在進(jìn)行網(wǎng)絡(luò)傳輸時(shí)勺疼,就可以減少內(nèi)核空間到用戶空間的拷貝次數(shù)教寂。

PageCache機(jī)制,頁緩存機(jī)制执庐,是OS對(duì)文件得緩存機(jī)制酪耕,用于加速對(duì)文件得讀寫操作。一般來說轨淌,程序?qū)ξ募M(jìn)行順序讀寫的速度幾乎接近于內(nèi)存讀寫速度迂烁,主要原因是由于OS使用PageCache機(jī)制對(duì)讀寫訪問操作進(jìn)行性能優(yōu)化,將一部分的內(nèi)存用作PageCache递鹉。

4.與Kafka的對(duì)比

Rocket的很多思想來源于Kafka盟步,其中commitlog與consumequeue就是。

RocketMQ中的commitlog目錄與consumequeue的結(jié)合就類似于Kafka中的partition分區(qū)目錄躏结。mappedFile文件就類似與Kafka中的segment段却盘。

Kafka中的Topic的消息被分割為一個(gè)或多個(gè)partition。partition是一個(gè)物理概念媳拴,對(duì)應(yīng)到系統(tǒng)上就是topic目錄下的一個(gè)或多個(gè)目錄黄橘。每個(gè)partition中包含的文件稱為segment,是具體存放消息的文件禀挫。
Kafka中消息存放的目錄結(jié)構(gòu)是:topic目錄下有partition目錄旬陡,partition目錄下有segment文件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拓颓,一起剝皮案震驚了整個(gè)濱河市语婴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖砰左,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匿醒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缠导,警方通過查閱死者的電腦和手機(jī)廉羔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僻造,“玉大人憋他,你說我怎么就攤上這事∷柘鳎” “怎么了竹挡?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)立膛。 經(jīng)常有香客問我揪罕,道長(zhǎng),這世上最難降的妖魔是什么宝泵? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任好啰,我火速辦了婚禮,結(jié)果婚禮上儿奶,老公的妹妹穿的比我還像新娘框往。我一直安慰自己,他們只是感情好廓握,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布搅窿。 她就那樣靜靜地躺著,像睡著了一般隙券。 火紅的嫁衣襯著肌膚如雪男应。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天娱仔,我揣著相機(jī)與錄音沐飘,去河邊找鬼。 笑死牲迫,一個(gè)胖子當(dāng)著我的面吹牛耐朴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盹憎,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼筛峭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了陪每?” 一聲冷哼從身側(cè)響起影晓,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤镰吵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后挂签,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疤祭,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年饵婆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勺馆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侨核,死狀恐怖草穆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搓译,我是刑警寧澤续挟,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站侥衬,受9級(jí)特大地震影響诗祸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜轴总,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一直颅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怀樟,春花似錦功偿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虑灰,卻和暖如春吨瞎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背穆咐。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工颤诀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人对湃。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓崖叫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親拍柒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子心傀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容