RocketMQ多個namesrv使用遇到的坑

1業務背景

最近在做新老系統的mysql數據同步,由於新系統切換爲微服務,數據結構設計不同,使用RocketMQ進行異步同步數據。
老系統已經有個老版本的MQ集羣,所以在微服務的系統中,需要配置兩個MQ集羣,一個爲新系統服務,另外一個專門爲同步數據到老系統服務。

2代碼

這裏僅僅按照官方文檔示例設置了生產組名和namesrv集羣地址;

新系統如下使用MQ:

private DefaultMQProducer producer=new DefaultMQProducer("accountProducer");
producer.setNamesrvAddr("新系統集羣namesrv地址");
producer.start();
String msgStr = "新系統業務消息內容";
Message msg = new Message(topicName, key, "", msgStr.getBytes());
producer.sendMsg(msg);

老系統如下使用MQ:

private DefaultMQProducer producer=new DefaultMQProducer("asyncToOldSysProducer");
producer.setNamesrvAddr("老系統集羣namesrv地址");
producer.start();
String msgStr = "需要同步到老系統的消息內容";
Message msg = new Message(topicName, key, "", msgStr.getBytes());
producer.sendMsg(msg);

3接口測試

通過控制檯發現後來每次應該發到老系統MQ的消息,都發到新系統MQ集羣裏了,奇怪了半天,檢查老系統的namesrv地址沒有配錯啊,隨後發現是DefaultMQProducer每次都會去用默認的那個MQClient實例,
應該在新系統使用producer實例時,代碼里加上這麼一段顯式設置,纔可以將消息發到老系統MQ集羣。

producer.setInstanceName("AsyncToOldSysProducer");

這樣如願達成效果,數據同步到老系統。

4多個消費者實例

多個消費者實例也需要顯式設置,具體如下:

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("SyncUserToNewConsumer");
        //多個註冊中心時,需要設置instanceName
        consumer.setInstanceName("SyncUserToNewConsumer");
        consumer.setNamesrvAddr(namesrvaddr);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章