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

发布于 2022-09-13 01:15:31 字数 781 浏览 25 评论 0

问题描述:版本是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 只会启动一次。” 感觉这个描述好像不太对呀

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

堇年纸鸢 2022-09-20 01:15:31

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

针对您的问题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就行,在生产者和消费者的启动流程中有详细的代码,这里就不多追叙了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文