RocketMQ多個namesrv使用遇到的坑

2021-10-01 07:55:38 字數 1520 閱讀 5841

最近在做新老系統的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...