前言:目前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是生産環境,其餘兩個是測試環境。
目錄
第一章 測試背景
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
第二章 實踐
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,機器一也不會接收到消息,具體狀态如下圖所示。
機器一啟動時的狀态:
機器一能正常接收topic是testTopic1的消息
啟動機器二:
可以看到tag被覆寫為testTopicTag2,此時生産者再向testTopicTag1發送消息,機器一接收不到消息,當然因為機器二接收的是testTopicTag2的消息,是以機器二也沒消息,生産者将tag變為testTopicTag2,機器二能接收到消息,機器一仍不能。
第四章 總結
在cluster模式下是否負載均衡看來隻和訂閱該組的機器個數有關系,每次把消息均分到訂閱該組的每個機器中,跟topic,tag都無關,是以針對某個組需要負載均衡的話,負載均衡機器的topic、tag最好弄成一樣的,那麼問題來了,如果想組内某個topic負載均衡,某個topic不負載均衡,這樣感覺用rocektmq應該是沒辦法實作的(本人目前的淺顯了解是這樣),不過感覺好像這樣意義也不大。