消息負(fù)載均衡策略
云消息隊(duì)列 RocketMQ 版的消息負(fù)載均衡策略針對(duì)生產(chǎn)者和消費(fèi)者有所差異。對(duì)消費(fèi)者而言,消息負(fù)載均衡策略在一定程度上影響消息堆積。
背景信息
隨著SDK版本的升級(jí),云消息隊(duì)列 RocketMQ 版的負(fù)載均衡策略也有所優(yōu)化,根據(jù)SDK版本,負(fù)載均衡策略可分為:
負(fù)載均衡策略(客戶端Java v2.x.x.Final和C++ v3.x.x)
前提條件
TCP協(xié)議Java SDK:
SDK版本:升級(jí)至2.x.x.Final版本。
實(shí)例所屬地域:華東1(杭州)、華北1(青島)、華北2(北京)、華北3(張家口)、華北5(呼和浩特)、華南1(深圳)、西南1(成都)、德國(guó)(法蘭克福)和印度尼西亞(雅加達(dá))。
TCP協(xié)議C++ SDK:
SDK版本:升級(jí)至3.x.x版本。
實(shí)例所屬地域:所有地域均支持。
優(yōu)勢(shì)
客戶端Java v2.x.x.Final和C++ v3.x.x版本的負(fù)載均衡策略有以下優(yōu)勢(shì):
消息消費(fèi)更加靈活,不再按照Queue維度消費(fèi),同一Queue的消息可以被多個(gè)消費(fèi)者消費(fèi)。
當(dāng)消費(fèi)者個(gè)數(shù)多于Queue的個(gè)數(shù)時(shí),也不會(huì)產(chǎn)生消費(fèi)者空轉(zhuǎn)的現(xiàn)象,避免資源浪費(fèi)。
生產(chǎn)者負(fù)載均衡策略
無(wú)序消息(普通消息、事務(wù)消息、定時(shí)和延時(shí)消息):Producer將消息以輪詢的方式發(fā)送至Queue,如下圖所示:
圖中Msg1、Msg2代表第一條消息、第二條消息,生產(chǎn)者會(huì)把第一條消息發(fā)送至Queue 1,然后第二條消息發(fā)送至Queue 2,第三條消息發(fā)送至Queue 3,以此類(lèi)推,第四條消息又發(fā)送至Queue 1,循環(huán)往復(fù)。
順序消息:相同Sharding Key的消息被發(fā)送至同一個(gè)Queue,如下圖所示:
圖中ShardingKey為1的消息都同時(shí)被發(fā)送到Queue1中,同樣Sharding Key為2的消息同時(shí)被發(fā)送至Queue 2中。
消費(fèi)者負(fù)載均衡策略
無(wú)序消息:云消息隊(duì)列 RocketMQ 版Broker按照消息維度將Topic中的所有消息平均分配給消費(fèi)者集群中的多個(gè)消費(fèi)者處理。
客戶端Java v2.x.x.Final和C++ v3.x.x版本的負(fù)載均衡不再按照Queue維度消費(fèi),同一Queue的消息可以被多個(gè)消費(fèi)者消費(fèi)。具體示例如下圖所示:
圖中每一個(gè)Queue中的多條消息都可同時(shí)被不同的消費(fèi)者消費(fèi),例如Queue 2中的四條消息被分配給了Consumer 1、Consumer 2、Consumer 3及Consumer 4消費(fèi)。
順序消息:消息消費(fèi)根據(jù)Sharding Key負(fù)載均衡,不同Sharding Key的消息可被均衡的負(fù)載到多個(gè)Queue中消費(fèi),且為保證順序消息的語(yǔ)義,相同Sharding Key的消息會(huì)被同一個(gè)消費(fèi)者消費(fèi),具體示例如下圖所示:
說(shuō)明:該圖標(biāo)背景色表示消息屬于Queue 1;Msg2-1表示該消息為Queue1中的第2條消息,且消息的ShardingKey為1。
:該圖標(biāo)背景色表示消息屬于Queue 2;Msg3-2表示該消息為Queue2中的第3條消息,且消息的ShardingKey為2。
圖中Msg1-1、Msg2-1和Msg3-1這三條消息的Sharding Key都是1,因此被同一個(gè)消費(fèi)者Consumer 1消費(fèi),同樣Sharding Key都為2的消息同時(shí)被Consumer 2消費(fèi)。
Msg4-3和Msg4-4的Sharding Key不同,分別為3和4,因此可被分配給不同的消費(fèi)者消費(fèi)。
負(fù)載均衡策略(客戶端Java v1.x.x.Final和C++ v1.x.x/v2.x.x)
生產(chǎn)者負(fù)載均衡策略
與客戶端Java v2.x.x.Final和C++ v3.x.x的負(fù)載均衡策略相同,具體示例,請(qǐng)參見(jiàn)負(fù)載均衡策略(客戶端Java v2.x.x.Final和C++ v3.x.x)。
無(wú)序消息:Producer的消息以輪詢的方式發(fā)送至Queue。
順序消息:相同Sharding Key的消息被發(fā)送至同一個(gè)Queue。
消費(fèi)者負(fù)載均衡策略
無(wú)序消息和順序消息的負(fù)載均衡策略相同。
云消息隊(duì)列 RocketMQ 版包含Broker和Name Server等節(jié)點(diǎn),其中Broker節(jié)點(diǎn)負(fù)責(zé)將Topic的路由信息上報(bào)至Name Server節(jié)點(diǎn)。
假設(shè)目前云消息隊(duì)列 RocketMQ 版只有一個(gè)Broker節(jié)點(diǎn),消息從Producer發(fā)送至云消息隊(duì)列 RocketMQ 版的Topic,默認(rèn)會(huì)將這些Topic下的消息均衡負(fù)載至8個(gè)Queue(邏輯概念)。云消息隊(duì)列 RocketMQ 版Broker會(huì)將這些Queue再平均分配至屬于同一個(gè)Group ID的消費(fèi)者集群。
在云消息隊(duì)列 RocketMQ 版中,一個(gè)Queue只能同時(shí)被分配至一個(gè)消費(fèi)者消費(fèi)。因此,每臺(tái)消費(fèi)者機(jī)器處理的Queue的數(shù)量有以下幾種可能:
若消費(fèi)者機(jī)器數(shù)量大于Queue的數(shù)量,則超出Queue數(shù)量的機(jī)器會(huì)處理0個(gè)Queue上的消息,如下圖所示:
若消費(fèi)者機(jī)器數(shù)量等于Queue的數(shù)量,則每臺(tái)機(jī)器會(huì)處理1個(gè)Queue上的消息,如下圖所示:
若消費(fèi)者機(jī)器數(shù)量小于Queue的數(shù)量,則每臺(tái)機(jī)器會(huì)處理多個(gè)Queue上的消息,如下圖所示:
因?yàn)橄M(fèi)者負(fù)載均衡策略是以Queue為粒度維護(hù),如果消費(fèi)者集群中一臺(tái)機(jī)器處理變慢,可能是機(jī)器硬件、系統(tǒng)、遠(yuǎn)程RPC調(diào)用或Java GC等原因?qū)е路峙渲链藱C(jī)器上的Queue的消息不能及時(shí)處理,則整個(gè)Queue上的消息都會(huì)堆積。