为什么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 只会启动一次。” 感觉这个描述好像不太对呀
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
因为本人没有看您的代码,所以对您的问题我做了一点假设。中途可能会有漏洞,希望可以在评论区指出。
针对您的问题Q1,是拥有同一个
MQClientInstance
的,不论是在生产者还是消费者启动的时候,都可以看到相一段代码:后续的生产者和消费者都会往
MQClientInstance
中注册,也就是说MQClientInstance
管理了所有的生产者和消费者,而MQClientManager
这个类管理了所有的MQClientInstance
.不同的MQClientManager
在MQClientManager
上以ClientID
区分,那么我们来看ClientID
如何生成就可以得到答案了。我觉得这段代码已经足够清晰了,
ClientID
分为了三部分:ClientIP、InstanceName、unitName。其中ClientIP区分了不同机器上的MQClientInstance
实例,InstanceName区分了一台机器不同JVM的实例,而unitName区分了同一个JVM的实例。它们以@作为分区。再看您展示出来
MQClientManager
信息更很好理解了。192.168.102.98@6323@172.102.12.22:9876
就是我说的这三个部分。至于您为什么会有两个不一致的
ClientID
就可以看看您的InstanceName
就行,在生产者和消费者的启动流程中有详细的代码,这里就不多追叙了。