为什么rocketMQ默认情况下没有将一个JVM内的所有的生产者和消费者都放置在同一个MQClientInstance下?

问题描述:版本是4.3. 代码就是 创建一个Consumer一个Producer,两者都是使用了默认的属性,仅指定topic,group nameServer必要属性。 这个时候发现 consumer的clientId是 localIp@Pid@NameServerAddr ,而producer的clientId是localIp@Default@nameServerAddr。 由于clientId不同 rocketMQ内部会创建两个MQClientInstance

Q1: 为什么默认情况下 (也就是 创建consumer和Producer仅指定必要信息,其他属性信息都使用默认值)同一个JVM内的consumer和producer 没有共用同一个MQClientInstance? 毕竟每启动一个MQClientInstance,MQClientInstance会启动一些其他定时任务与nameServer进行同步数据。

下面内容就是一个JVM内的两个MQClientInstance
{192.168.102.98@6323@172.102.12.22:9876=org.apache.rocketmq.client.impl.factory.MQClientInstance@5c01e5c0, 192.168.102.98@DEFAULT@172.102.12.22:9876=org.apache.rocketmq.client.impl.factory.MQClientInstance@90118cf}

Q2:某书中 提到 “ 在一个 JVM中的所有消费者、生产者持有同一个 MQClientlnstance, MQClientlnstance 只会启动一次。” 感觉这个描述好像不太对呀

阅读 2k
1 个回答

因为本人没有看您的代码,所以对您的问题我做了一点假设。中途可能会有漏洞,希望可以在评论区指出。

针对您的问题Q1,是拥有同一个MQClientInstance的,不论是在生产者还是消费者启动的时候,都可以看到相一段代码:

// DefaultMQProducerImpl.java & DefaultMQPushConsumerImpl.java
this.mQClientFactory = MQClientManager.getInstance().getOrCreateMQClientInstance(this.defaultMQProducer, rpcHook);

后续的生产者和消费者都会往MQClientInstance中注册,也就是说MQClientInstance管理了所有的生产者和消费者,而MQClientManager这个类管理了所有的MQClientInstance.不同的MQClientManagerMQClientManager上以ClientID区分,那么我们来看ClientID如何生成就可以得到答案了。

    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();
    }

我觉得这段代码已经足够清晰了,ClientID分为了三部分:ClientIP、InstanceName、unitName。其中ClientIP区分了不同机器上的MQClientInstance实例,InstanceName区分了一台机器不同JVM的实例,而unitName区分了同一个JVM的实例。它们以@作为分区。

再看您展示出来MQClientManager信息更很好理解了。
192.168.102.98@6323@172.102.12.22:9876就是我说的这三个部分。

至于您为什么会有两个不一致的ClientID就可以看看您的InstanceName就行,在生产者和消费者的启动流程中有详细的代码,这里就不多追叙了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题