系列
broker的消息存儲做了那些事
????rocketMq的broker消息存儲主要包括3個部分,分別commitLog的存儲,consumeQueue的存儲,index的存儲,這章分享會把這三個過程分解清楚,同時會對里面涉及的存儲位置的偏移量著重講解清楚。
? ? 1、commitLog的存儲是producer發送消息給broker端broker同步處理的
? ? 2、consumeQueue和index兩者存儲其實是一個定時任務從commitLog中獲取偏移量然后存儲過去的
? ? 3、consumeQueue和index的存儲 與 commitLog的存儲是隔離開的,非同步的
broker的消息存儲過程
說明:分享自再說rocketmq消息存儲。
? ? 1、commitLog其實有兩層夠層,其中MappendFileQueue是邏輯的存儲隊列概念,里面保存著順序增長的MappedFile文件。
? ? 2、MappedFile文件是真正存儲實際數據的文件
? ? 3、在整個broker的存儲體系中,MappedFile文件保存了commitLog、consumeQueue、Index等,是核心的數據結構。
broker的消息存儲過程
說明:參見BrokerController類
? ? 1、其中sendProcessor就是broker端接收message的入口函數
說明:參見SendMessageProcessor類
? ? 1、這里我們先看下單個消息的處理過程,也就是sendMessage過程
說明:參見SendMessageProcessor類
? ? 1、putMessage函數開始執行數據的保存
說明:參見DefaultMessageStore類
? ? 1、commitLog.putMessage開始進入commitLog的保存邏輯
說明:參見CommitLog類
????1、先從mappedFileQueue獲取最后一個MappedFile文件,如果為空就創建一個commitLog對應的MappedFile文件,文件命名以實際以文件大小命名,分別是00000000000000000000、00000000001073741824、00000000002147483648,文件名之間差1G=1024*1024*1224B=1073741824。每個commitLog的MappedFile文件大小是1G,剩余多余無非存入新消息就用填充字符填充到1G。
????2、mappedFile.appendMessage執行保存消息到MappedFile的動作
說明:參見MappedFile類
? ? 1、這里我們以單個消息存儲為例繼續說明
說明:參見CommitLog類
? ? 1、做一些前置準備,包括計算下一個存儲位置等
說明:參見CommitLog類
? ? 1、這里有個特別的地方需要注意,就是如果剩余空間無法裝下消息+8個字節的結束標識符,就默認結束了,結束標識符應該用于標識mappedFile是否結束。
說明:參見CommitLog類
? ? 1、這里的消息寫入過程我們分析暫時到寫入緩存就結束了,真正實際上是還會有刷盤的動作的,這里暫時不展開分析,后續單獨開一章刷盤的的分析。
說明:
? ? commitLog的MappedFile文件中保存的數據格式如上圖所示,在末尾不能保存整個消息的時候就會重新生成一個MappedFile文件,當然在末尾應該會有填充結束標識符,文件結束符是以特殊magic_code結束的,為BLANK_MAGIC_CODE=0xBBCCDDEE ^1880681586 +8;
comsumeQueue的存儲過程
說明:參見DefaultMessageStore類
? ? 1、該實現類是一個線程函數,內部通過run操作循環去commitLog去消息位移信息保存到consumeQueue當中
說明:參見DefaultMessageStore類
說明:參見DefaultMessageStore類
? ? 1、this.dispatcherList.addLast(new CommitLogDispatcherBuildConsumeQueue());
? ? ?2、this.dispatcherList.addLast(new CommitLogDispatcherBuildIndex());
說明:參見ConsumeQueue類
? ? 1、ConsumeQueue的消息單元格式如下圖。