RocketMQ 同一JVM实例启动多个不同NameServer 对应的Producer导致NameServer只连上一个的问题

          现在对原业务RocketMQ的NameServer连接方式更改,之前业务方写的NameServer地址列表,现在我们架构组为了维护统一更改成域名的形式,而且涉及到迁移新RocketMQ集群,同时保留生产者向新老RocketMQ集群发送消息,发送的比例由配置中心控制。所以对其业务方项目的生产者必须提供连接新老NameServer的两个生产者,业务方初始化生产者的代码不变,只是初始化两个不同配置NameServer的生产者:

DefaultMQProducer defaultMQProducer = new DefaultMQProducer();
defaultMQProducer.setProducerGroup(producerGroup);
defaultMQProducer.setNamesrvAddr(RocketMQConfig.getNameServer());
defaultMQProducer.setDefaultTopicQueueNums(queueNum);
defaultMQProducer.start();

      代码更改完,必须要测试一把,测试过程中,按照不同比例向其新老集群发送消息,出现的问题是:每次只能向某个集群发送消息,跟踪代码查找问题:

  根据跟踪的标红色代码,同一JVM实例中不管多少Producer,

this.mQClientFactory = MQClientManager.getInstance().getAndCreateMQClientInstance(this.defaultMQProducer, rpcHook);

  得到的都是同一个实例,根据代码:

 public String buildMQClientId() {
        StringBuilder sb = new StringBuilder();
        sb.append(this.getClientIP());

        sb.append("@");
        sb.append(this.getInstanceName());
        if (!UtilAll.isBlank(this.unitName)) {
            sb.append("@");
            sb.append(this.unitName);
        }

        return sb.toString();
    }

        要想不一样,必须对上面代码某些属性修改,所以instanceName或者unitName在此情景下必须不一样,但建议还是显示设置instanceName,这样才能解决此问题,对应消费者也是同样的解决方案。

发布了296 篇原创文章 · 获赞 178 · 访问量 124万+

猜你喜欢

转载自blog.csdn.net/doctor_who2004/article/details/83120396