????????????????
【11來了】文章導讀地址:點擊查看文章導讀!
????????????????
Consumer 端隊列負載均衡分配機制
topic 是有一堆的 queue,而且分布在不同的 broker 上
并且在消費時,將多個 queue 分配給多個 consumer,每一個 consumer 會分配到一部分的 queue 進行消費
每個 consumer 會獲取到 Topic 下包含的 queue 的信息
以及 每個 consumer group 下包含多少的 consumer
,那么 consumer 都使用相同的算法去做一次分配
- Topic 下包含的 queue 的信息可以在 Broker 中獲取
- 每個 consumer group 下包含多少了 consumer 的信息也可以在 Broker 獲取,因為每個 consumer 啟動后,都會將 Broker 中進行注冊
Consumer 分配隊列:
Consumer 端隊列的分配是通過 RebalanceService
這個組件實現(xiàn)的,拉取 Topic 的 queue 信息,拉取 consumer group 信息,根據(jù)算法分配 queue,確認自己需要拉取哪些 queue 的消息
RebalanceService
這個組件是在 Broker 中的,主要負責實現(xiàn)消息隊列的動態(tài)負載均衡和自動分配,確保消息隊列在消費者組內(nèi)均勻分配,并在消費者組發(fā)生變化時進行動態(tài)調(diào)整,通過動態(tài)負載均衡和自動分配消息隊列,保證了消費者組在消費消息時的 高效性和可靠性
那么分配好隊列之后,Consumer 就知道自己分配了哪些 queue 了,Consumer 就可以去 Broker 中對應的 queue 進行數(shù)據(jù)的拉取,這里 Consumer 消息的拉取在 RocketMQ 中有兩種實現(xiàn)(DefaultMQPushConsumer、DefaultMQPullConsumer, 但是在底層全部都是通過 pull 拉取消息進行消費的):
- push 模式:服務端有數(shù)據(jù)后推送給客戶端,實時性很高,但是增加了服務端工作量
- pull 模式:客戶端主動去服務端拉取數(shù)據(jù),會導致數(shù)據(jù)接收不及時
RocketMQ 的長輪詢:
RocketMQ 中使用了 長輪詢
的方式,兼顧了 push 和 pull 兩種模式的優(yōu)點
長輪詢:
長輪詢本質(zhì)上也是輪詢,服務端在沒有數(shù)據(jù)的時候并不是馬上返回數(shù)據(jù),而是會先將請求掛起,此時有一個長輪詢后臺線程每隔 5s 會去檢查 queue 中是否有新的消息,如果有則去喚醒客戶端請求,否則如果超過 15s 就會判斷客戶端請求超時
Consumer 端并發(fā)消費以及消費進度提交
Consumer 去 Broker 中拉取消息的線程只有一個,拉取到消息之后會將消息存放在 ProcessQueue 中,每一個 ConsumeQueue 都會對應一個 ProcessQueue
消息被拉取到會放在 ProcessQueue 中,等待線程池進行 并發(fā)消息
,線程池處理消息時,就會調(diào)用到我們在創(chuàng)建生產(chǎn)者時注冊的監(jiān)聽器中的 consumeMessage
方法,在這里會執(zhí)行我們自己定義的業(yè)務邏輯,之后會返回狀態(tài)碼:SUCCESS 或 RECONSUME_LATER 等等,如果消費成功,線程會去 ProcessQueue 中刪除對應的消息,并且會記錄 consumer group 對于 queue 的消費進度
,以實通過異步提交到 broker 中去,流程圖如下:
Consumer 處理失敗時的延遲消費機制:文章來源:http://www.zghlxwxcb.cn/news/detail-775352.html
在 consumer 消費消息失敗的時候,線程池會將消費失敗的消息發(fā)送到 Broker 中,在 Broker 中,對失敗的消息進行一個 Topic 的改寫為:RETRY_Topic_%
,會根據(jù)之前的 Topic 名稱進行改寫,改寫后呢,作為一個 延遲消息
重新寫入 Commitlog 和 ConsumeQueue 中,再通過專門處理延遲消息的后臺線程監(jiān)聽延遲消息是否到達延遲時間,當時間到達之后,會將改寫后的 Topic 再重新改寫為原來的 Topic 名稱并寫入 Commitlog,之后等待被消費者再次消費即可文章來源地址http://www.zghlxwxcb.cn/news/detail-775352.html
到了這里,關于基于電商場景的高并發(fā)RocketMQ實戰(zhàn)-Consumer端隊列負載均衡分配機制、并發(fā)消費以及消費進度提交的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!