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