rocketmq 启动多个生产者实例

最近在公司的项目中遇到一个坑,在一个应用里面启动多个实例的时候消息总是只能发送到其中一个实例对应的mq服务器上去,通过反射跟踪发现这2个实例的brokerAddrTable地址是一样的,开始还以为是配置设置的NamesrvAddr不对,后面打印出来发现NamesrvAddr是正常的,但是brokerAddrTable就是不对,始终指向第一个启动的brokerAddrTable地址。后面跟踪源代码发现在再启动生产者的时候会创建一个mqclient的工厂(如下),

跟进工厂方法,发现它是从一个map里面获取对应的实例,map的key就是clientid,

从下面的源代码中我们可以看到clientid是通过clientip和实例名称还有unitname组成的,instacename是从系统属性中获取的,默认是default。如果是默认值,启动的时候mq会将instancename设置为当前的进程id。也就是说我们创建client的时候如果不设置instancename,那么同一个应用中所用的client都是同一个。即使设置了NamesrvAddr,也只是改变了NamesrvAddr这个属性,它对应的实例发送通道还有其他的心跳还是同一个。如果我们想创建多个实例,那么必须设置不同instancename

猜你喜欢

转载自blog.csdn.net/u012477338/article/details/81475659