记rocketmq多集群使用未设置instanceName导致MQ无法消费问题解决

背景

在这里插入图片描述
有两个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。如此,就可以正常消费了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用RocketMQ同时消费多个MQ集群的示例: ```java public class MultiClusterConsumer { public static void main(String[] args) throws InterruptedException, MQClientException { // 定义需要消费的 topic 和 tag String topic = "TestTopic"; String tag = "*"; // 定义多个 MQ 集群的地址 String[] clusterAddresses = new String[]{ "10.0.0.1:9876", "10.0.0.2:9876", "10.0.0.3:9876" }; // 创建多个消费者实例 List<DefaultMQPushConsumer> consumers = new ArrayList<>(); for (String clusterAddress : clusterAddresses) { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup"); consumer.setNamesrvAddr(clusterAddress); consumer.subscribe(topic, tag); consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> { // 消费消息的逻辑 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; }); consumers.add(consumer); consumer.start(); } // 等待消费者关闭 for (DefaultMQPushConsumer consumer : consumers) { consumer.shutdown(); } } } ``` 在上面的示例中,我们首先定义了需要消费的 topic 和 tag,然后定义了多个 MQ 集群的地址。接着,我们创建了多个消费者实例,每个消费者实例连接到不同的 MQ 集群,并订阅相同的 topic 和 tag。最后,我们等待消费者关闭。 需要注意的是,当使用多个 MQ 集群时,消息可能会被重复消费。因此,在实际应用中,我们需要根据业务场景来选择是否使用多个 MQ 集群
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值