rocketmq producer和consumer连接不同的集群,如何隔离
问题背景:
producer连接nameserver1,consumer连接nameserver2,
消费者指定了一个MessageQueueStrategy
服务启动的时候,发现消费者,消费不到topic,
发现的方式是在MessageQueueStrategy,debug发现message queue list,所属的topic并不是需要的topic
原因:
MQClientInstance里面的mQClientAPIImpl,它的nameserver的地址是nameserver1,
导致consumer去获取topic的info的时候,导致无法获取到数据。
原因是rocketmq producer和consumer共享一个MQClientInstance。
RocketMQ通过MQClientManager
维护全局唯一的MQClientInstance
(以clientId作为Key,默认clientId是10.8.0.178@34872这样的形式),同一进程内的Producer和Consumer会复用该实例的网络组件(包括RemotingClient)
计算clientId的方法:org.apache.rocketmq.client.ClientConfig#buildMQClientId
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();
}
解决方案:
给producer和consumer指定instanceName
producer.setInstanceName("Cluster1Instance");
consumer.setInstanceName("Cluster2Instance");