從源碼看RocketMQ的消費(fèi)端負(fù)載均衡和Rebalance機(jī)制

Consumer的負(fù)載均衡

RocketMQ在消費(fèi)端的負(fù)載均衡如下圖所示,各個(gè)partition均勻分布在各個(gè)consumer上遗菠,如下圖所示:

image

所有consumer依次消費(fèi)每一個(gè)partition,如果partition數(shù)量不是consumer的整數(shù)倍维费,則排在前面的consumer會(huì)消費(fèi)更多的partition种蝶,下面可以看看consumer的實(shí)現(xiàn)。

Rebalance的實(shí)現(xiàn)

RocketMQ的consumer負(fù)載均衡依賴于RebalanceImpl類靡羡,以push的方式為例系洛,在DefaultMQPushConsumerImpl為例,其中包含RebalancePushImpl:

image

RebalanceImpl負(fù)責(zé)消費(fèi)端的負(fù)載均衡略步,其中的doRebalance方法:

image

我們?cè)龠M(jìn)入到rebalanceImpl的doRebalance方法描扯,其中調(diào)用了rebalanceByTopic,我們看看rebalanceByTopic中的邏輯:

image

image

可以看到,其主體邏輯比較簡(jiǎn)單:

  • 先獲取topic下的MessageQueue,一個(gè)MessageQueue實(shí)際上就是一個(gè)partition
  • 然后獲取當(dāng)前topic和group的client id坛吁,即當(dāng)前group中消費(fèi)此topic的客戶端
  • 隨后對(duì)partition和client id做排序
  • 然后調(diào)用strategy獲取當(dāng)前客戶端需要消費(fèi)的partition
  • 最后更新訂閱

因此舷夺,負(fù)載均衡的主體算法在AllocateMessageQueueStrategy中實(shí)現(xiàn),通過DefaultMQPushConsumer的默認(rèn)構(gòu)造器我們可以看到,默認(rèn)使用的AllocateMessageQueueStrategy是AllocateMessageQueueAveragely實(shí)現(xiàn)類:

image

找到具體的實(shí)現(xiàn)類后,我們可以看到默認(rèn)使用的負(fù)載均衡算法:

image

公式寫的非常繞,代幾個(gè)數(shù)進(jìn)去算一下就知道蜂桶,默認(rèn)情況下,rocketmq使用的是連續(xù)分配的方式也切,示意圖如下:

image

AllocateMessageQueueStrategy提供了多個(gè)實(shí)現(xiàn):

image
  • AllocateMessageQueueAveragely是前面講的默認(rèn)方式
  • AllocateMessageQueueAveragelyByCircle則是本文最前面的示意圖扑媚,每個(gè)消費(fèi)者依次消費(fèi)一個(gè)partition
  • AllocateMessageQueueConsistentHash使用的是一致性hash算法
  • AllocateMachineRoomNearby是通過就近元?jiǎng)t腰湾,離的近的消費(fèi)
  • AllocateMessageQueueByConfig是通過配置的方式

在不同的情況下,我們可以選擇使用不同的負(fù)載均衡實(shí)現(xiàn)方式疆股。

對(duì)于特定場(chǎng)景费坊,甚至可以自己實(shí)現(xiàn)負(fù)載均衡策略,比如我們的應(yīng)用需要消費(fèi)非常多個(gè)topic押桃,而每個(gè)topic的partition不一定剛才都是機(jī)器 數(shù)量的整數(shù)倍葵萎,這個(gè)時(shí)候,按照rocketmq提供的負(fù)載均衡策略唱凯,排在前面的consumer消費(fèi)的partition數(shù)量會(huì)多于后面的consumer羡忘,當(dāng)topic非常多時(shí),這就導(dǎo)致排在前面的consumer消費(fèi)的partition比后面的consumer要多很多磕昼,造成集群中不同機(jī)器的水位相差非常大卷雕,這種場(chǎng)景下就知道自己實(shí)現(xiàn)負(fù)載均衡策略

何時(shí)重新Rebalace

這里先要介紹一個(gè)類MQClientInstance,此類在DefaultMQPushConsumerImpl的start方法中有如下代碼:

image

這里的mQClientFactory的實(shí)現(xiàn)類實(shí)際上就是一個(gè)MQClientInstance票从,進(jìn)入到MQClientInstance類的構(gòu)造器中漫雕,我們可以看到它創(chuàng)建了一個(gè)RebalanceService對(duì)象,代碼如下:

image

我們一級(jí)級(jí)的看下去峰鄙,在RebalanceService的run方法中浸间,可以看到,默認(rèn)每20s調(diào)一次doRebalance:

image

而在父類ServiceThread中吟榴,我們可以看到run方法的調(diào)用方式魁蒜,實(shí)際上是創(chuàng)建了一個(gè)線程:

image

因此,當(dāng)一個(gè)consumer出現(xiàn)宕機(jī)后吩翻,默認(rèn)最多20s兜看,其它機(jī)器將重新消費(fèi)已宕機(jī)的機(jī)器消費(fèi)的partition,同樣當(dāng)有新的consumer連接上后狭瞎,20s內(nèi)也會(huì)完成rebalance使得新的consumer有機(jī)會(huì)消費(fèi)partition

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末细移,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子熊锭,更是在濱河造成了極大的恐慌弧轧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碗殷,死亡現(xiàn)場(chǎng)離奇詭異劣针,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亿扁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸟廓,“玉大人从祝,你說我怎么就攤上這事襟己。” “怎么了牍陌?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵擎浴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我毒涧,道長(zhǎng)贮预,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任契讲,我火速辦了婚禮仿吞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捡偏。我一直安慰自己唤冈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布银伟。 她就那樣靜靜地躺著你虹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彤避。 梳的紋絲不亂的頭發(fā)上傅物,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音琉预,去河邊找鬼董饰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛模孩,可吹牛的內(nèi)容都是我干的尖阔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼榨咐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼介却!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起块茁,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤齿坷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后数焊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體永淌,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年佩耳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遂蛀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡干厚,死狀恐怖李滴,靈堂內(nèi)的尸體忽然破棺而出螃宙,到底是詐尸還是另有隱情,我是刑警寧澤所坯,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布谆扎,位于F島的核電站,受9級(jí)特大地震影響芹助,放射性物質(zhì)發(fā)生泄漏堂湖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一状土、第九天 我趴在偏房一處隱蔽的房頂上張望无蜂。 院中可真熱鬧,春花似錦声诸、人聲如沸酱讶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泻肯。三九已至,卻和暖如春慰照,著一層夾襖步出監(jiān)牢的瞬間灶挟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工毒租, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稚铣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓墅垮,卻偏偏與公主長(zhǎng)得像惕医,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子算色,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容