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");
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/249107.html
如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!