天天看點

初品RocketMQ 存儲結構

作者:甯靜知行者
初品RocketMQ 存儲結構

CommitLog

commitLog 是RocketMQ 消息主體與中繼資料的存儲主體,通過上面的圖可以知道,producer 發送寫入的消息主體都是存儲于此,但消息的内容不是定長的。單個CommitLog的檔案大小預設是為1G,檔案名以目前檔案記錄的檔案起始的偏移量,檔案名長度為20位,如果不足,則左邊補0

ComsumeQueue

CommitLog 存儲的資料是在目前這個broker中的所有的topic的資料,這個檔案是共享的,當comsume 要去消費資料時,如果從commitLog中去周遊對比,性能上會出現很大的問題。出于這個性能的考慮,增加了ComsumeQueue的設計, 該結構隻記錄具體某個topic下的資料,同時為了支援并發消費,一個topic下可以有多個ComsumeQueue,而這裡記錄的結構如下:

初品RocketMQ 存儲結構

記錄了: commitLog的偏移量,消息體大小,Tag hash值

ComsumeQueue作為消費索引,它記錄了指定topic的隊列消息在CommitLog中的位置,當Comsumer進行消費時,隻需要從這個檔案中擷取相應的偏移量,就可以從 commitLog 中擷取消息的中繼資料。

同時這裡也記錄了對應的tag hashcode的值,當有指定tag 消費時,可以先從這裡過濾掉一部分資料,如果存儲 hashCode沖突的資料,則由消費端進行值的比對進行去除。

檔案目錄: /store/consumequeue/{topic}/{queueId}/{fileName}

IndexFile

該檔案是為了提供可以通過key或是時間範圍的查詢方式

檔案目錄: /store/index/{fileName}, 檔案fileName 是以建立時的時間戳命名的,結構如下

初品RocketMQ 存儲結構

indexHeader

  1. beginTimestamp: 目前檔案記錄的最開始時間
  2. endTimeStamp 記錄目前檔案記錄的最後一個的時間
  3. beginPhyOffset 記錄目前最開始的commitLog的偏移量
  4. endPhyOffset 記錄目前最後一個的commitLog的偏移量
  5. hash slots count 記錄目前 slot的個數,最大預設為500W
  6. index count 記錄目前索引的數量,最大預設為2000W

Slots 與 indexes

可以将它了解為Java的HashMap結構

Slot 記錄的是 HashMap Key的槽索引

Indexes 記錄是每個槽裡的資料,因為 Slot是通過 hash算法來定位索引,有可能會存在hash 沖突,是以在indexes 結構中會有一個4位元組的字段,進行記錄下一個索引的數值

indexes 裡記錄了 key的hash值,在commitLog中的偏移量,與 beginTimestamp的內插補點,下一個索引的值

繼續閱讀