RocketMQ -- 寫在訊息拉取前

大軍發表於2022-04-04

消費者消費的時候,需要指定去消費哪個Topic的訊息,比如TopicTest。

和生產者一樣,消費者也需要去NameServer拉取TopicTest對應的後設資料資訊。

image.png

如上圖所示,TopicTest對應這兩個broker,每個broker都有兩個MessageQueue,那消費者從哪裡拉取資料呢?

比如我們有兩個消費者,消費者在啟動的時候,會向每個broker傳送心跳包,這樣每一個broker都有消費者的資訊,我們也可以從任意一個broker獲取所有消費者的資訊。

既然有了後設資料資訊,還有消費者的資訊,那就可以通過分配演算法,知道當前這個消費者去哪個MessageQueue拉取資料。

目前RocketMQ預設提供6種分配演算法,包括平均分配(AllocateMessageQueueAveragely)、平均輪詢分配(AllocateMessageQueueAveragelyByCircle)、一致性hash(AllocateMessageQueueConsistentHash)、根據配置(AllocateMessageQueueByConfig)、根據Broker部署機房名(AllocateMessageQueueByMachineRoom)、就近機房模式(AllocateMachineRoomNearby)。

預設是平均分配,比如有4個MessageQueue,那兩個消費者各2個。消費者1分配的是MessageQueue0和MessageQueue1,消費者2分配MessageQueue2和MessageQueue3。

如果是平均輪詢分配,那消費者1分配1個,消費者2分配1個,消費者1再分配一個,消費者2再分配一個,最終消費者1分配的是MessageQueue0和MessageQueue2,消費者2分配MessageQueue1和MessageQueue3。

我們接著平均分配進行往下說,以消費者1為例。

image.png

此時已經知道消費者從MessageQueue0和MessageQueue1來消費,那從哪裡開始消費呢?

消費的模式又分為從佇列最新偏移量開始消費(CONSUME_FROM_LAST_OFFSET)、從頭開始消費(CONSUME_FROM_FIRST_OFFSET)、從消費者啟動的時間戳對應的消費進度開始消費(CONSUME_FROM_TIMESTAMP)。

根據以上的資訊,我們就可以整合一個請求資訊PullRequest,包括消費組、偏移量、MessageQueue、ProcessQueue(這個後面來解釋),存放在pullRequestQueue連結串列裡。

image.png

相關文章