天天看點

RocketMq 叢集模式下不同組、隊列、标簽下的負載均衡情況第一章  測試背景第二章 實踐第三章 配置覆寫第四章 總結

前言:目前rocketmq的配置如下所示,突然發現當在本地調試程式時,有多個機器會訂閱同一個組(一個生産、其餘本地測試環境),感覺這樣應該會有負載均衡,是以會導緻生産環境上的rocketMq收不到消息,是以我決定先測試一下到底什麼情況會負載均衡,其實就是什麼情況消息會發送到兩個機器上,然後再調整一下配置(有一些無關的注釋請忽略,項目中的懶得删了)。

# 人臉識别生産者的組名
rocketmq.faceProducerGroup=face-producer-group
# 人臉識别消費者組名
rocketmq.faceConsumerGroup=face-consumer-group
# 人臉識别隊列
rocketmq.face-topic=faceRecognitionTopic
# 人臉識别隊列标簽
rocketmq.face-topic-tag=user-tag
           

172.20.13.15是生産環境,其餘兩個是測試環境。

RocketMq 叢集模式下不同組、隊列、标簽下的負載均衡情況第一章  測試背景第二章 實踐第三章 配置覆寫第四章 總結

目錄

第一章  測試背景

1.1 原理

1.2 配置

第二章 實踐

2.1 group一樣,topic一樣,tag一樣

2.2 group一樣,topic不一樣,tag一樣

2.3 group一樣,topic一樣,tag不一樣

第三章 配置覆寫

第四章 總結

第一章  測試背景

1.1 原理

這裡采用叢集模式(cluster),感覺影響負載均衡的主要是三個,group,topic,tag,這裡會用控制變量法進行測試,分别測試

三個都一樣,負載均衡情況。

group一樣,topic不一樣,tag一樣,負載均衡情況。

group一樣,topic一樣,tag不一樣,負載均衡情況。

1.2 配置

啟動了兩個消費者,一個生産者,都在一個機器上,兩個消費者端口分别是8081,8082,生産者端口8080

RocketMq 叢集模式下不同組、隊列、标簽下的負載均衡情況第一章  測試背景第二章 實踐第三章 配置覆寫第四章 總結

第二章 實踐

2.1 group一樣,topic一樣,tag一樣

從生産者發送30條資料,兩個消費者對半分,證明兩個消費者在三個都一樣情況下會負載均衡。

配置:

生産者:

#RocketMQ
# 人臉識别生産者的組名
rocketmq.faceProducerGroup=test-group-zhang
# 人臉識别消費者組名
rocketmq.faceConsumerGroup=test-group-zhang
# 人臉識别隊列
rocketmq.face-topic=testTopic
# 人臉識别隊列标簽
rocketmq.face-topic-tag=testTopicTag
# NameServer位址
rocketmq.namesrvaddr=172.31.44.112:9876;172.31.44.113:9876

server.port=8080
           

消費者1:

#RocketMQ
# 人臉識别生産者的組名
rocketmq.faceProducerGroup=test-group-zhang
# 人臉識别消費者組名
rocketmq.faceConsumerGroup=test-group-zhang
# 人臉識别隊列
rocketmq.face-topic=testTopic
# 人臉識别隊列标簽
rocketmq.face-topic-tag=testTopicTag
# NameServer位址
rocketmq.namesrvaddr=172.31.44.112:9876;172.31.44.113:9876

server.port=8081
           

消費者2: 

#RocketMQ
# 人臉識别生産者的組名
rocketmq.faceProducerGroup=test-group-zhang
# 人臉識别消費者組名
rocketmq.faceConsumerGroup=test-group-zhang
# 人臉識别隊列
rocketmq.face-topic=testTopic
# 人臉識别隊列标簽
rocketmq.face-topic-tag=testTopicTag
# NameServer位址
rocketmq.namesrvaddr=172.31.44.112:9876;172.31.44.113:9876

server.port=8082
           

2.2 group一樣,topic不一樣,tag一樣

從生産者發送30條資料,隻有一個消費者能接收到資料,證明topic不一樣也會負載均衡,是否負載均衡和topic沒關系。

生産者1:

#RocketMQ
# 人臉識别生産者的組名
rocketmq.faceProducerGroup=test-group-zhang
# 人臉識别消費者組名
rocketmq.faceConsumerGroup=test-group-zhang
# 人臉識别隊列
rocketmq.face-topic=testTopic1
# 人臉識别隊列标簽
rocketmq.face-topic-tag=testTopicTag
# NameServer位址
rocketmq.namesrvaddr=172.31.44.112:9876;172.31.44.113:9876

server.port=8080
           

消費者1:

#RocketMQ
# 人臉識别生産者的組名
rocketmq.faceProducerGroup=test-group-zhang
# 人臉識别消費者組名
rocketmq.faceConsumerGroup=test-group-zhang
# 人臉識别隊列
rocketmq.face-topic=testTopic1
# 人臉識别隊列标簽
rocketmq.face-topic-tag=testTopicTag
# NameServer位址
rocketmq.namesrvaddr=172.31.44.112:9876;172.31.44.113:9876

server.port=8081
           

消費者2:

#RocketMQ
# 人臉識别生産者的組名
rocketmq.faceProducerGroup=test-group-zhang
# 人臉識别消費者組名
rocketmq.faceConsumerGroup=test-group-zhang
# 人臉識别隊列
rocketmq.face-topic=testTopic2
# 人臉識别隊列标簽
rocketmq.face-topic-tag=testTopicTag
# NameServer位址
rocketmq.namesrvaddr=172.31.44.112:9876;172.31.44.113:9876

server.port=8082
           

2.3 group一樣,topic一樣,tag不一樣

相信應該也能猜到了,隻有一個消費者能接收到資料,證明tag不一樣也會負載均衡,是否負載均衡和tag沒關系。

生産者1:

#RocketMQ
# 人臉識别生産者的組名
rocketmq.faceProducerGroup=test-group-zhang
# 人臉識别消費者組名
rocketmq.faceConsumerGroup=test-group-zhang
# 人臉識别隊列
rocketmq.face-topic=testTopic1
# 人臉識别隊列标簽
rocketmq.face-topic-tag=testTopicTag1
# NameServer位址
rocketmq.namesrvaddr=172.31.44.112:9876;172.31.44.113:9876

server.port=8080
           

消費者1:

#RocketMQ
# 人臉識别生産者的組名
rocketmq.faceProducerGroup=test-group-zhang
# 人臉識别消費者組名
rocketmq.faceConsumerGroup=test-group-zhang
# 人臉識别隊列
rocketmq.face-topic=testTopic1
# 人臉識别隊列标簽
rocketmq.face-topic-tag=testTopicTag1
# NameServer位址
rocketmq.namesrvaddr=172.31.44.112:9876;172.31.44.113:9876

server.port=8081
           

消費者2:

#RocketMQ
# 人臉識别生産者的組名
rocketmq.faceProducerGroup=test-group-zhang
# 人臉識别消費者組名
rocketmq.faceConsumerGroup=test-group-zhang
# 人臉識别隊列
rocketmq.face-topic=testTopic1
# 人臉識别隊列标簽
rocketmq.face-topic-tag=testTopicTag2
# NameServer位址
rocketmq.namesrvaddr=172.31.44.112:9876;172.31.44.113:9876

server.port=8082
           

第三章 配置覆寫

感覺挺重要的,第一次發現這種問題

在測試的時候發現一個奇怪的事情,當兩個機器訂閱了一個組,後啟動的機器的tag會覆寫前一個機器的,topic則不會。

如我先啟動機器一,機器一的topic是testTopic1,再啟動機器二,第二個機器的topic是testTopic2,生産者在發送消息時指定topic為testTopic1,這樣機器一還是可以收到負載均衡後的消息。

如兩個機器topic都是testTopic1,我先啟動機器一,機器一的tag是testTopicTag1,再啟動機器二,第二個機器的tag是testTopicTag2,當第二個機器啟動的時候,即使生産者在發送消息時指定tag為testTopicTag1,機器一也不會接收到消息,具體狀态如下圖所示。

機器一啟動時的狀态:

RocketMq 叢集模式下不同組、隊列、标簽下的負載均衡情況第一章  測試背景第二章 實踐第三章 配置覆寫第四章 總結

機器一能正常接收topic是testTopic1的消息 

啟動機器二:

RocketMq 叢集模式下不同組、隊列、标簽下的負載均衡情況第一章  測試背景第二章 實踐第三章 配置覆寫第四章 總結

 可以看到tag被覆寫為testTopicTag2,此時生産者再向testTopicTag1發送消息,機器一接收不到消息,當然因為機器二接收的是testTopicTag2的消息,是以機器二也沒消息,生産者将tag變為testTopicTag2,機器二能接收到消息,機器一仍不能。

第四章 總結

在cluster模式下是否負載均衡看來隻和訂閱該組的機器個數有關系,每次把消息均分到訂閱該組的每個機器中,跟topic,tag都無關,是以針對某個組需要負載均衡的話,負載均衡機器的topic、tag最好弄成一樣的,那麼問題來了,如果想組内某個topic負載均衡,某個topic不負載均衡,這樣感覺用rocektmq應該是沒辦法實作的(本人目前的淺顯了解是這樣),不過感覺好像這樣意義也不大。