圖解RocketMQ訊息傳送和儲存流程

kinnylee發表於2019-06-09

基本概念

整體架構

圖解RocketMQ訊息傳送和儲存流程

  • Producer:生產者
  • Consumer:消費者
  • Broker:負責訊息儲存、投遞、查詢
  • NameServer:路由註冊中心。功能包括:Broker管理、路由資訊管理

模組間資料流轉

圖解RocketMQ訊息傳送和儲存流程

生產-消費模型

圖解RocketMQ訊息傳送和儲存流程

訊息傳送流程

圖解RocketMQ訊息傳送和儲存流程

  • 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(配置檔案設定了特殊標誌)

訊息儲存流程

圖解RocketMQ訊息傳送和儲存流程

  • Broker端收到訊息後,將訊息原始資訊儲存在CommitLog檔案對應的MappedFile中,然後非同步重新整理到磁碟
  • ReputMessageServie執行緒非同步的將CommitLog中MappedFile中的訊息儲存到ConsumerQueue和IndexFile中
  • ConsumerQueue和IndexFile只是原始檔案的索引資訊

訊息體結構

圖解RocketMQ訊息傳送和儲存流程

  • CommitLog的訊息體長度不一樣,每個CommitLog檔案預設1G
  • ConsumerQueue內的訊息體長度固定,為20Byte

記憶體對映流程

圖解RocketMQ訊息傳送和儲存流程

  • 記憶體對映檔案MappedFile通過AllocateMappedFileService建立
  • MappedFile的建立是典型的生產者-消費者模型
  • MappedFileQueue呼叫getLastMappedFile獲取MappedFile時,將請求放入佇列中
  • AllocateMappedFileService執行緒持續監聽佇列,佇列有請求時,建立出MappedFile物件
  • 最後將MappedFile物件預熱,底層呼叫force方法和mlock方法

刷盤流程

圖解RocketMQ訊息傳送和儲存流程

  • producer傳送給broker的訊息儲存在MappedFile中,然後通過刷盤機制同步到磁碟中
  • 刷盤分為同步刷盤和非同步刷盤
  • 非同步刷盤後臺執行緒按一定時間間隔執行
  • 同步刷盤也是生產者-消費者模型。broker儲存訊息到MappedFile後,建立GroupCommitRequest請求放入列表,並阻塞等待。後臺執行緒從列表中獲取請求並重新整理磁碟,成功刷盤後通知等待執行緒。

相關文章