RocketMQ -- 訊息消費佇列與索引檔案

大軍發表於2022-03-27

在store目錄下,除了commilog目錄,還有consumequeue和index目錄。

consumequeue是訊息消費佇列儲存目錄,比如我們建了一個TopicTest,有四個MessageQueue,那在consumequeue目錄下,就有一個TopicTest目錄,TopicTest目錄下還有0,1,2,3四個目錄,對應著MessageQueue的個數。這些數字的下面的檔案,就是實際上的資料。

前面已經講了訊息都是落在了commitlog日誌檔案中,我們消費的時候,卻是根據topic來的,如果需要一個個的從commitlog日誌檔案中遍歷某一個topic,那這個效率就非常低下了,所以就有了一個ConsumeQueue來記錄每一個topic在commitlog的位置。

另外一個index是訊息索引檔案儲存目錄,通過Hash索引機制為訊息建立索引,RocketMQ會將訊息索引鍵與訊息偏移量對映關係寫入到IndexFile。

既然ConsumeQueue和IndexFile都是關聯著commilog日誌檔案,那我們寫入commitlog日誌檔案的時候,ConsumeQueue和IndexFile是什麼時候寫入的呢?

image.png

broker啟動的時候,還會啟動一個執行緒,叫做ReputMessageService,負責把commitlog日誌的更新事件傳播出去,他記錄commitlog從哪個偏移量開始轉發訊息給ConsumeQueue和IndexFile。

image.png

每隔1ms,這個執行緒就會通過偏移量去commitlog日誌檔案裡看看是否有新的訊息進來,如果有,就會把訊息進行轉發,由於需要寫入ConsumeQueue和IndexFile,所以這裡就有兩個轉發器。

image.png

CommitLogDispatcherBuildConsumeQueue會根據topic以及佇列的ID,獲取對應的ConsumeQueue檔案(可以參考上面的目錄樹),把資料寫入其中。

CommitLogDispatcherBuildIndex則會構建索引鍵,再寫入資料。

image.png

相關文章