1. 程式人生 > 其它 >RocketMQ學習:工作原理

RocketMQ學習:工作原理

訊息生產過程

  • Producer傳送訊息之前,會先向NameServer發出獲取訊息Topic的路由資訊的請求
  • NameServer返回該Topic的路由表及Broker列表

路由表:實際上是一個Map,Key為Topic名稱,value是一個QueueData例項列表。QueueData並不是一個Queue對應一個QueueData,而是一個Broker中該Topic的所有Queue對應一個QueueData。即只要涉及該Topic的Broker,一個Broker對應一個QueueData。簡單來說,路由表的key為Topic名稱,value為所有涉及該Topic的BrokerName列表
Broker列表:其實際也是一個Map。key為brokerName, value為BrokerData。一套brokerName名稱相同的Master-Slave小叢集對應一個 BrokerData, BrokerData中包含brokerName及一個map。該map的key為brokerld, value為該broker 對應的地址。

  • Producer根據程式碼中指定的Queue選擇策略,從Queue列表中選出一個佇列,用於後續儲存訊息
  • Producer對訊息做一些特殊處理,例如,訊息本身超過4M,則會對其進行壓縮
  • Producer向選擇出的Queue所在的Broker發出RPC請求,將訊息傳送到選擇出的Queue

Queue選擇演算法

對於無序訊息,其Queue選擇演算法,也稱為訊息投遞演算法,常見的有兩種:

輪詢演算法:預設選擇演算法。該演算法保證了每個Queue中可以均勻獲取到訊息
(該演算法存在一個問題:由於某些原因,在某些Broker上的Queue可能投遞延遲較嚴重。從而導致Producer的快取佇列中出現較大的訊息積壓,影響訊息的投遞效能。)

最小投遞延遲演算法:該演算法會統計每次訊息投遞的時間延遲,然後根據統計出的結果將訊息投遞到時間延遲最小的Queue,如果延遲相同,則採用輪詢演算法投遞。(該演算法也存在一個問題:訊息在Queue上的分配不均勻。投遞延遲小的Queue其可能會存在大量的訊息。而對該Queue的消費者會增大,降低訊息的消費能力,可能會導致MQ中訊息的堆積。)

Store目錄

  • abort:該檔案在Broker啟動後會自動建立,正常關閉Broker,該檔案會自動消失。若在沒有啟動Broker的情況下,發現這個檔案是存在的,則說明之前Broker的關閉是非正常關閉。

  • checkpoint:其中儲存著commitlog, consumequeue, index檔案的最後刷盤時間戳

  • commitlog:其中存放著commitlog檔案,而訊息是寫在commitlog檔案中的

  • config:存放著Broker執行期間的一些配置資料

  • consumequeue:其中存放著consumequeue檔案,佇列就存放在這個目錄中

  • index:其中存放著訊息索引檔案indexFile

  • lock:執行期間使用到的全域性資源鎖

commitlog檔案

commitlog目錄中存放著很多的mappedFile檔案,當前Broker中的所有訊息都是落盤到這些mappedFile檔案中的, mappedFile檔案大小為 (小於等於1G),檔名由20位十進位制數構成,表示當前檔案的第一條訊息的起始位移偏移量。

需要注意的是,一個Broker中僅包含一個commitlog目錄,所有的mappedFile檔案都是存放在該目錄中的。即無論當前Broker中存放著多少Topic的訊息,這些訊息都是被順序寫入到了mappedFile檔案中的。也就是說,這些訊息在Broker中存放時並沒有被按照Topic進行分類存放。檔案是順序讀寫的檔案,所以其訪問效率很高。

訊息單元


mappedFile檔案內容由一個個的訊息單元構成。每個訊息單元中包含訊息總長度MsgLen、訊息的物理位置physicalOffset、訊息體內容Body、訊息體長度BodyLength,訊息主題Topic, Topic長度TopicLength、訊息生產者BornHost、訊息傳送時間戳BornTimestamp、訊息所在的佇列Queueld,訊息在Queue中儲存的偏移量QueueOffset等近20餘項訊息相關屬性。

consumequeue

為了提高效率,會為每個Topic在/store/consumequeue中建立一個目錄,目錄名為Topic名稱。在該Topic目錄下,會再為每個該Topic的Queue建立一個目錄, 目錄名為queueld,每個目錄中存放著若干consumequeue檔案, consumequeue檔案是commitlog的索引檔案,可以根據consumequeue定位到具體的訊息。

consumequeue檔名也由20位數字構成,表示當前檔案的第一個索引條目的起始位移偏移量。與mappedFile檔名不同的是,其後續檔名是固定的。因為consumequeue檔案大小是固定不變的。

索引條目

每個consumequeue檔案可以包含30w個索引條目,每個索引條目包含了三個訊息重要屬性:訊息在mappedFile檔案中的偏移量CommitLog Offset、訊息長度、訊息Tag的hashcode值。這三個屬性佔20個位元組,所以每個檔案的大小是固定的30w * 20位元組。

一個consumequeue 檔案中所有訊息的Topic一定是相同的。但每條訊息的Tag可能是不同的。