背景
有两个broker集群,两个broker集群公用一个nameserver。此时,针对同一个应用,先消费broker B集群的Topic B的消费。然后,进行一定的业务逻辑处理以后,应用再发消息到broker A集群的Topic A,让消费者A消费。之前在同一个集群的时候,未出现消费问题。后来在生产上,发小消费者B不消费了,消息堆积了。
原因
1 producer
默认情况下不需要设置instanceName,rocketmq会使用ip@pid(pid代表jvm名字)作为唯一标示
如果同一个jvm中,不同的producer需要往不同的rocketmq集群发送消息,需要设置不同的instanceName
原因如下:如果不设置instanceName,那么会使用ip@pid作为producer唯一标识,那么会导致多个producer内部只有一个MQClientInstance(与mq交互)实例,从而导致只往一个集群发消息。
2 consumer
默认情况下不需要设置instanceName,rocketmq会使用ip@pid作为instanceName(pid代表jvm名字)
如果设置instanceName,rocketmq会使用ip@instanceName作为consumer的唯一标示,此时需要注意instanceName需要不同。
解决方案
给所有消息的消费者和生产者都设置唯一的instance name。如此,就可以正常消费了。