圖解RocketMQ消息發送和存儲流程
基本概念
總體架構
- Producer:生產者
- Consumer:消費者
- Broker:負責消息存儲、投遞、查詢
- NameServer:路由註冊中心。功能包括:Broker管理、路由信息管理
模塊間數據流轉
生產-消費模型
消息發送流程
- Broker啓動時,向NameServer註冊信息
- 客戶端調用producer發送消息時,會先從NameServer獲取該topic的路由信息。消息頭code爲GET_ROUTEINFO_BY_TOPIC
- 從NameServer返回的路由信息,包括topic包含的隊列列表和broker列表
- Producer端根據查詢策略,選出其中一個隊列,用於後續存儲消息
- 每條消息會生成一個惟一id,添加到消息的屬性中。屬性的key爲UNIQ_KEY
- 對消息作一些特殊處理,好比:超過4M會對消息進行壓縮
- producer向Broker發送rpc請求,將消息保存到broker端。消息頭的code爲SEND_MESSAGE或SEND_MESSAGE_V2(配置文件設置了特殊標誌)
消息存儲流程
- Broker端收到消息後,將消息原始信息保存在CommitLog文件對應的MappedFile中,而後異步刷新到磁盤
- ReputMessageServie線程異步的將CommitLog中MappedFile中的消息保存到ConsumerQueue和IndexFile中
- ConsumerQueue和IndexFile只是原始文件的索引信息
消息體結構
- CommitLog的消息體長度不同,每一個CommitLog文件默認1G
- ConsumerQueue內的消息體長度固定,爲20Byte
內存映射流程
- 內存映射文件MappedFile經過AllocateMappedFileService建立
- MappedFile的建立是典型的生產者-消費者模型
- MappedFileQueue調用getLastMappedFile獲取MappedFile時,將請求放入隊列中
- AllocateMappedFileService線程持續監聽隊列,隊列有請求時,建立出MappedFile對象
- 最後將MappedFile對象預熱,底層調用force方法和mlock方法
刷盤流程
- producer發送給broker的消息保存在MappedFile中,而後經過刷盤機制同步到磁盤中
- 刷盤分爲同步刷盤和異步刷盤
- 異步刷盤後臺線程按必定時間間隔執行
- 同步刷盤也是生產者-消費者模型。broker保存消息到MappedFile後,建立GroupCommitRequest請求放入列表,並阻塞等待。後臺線程從列表中獲取請求並刷新磁盤,成功刷盤後通知等待線程。
歡迎關注本站公眾號,獲取更多信息