最近在做新老系統的mysql資料同步,由於新系統切換為微服務,資料結構設計不同,使用rocketmq進行非同步同步資料。
老系統已經有個老版本的mq集群,所以在微服務的系統中,需要配置兩個mq集群,乙個為新系統服務,另外乙個專門為同步資料到老系統服務。
這裡僅僅按照官方文件示例設定了生產組名和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);
通過控制台發現後來每次應該發到老系統mq的訊息,都發到新系統mq集群裡了,奇怪了半天,檢查老系統的namesrv位址沒有配錯啊,隨後發現是defaultmqproducer每次都會去用預設的那個mqclient例項,
應該在新系統使用producer例項時,**裡加上這麼一段顯式設定,才可以將訊息發到老系統mq集群。
producer.
setinstancename
("asynctooldsysproducer"
);
這樣如願達成效果,資料同步到老系統。
多個消費者例項也需要顯式設定,具體如下:
defaultmqpushconsumer consumer =
newdefaultmqpushconsumer
("syncusertonewconsumer");
//多個註冊中心時,需要設定instancename
consumer.
setinstancename
("syncusertonewconsumer");
consumer.
setnamesrvaddr
(namesrvaddr)
;
RocketMQ建立多個消費者問題分析
在乙個程序中同乙個消費組建立多個消費者會出現the consumer group groupname has been created before,specify another name please.defaultmqpushconsumer consumer1 new defaultmqpu...
RocketMQ訊息型別
普通資訊也叫做無序訊息,簡單來說就是沒有順序的訊息,producer 只管傳送訊息,consumer 只管接收訊息,至於訊息和訊息之間的順序並沒 可能先傳送的訊息先消費,也可能先傳送的訊息後消費。舉個簡單例子,producer 依次傳送 order id 為 1 2 3 的訊息到 broker,co...
RocketMQ架構原理
結合部署結構圖,描述集群工作流程 1,啟動namesrv,namesrv起來後監聽埠,等待broker produer consumer連上來,相當於乙個路由控制中心。2,broker啟動,跟所有的namesrv保持長連線,定時傳送心跳包。心跳包中包含當前broker資訊 ip 埠等 以及儲存所有t...