RocketMQ總結之 消息發送和存儲流程


基本概念

參考官方: https://github.com/apache/rocketmq/tree/master/docs/cn

 

 

 整體架構

 

 

  • 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請求放入列表,並阻塞等待。后台線程從列表中獲取請求並刷新磁盤,成功刷盤后通知等待線程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM