ClientId各种情况默认生成差异

 

低版本RocketMq-client

clientId = ip + "@" + pid + ["@" +unitName]

 

高版本RocketMq-client

clientId = ip + "@" + pid + # + 递增的随机数  + ["@" +unitName]

Rocketmq-client 4.9.1 测试发现生产者、消费者启动(即调用start方法后),如果没有改变系统属性(rocketmq.client.name默认是DEFAULT,也就是instanceName的默认值),则clientId生成会加上递增的随机数,所以一个jvm启动默认clientId不会相同了:

 rocketmq-spring

为什么rocketmq-spring同一个项目中,启动多个消费者,clientId不一致呢,这样我们在一个应用中多个消费者其实是对应不同的clientId的,就不会出现只使用第一个启动的MQClientInstance单例对象了。原因如下:

启动注册DefaultRocketMQListenerContainer该Bean时,由于该Bean实现了org.springframework.beans.factory.InitializingBean#afterPropertiesSet方法所以实例设置属性后,会执行该方法实现如下:

 

①方法如下:

 

 ①处,传入参数nameServer(也就是nameServer集群地址:192.168.11.180:9876;192.168.11.181:9876;192.168.11.182:9876)调用工具类的方法获取了InstanceName,工具类方法如下:

 

 

所以得到的InstanceName = nameServer + "@"+ pid + "@" + 递增的随机数 

此时clientId = ip +  nameServer + "@" + pid + "@" + 递增的随机数  + ["@" +unitName]

例子:

192.168.31.182@192.168.11.180:9876;192.168.11.181:9876;192.168.11.182:9876@83370@318623779020133

192.168.31.182@192.168.11.180:9876;192.168.11.181:9876;192.168.11.182:9876@83370@318733279351010

但是生产者并没这么处理,所以生产者采用的当前rocketmq-client版本的默认生成方法生成clientId。

 

 

 

 
 
 
posted @ 2022-04-18 17:13  迷走神经  阅读(449)  评论(0编辑  收藏  举报