RocketMQ系列(五):消息存儲

都存什么

  • commitLog文件
  • consumeQueue文件
  • indexFile文件
  • 報錯文件等等

存在哪

存在每個broker的磁盤中

commitLog文件

是什么藐翎?

消息真正存儲的地方柬批。消息發(fā)送到broker的時候。先存儲到commitLog飞崖,broker存儲到commitLog后就通知producer消息發(fā)送成功了。commitLog到consmeQueue是broker的分發(fā)策略去做的谨胞。

存儲結構

存在 rocketmq/store/commitlog文件夾中固歪。
以offset為文件名,存儲message胯努。
每個文件默認都是1G牢裳。一個文件寫滿后术瓮,創(chuàng)建另外一個文件,以該文件的第一個message的偏移量命名贰健。文件名20位胞四,不夠補0。


存儲結構.png

因為伶椿。message的大泄嘉啊(長度)是固定的,所以可以通過offset快速找到文件脊另,再通過長度快速找到這條消息导狡。這里和數(shù)組很像,存數(shù)組頭的地址信息偎痛,后面尋址旱捧,直接用數(shù)組頭+偏移量直接就能找到。

commitLog不是永久落盤的踩麦。默認存活時間是72小時枚赡,超過72小時,就標記為失效文件谓谦,默認每天凌晨4點清除失效文件贫橙。

是直接落盤么

肯定不是啊。中間有一層buffer(NIO內(nèi)存映射問文件)


內(nèi)存映射文件.png

MapperFileQueue相當于commitlog這個文件夾
MapperFile相當于commitlog文件夾下的每個文件

消息發(fā)送到后反粥,先存在這個內(nèi)存變量中卢肃,根據(jù)刷磁盤策略,往磁盤中刷數(shù)據(jù)才顿。也就是刷臟頁莫湘。
刷臟頁策略:

  • 同步:寫入buffer,馬上刷臟頁郑气,然后再返回producer消息發(fā)送成功幅垮。這樣,能防止發(fā)送階段消息不丟失竣贪。
  • 異步:寫入buffer军洼,就返回producer消息發(fā)送成功。然后根據(jù)broker的刷臟頁策略來刷臟頁演怎。

異步刷臟頁策略

rocketMq有兩個參數(shù)去控制

vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30
vm.dirty_writeback_centisecs = 500

vm.dirty_background_ratio = 10
當臟頁數(shù)量達到系統(tǒng)內(nèi)存10%時就會觸發(fā)pdflush/flush/kdmflush等后臺進程匕争,將一部分緩存的臟頁異步的刷進磁盤。
vm.dirty_ratio = 30
當臟頁數(shù)量達到系統(tǒng)內(nèi)存30%時爷耀,系統(tǒng)開始同步的將臟頁刷入磁盤甘桑,同時會阻塞其他進程的寫操作。

10/30是系統(tǒng)默認值,可以自己根據(jù)業(yè)務情況設置跑杭。

寫的過程是什么

因為存在一個地方(commitLog)铆帽,所以消息必須要順序寫。每次寫請求進入后德谅,先拿寫鎖爹橱,阻塞順序寫。

consumeQueue文件

是什么

這個是真正的mq的隊列窄做。里面不存具體的消息愧驱,而是存消息的指針。這個指針指向commitlog中該消息的位置椭盏。
這樣做的好處是:
1组砚、擴展性好。消息的真是數(shù)據(jù)存在一個地方掏颊,不會根據(jù)queue的變動而變動糟红。
2、查詢速度快乌叶。

存儲結構

存儲結構.png

第一層是topic盆偿。
第二層是topic下queue隊列id。
第三層是隊列下的消息文件枉昏。

單個ConsumerQueue文件中默認包含30萬個條目陈肛,單個文件的長度為30W * 20字節(jié)。


ConsumerQueue文件.png

commitlog在向consumerQueue轉發(fā)的時候兄裂,會根據(jù)producer中的send策略,判斷轉發(fā)到哪個隊列中阳藻。
策略包括:輪訓晰奖、隨機、key hash腥泥。

怎么查找

consumeQueue可以理解為寫隊列匾南。
針對于查找還會有一個讀隊列processQueue。
每個消費者group蛔外,都會有隔離的一組隊列蛆楞,通過processQueue做到的每個group的隔離。
消費者根據(jù) offset和tag拉consumerQueue的數(shù)據(jù) 到 processQueue夹厌,最終消費的是processQueue豹爹。processQueue是每個組隔離的。

indexFile索引文件

是什么

是commitLog的索引文件矛纹。與queue隊列無關臂聋。單純的commitLog以key為索引的索引文件。


indexFile索引文件.png

slot table存的是key的hash值。也就是后面index的索引孩等。有hash沖突怎么辦艾君,這里就不是鏈表法了,用的是二次hash來解決hash沖突肄方。
index linked list: 存的是具體的索引冰垄。

index linked list: 存的是具體的索引。


具體索引.png

key hash: message key的hash值
phyOffset: message在commitlog的物理文件地址权她,可以直接查詢到該消息(存儲的核心機制)
timeDiff:message的落盤時間與header里的beginTimestamp的差值(為了節(jié)省存儲空間虹茶,如果直接存message的落盤時間就得8bytes)
prevIndex: hash沖突處理的關鍵之處,相同hash值上一個消息索引的index(如果當前消息索引是該hash值的第一個索引伴奥,則prevIndex=0, 也是消息索引查找時的停止條件写烤。)

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拾徙,隨后出現(xiàn)的幾起案子洲炊,更是在濱河造成了極大的恐慌,老刑警劉巖尼啡,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暂衡,死亡現(xiàn)場離奇詭異,居然都是意外死亡崖瞭,警方通過查閱死者的電腦和手機狂巢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來书聚,“玉大人唧领,你說我怎么就攤上這事〈菩” “怎么了斩个?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驯杜。 經(jīng)常有香客問我受啥,道長,這世上最難降的妖魔是什么鸽心? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任滚局,我火速辦了婚禮,結果婚禮上顽频,老公的妹妹穿的比我還像新娘藤肢。我一直安慰自己,他們只是感情好冲九,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布谤草。 她就那樣靜靜地躺著跟束,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丑孩。 梳的紋絲不亂的頭發(fā)上冀宴,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音温学,去河邊找鬼略贮。 笑死,一個胖子當著我的面吹牛仗岖,可吹牛的內(nèi)容都是我干的逃延。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼轧拄,長吁一口氣:“原來是場噩夢啊……” “哼揽祥!你這毒婦竟也來了?” 一聲冷哼從身側響起檩电,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拄丰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后俐末,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體料按,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡舟舒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年诅福,在試婚紗的時候發(fā)現(xiàn)自己被綠了稚瘾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片征椒。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狱掂,靈堂內(nèi)的尸體忽然破棺而出劲弦,到底是詐尸還是另有隱情能真,我是刑警寧澤旅急,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布馁筐,位于F島的核電站,受9級特大地震影響坠非,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜果正,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一炎码、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秋泳,春花似錦潦闲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辖众。三九已至,卻和暖如春和敬,著一層夾襖步出監(jiān)牢的瞬間凹炸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工昼弟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啤它,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓舱痘,卻偏偏與公主長得像变骡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芭逝,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348