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是生产环境,其余两个是测试环境。

目录

第一章  测试背景

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应该是没办法实现的(本人目前的浅显理解是这样),不过感觉好像这样意义也不大。

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值