rocketmq新擴容的broker沒有tps_深入研究RocketMQ消費者是如何獲取消息的

前言

小伙伴們,國慶都過的開心嗎?國慶后的第一個工作日是不是很多小伙伴還沉浸在假期的心情中,沒有工作狀態呢?

那王子今天和大家聊一聊RocketMQ的消費者是如何獲取消息的,通過學習知識來找回狀態吧。

廢話不多說,我們開始吧。

消費者組

首先我們了解一個概念,什么是消費者組

消費者組你就可以把它理解為,給一組消費者起一個名字。

假設我們有一個訂單Topic名字是OrderTopic,然后庫存系統和積分系統都要消費這個Topic中的數據,我們分別給庫存系統和積分系統起一個消費組名字:stock_consumer_group、score_consumer_group。

設置消費者組名字是在代碼中實現的,如下:

?DefaultMQPushConsumer?consumer?=?
? ? ? ? ?new?DefaultMQPushConsumer("stock_consumer_group");

比如我們的庫存系統提供了2臺機器,每臺機器上的消費者組名字都是stock_consumer_group,那么這2臺機器就是一個消費者組。

fa99e0427e91f50b02270073e6377b77.png

大體結構如上圖所示,那么當訂單系統發送消息到OrderTopic中后,庫存系統和積分系統是如何進行消費的呢?

默認情況下,這條消息發送到Broker后,庫存系統和積分系統都會拉取這條消息,而且庫存系統的兩臺機器中只有一臺會消費到這條消息,積分系統也一樣。

這就是消費組的概念,不同的系統設置不同的消費組,如果不同的消費組訂閱了同一個Topic,那么對于Topic中的一條消息,每個消費組都會獲取到這條消息。

集群模式和廣播模式

接下來我們思考一個問題,對于消費者組而言,當它獲取到一條消息后,假設消費者組內有多臺機器,那么到底是只有一臺機器獲取到消息,還是所有機器都獲取到消息呢?

這其實是消費的兩種模式,集群模式和廣播模式

默認情況下我們都是使用的集群模式,也就是說消費者組收到消息后,只有其中的一臺機器會接收到消息。

我們可以手動指定為廣播模式。

consumer.setMessageModel(MessageModel.BROADCASTING)

指定為廣播模式后,消費者組內的每臺機器都會收到這條消息。

具體要根據業務場景選擇消費模式。

MessageQueue與消費者的關系

接著我們想一下,對于一個Topic下的多個MessageQueue,消費者組中的多臺機器是如何消費的呢?

這部分內容底層實現是很復雜的,我們可以簡單的理解為它會均勻的將多個MessageQueue分配給消費者組中的多臺機器消費。

舉個例子,假如我們的OrderTopic有四個MessageQueue,這4個MessageQueue分布在兩臺MasterBroker上,每個MasterBroker上有兩個MessageQueue。

然后庫存系統作為一個消費者組有兩臺機器,那么最好的分配方式就是每臺消費者機器負責兩個MessageQueue,這樣就實現了機器的負載消費,示意圖如下:

fd6558e1b76ae0293933b5fcbc407b6d.png

所以我們可以大致的認為,一個Topic中的多個MessageQueue會被均勻的分布給一個消費者組中的多臺機器進行消費,這里要注意一點,一個MessageQueue只能被一臺消費者機器消費,但是一臺消費者機器可以同時負責處理多個MessageQueue。

那么當消費者組中的機器數量發生變化時,是怎么處理的。

機器數量發生變化一般就兩種情況,一種是有機器宕機了,另一種是增加機器進行集群擴容了。

其實這種情況下是會進行rebalance環節的,也就是會重新分配每個消費者機器要處理的MessageQueue。

Push模式和Pull模式

不知道小伙伴們還記不記得,在之前的文章RocketMQ的發送模式和消費模式中,我們已經用代碼說明了消費者的兩種消費模式:Push和Pull,當時只提供了Push消費的代碼,而沒有提供Pull消費的代碼。

其實這兩種模式本質上是一樣的,都是消費者主動發出請求到Broker上拉取消息。

Push模式的底層也是通過消費者主動拉取的方式來實現的,只不過它的名字叫Push而已,意思是Broker盡可能實時的推送消息給消費者。

我們一般在使用RocketMQ的時候,消費模式基本都是使用的Push模式,因為Pull模式真的使用起來代碼特別復雜,而且Push模式的底層還是Pull模式,只是對時效性有了更好的支持。

Push模式大體實現思路是這樣的:當消費者發送請求到Broker拉取消息的時候,如果有新的消息可以消費,會立馬返回消息到消費者進行消費,消費后會接著發送請求到Broker拉取消息。

也就說Push模式下,處理完一批消息后會理解再發送請求給Broker拉取下一批消息,所以時效性更好,看起來就像是Broker在實時推送消息。

當請求發送到Broker發現沒有需要消費的消息時,就會讓請求線程掛起,默認掛起15秒,然后會有另一個后臺線程每隔一段時間判斷一下是否有新消息需要消費,一旦發現了新的消息,就會去喚醒掛起的線程,將消息返回給消費者進行消費,然后消費完畢再次發送請求拉取消息。

這一部分的源碼實現是很復雜的,我們只要了解它的核心思路就可以了。就算是Push模式,本質上也是對Pull模式的一種封裝

Broker如何讀取消息返回給消費者

接下來我們來聊聊Broker是如何讀取消息返回給消費者的。之前的文章深入研究Broker是如何持久化的中我們已經知道了Broker是如何持久化消息的,小伙伴們可以復習一下。

那么當消費者發送請求到Broker中拉取消息時,假設是第一次拉取,就會從MessageQueue中的第一條消息開始拉取。

如何定位到第一條消息的位置呢,首先Broker會找到MessageQueue對應的ConsumerQueue,從里面找到這條消息的offset,然后通過offset去CommitLog中讀取消息數據,把消息返回給消費者。

當消費者消費完這條消息后,會提交一個消費的進度給Broker,Broker會記錄下一個ConsumerOffset來標記我們的消費進度。

下次消費者再去這個MessageQueue中拉取消息時,就會從記錄的消費位置繼續拉取消息,而不用從頭獲取了。

總結

好了,到這里本篇文章就結束了。

今天主要和大家一起討論了一下RocketMQ消費者的拉取和消費過程,也是國慶假期后的第一篇文章。

沒有從國慶中收回心的小伙伴們(ps:王子也一樣沒有進入狀態(`?ω?′))就與王子一起通過學習找回狀態吧。

往期文章推薦:

什么是消息中間件?主要作用是什么?

常見的消息中間件有哪些?你們是怎么進行技術選型的?

你懂RocketMQ 的架構原理嗎?

聊一聊RocketMQ的注冊中心NameServer

Broker的主從架構是怎么實現的?

RocketMQ生產部署架構如何設計

RabbitMQ和Kafka的高可用集群原理

RocketMQ的發送模式和消費模式

討論一下秒殺系統的技術難點與解決方案

秒殺系統中的扣減庫存和流量削峰

深入研究RocketMQ生產者發送消息的底層原理

深入研究Broker是如何持久化的

Dledger是如何實現主從自動切換的

長按識別二維碼,了解更多

d0c29bfacc0e816c88a40c91c183825c.png65adc58d7fbd3f955bdaf377c1acfc16.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537572.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

蘇寧 11.11:倉庫內多 AGV 協作的全局路徑規劃算法研究

本文為『InfoQ x 蘇寧 2018雙十一』技術特別策劃系列文章之一。 1. 背景 隨著物聯網和人工智能的發展,越來越多的任務漸漸的被機器人取代,機器人逐漸在發展中慢慢進入物流領域,“智能叉車”,AGV(Automated Guided Vehi…

老板思維:工作負責人是首問責任制

工作負責人包括部門領導,項目經理等負責人。以項目經理為例,解釋這種思維。 分好幾種情況: (1)當公司(老板,領導,甲方)將事情交給你的時候,這件事情就由你負…

用python繪制玫瑰花的代碼_python也能玩出玫瑰花!程序員的表白代碼

有些情侶是異地戀,情人節想送朵玫瑰花給女朋友都困難。別擔心,用Python就好了,互聯網時代的戀愛神器!接下來就讓我們一起來看看如何用Python變出玫瑰花的。 1、首先我們導入畫圖工具turtle,即import turtle 2、導入畫圖…

Springboot 整合 swagger

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/weixin_40254498/article/details/83622098 swagger 主要是為后端服務的接口文檔,懶人必備,swagger就是一款讓你更好的書寫API文檔的框架。 其他的框架…

Project為項目設置預算

假設項目預算10萬元,如果項目完成后,花費沒有超過10萬元,則成本管理是成功的,如果花費了11萬,則超過了預算。 預算是10萬,一般目標成本設得比預算成本低,比如9.5萬。在項目實施過程中&#xff…

activiti7流程設計器_變頻空調器通信電路

通信電路由室內機和室外機主板兩個部分單元電路組成,并且在實際維修中該電路的故障率比較高,因此單設--節進行詳細說明。第三章變頻空調器單元電路對比和通信電路第二節通信電路通信電路由室內機和室外機主板兩個部分單元電路組成,并且在實際…

PyCharm 中為 Python 項目添加.gitignore文件

文章目錄 1.安裝.ignore插件 2.在項目中添加.ignore文件 1.安裝.ignore插件 在pycharm編譯器中,依次點擊File->Setting 在跳出Setting的頁面中,執行如下操作: 點擊左側的Plugins, 在搜索框中輸入.ignore 點擊右側的install 點…

mysql的分頁查詢

為什么80%的碼農都做不了架構師?>>> order by case when 的用法(實現特殊情況的排序,如leader1的排最前面): select * from m_worker_project order by CASE WHEN leader 1 THEN 100 ELSE 1000 END 項目中…

.describe() python_python的apply應用:一般性的“拆分-應用-合并”,附加詳細講解

跟aggregate一樣,transform也是一個有著嚴格條件的特殊函數:傳入的函數只能產生兩種結果,要么產生一個可以傳播的標量值(如np.mean),要么產生一個相同大小的結果數組。最一般化的GroupBy方法是apply,apply會將待處理的…

DNS服務(4)Slave DNS及高級特性

為了簡化運維人員的負擔,使用Master/Slave DNS架構的情況比較好,現在我們來簡單敘述一下Master/Slaver DNS的特點主DNS服務器:維護所負責解析的域內解析庫服務器;解析庫由管理員維護;從DNS服務器:從主DNS服務器或其它的…

python運算符_Python運算符總結

建議:字符串拼接操作盡量多用join,而減少用”“ join操作時會先計算字符操作所用到的空間總和大小,然后申請內存。然后進行字符串連接操作。所以join的時間復雜的近似O(n)。 操作符連接操作符時,由于字符串是不可變對象&#xff0…

jupyter notebook常用快捷鍵

Jupyter Notebook 有兩種鍵盤輸入模式。編輯模式,允許你往單元中鍵入代碼或文本;這時的單元框線是綠色的。命令模式,鍵盤輸入運行程序命令;這時的單元框線是灰色。 命令模式 (按鍵 Esc 開啟) Enter : 轉入編輯模式Shift-Enter : …

Eclipse安裝試用Hanlp

【1】確定正確安裝配置Java和Eclipse 【2】下載HanLp的各種東西 hanlp.linrunsoft.com/services.ht… 下載這四個文件到本地,我是放在桌面的一個文件夾了。【3】 把jar包導入到Eclipse 在Eclipse先新建一個項目File——New——Java Project--[名字:Hanlp…

升級pip最新版本

python很多庫對pip版本有要求,升級命令為: python -m pip install --upgrade pip windows在cmd下,輸入以上命令

bat 存儲過程返回值_使用Mybatis過程中遇到的坑

常規SSM框架開發中,mybatis遇到的坑是最多的,把以下幾點坑記錄下來防止以后再遇到同樣的情況。1、mybatis 若果在mapper中返回值沒有配置resultMap而是使用resultType直接返回的話,那么當心默認配置中的駝峰匹配規則,參考以下配置…

【洛谷 P2513】 [HAOI2009]逆序對數列(DP)

題目鏈接 這種求方案數的題一般都是\(dp\)吧。 注意到范圍里\(k\)和\(n\)的范圍一樣大,\(k\)是完全可以更大的,到\(n\)的平方級別,所以這暗示了我們要把\(k\)寫到狀態里。\(f[i][j]\)表示前\(1\)~\(i\)的排列逆序對數為\(j\)的方案數。 現在考…

think python下載 中文版開源!這或許是最經典的編程教材

《Think Python》是很多Python初學者的不二入門教材,受到廣泛好評。該書原作者是美國Olin工程學院的教授Allen B. Downey,目前該書的原版和中文版本都已免費開源。 中文版本譯者是一名自學Python的編程愛好者。選擇翻譯《Think Python》,一是…

datatable的數據進行組內排序_排序算法學習分享(四)希爾排序

排序,也稱為排序算法,可以說是我們學習算法的過程中遇到的第一個門檻,也是實際應用中使用得較為頻繁的算法,我將自己對所學的排序算法進行一個歸納總結與分享,如有錯誤,歡迎指正!排序算法學習分…

jupyter notebook 安裝代碼提示功能

效果 安裝成功后,輸入部分代碼,按 tab 鍵,會提示代碼 安裝步驟 1.安裝nbextensions 從國內的pip鏡像下載快 pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com jupyter_contrib_nbextensions jupyter contr…

轉:EL表達式的11個內置對象

原文地址&#xff1a;https://blog.csdn.net/qq_17045385/article/details/54799998 EL是JSP內置的表達式語言 JSP2.0開始&#xff0c;不讓再使用Java腳本&#xff0c;而是使用EL表達式和動態標簽來代替Java腳本 ############EL替代的是<%... %>&#xff0c;也就是說EL只…