现象
容器化后,不同的RocketMQ的consumer部署在同一个容器。某开发小年轻和我说会导致client的InstanceName重复。
解决
查看代码
DefaultMQPushConsumerImpl#start
if (this.defaultMQPushConsumer.getMessageModel() == MessageModel.CLUSTERING) {
this.defaultMQPushConsumer.changeInstanceNameToPID();
}
public void changeInstanceNameToPID() {
if (this.instanceName.equals("DEFAULT")) {
this.instanceName = String.valueOf(UtilAll.getPid());
}
}
public static int getPid() {
RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
String name = runtime.getName(); // format: "pid@hostname"
try {
return Integer.parseInt(name.substring(0, name.indexOf('@')));
} catch (Exception e) {
return -1;
}
}
乍一看,发现还真的有问题,然后搜索官方issue
https://github.com/apache/rocketmq/issues/667
再看在docker环境下(使用host模式),获取到的clientIp和pid都是一样的。当然clientIp一样的确切原因还没完全确认
确认我们的docker模式,发现并没有使用host模式,所以没有问题。
这个故事告诉我们,遇到问题,还是要自己查一遍。