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);