RocketMQ同一個消費者唯一Topic多個tag踩坑經歷

0109發表於2021-02-24

最近做的專案的一個版本需求中,需要用到MQ,對資料記錄進行非同步落庫,這樣可以減輕資料庫的壓力,同時可以抗住大量的資料落庫。這裡需要說明一下本人用到的MQ是公司自己在阿里的RokectMQ的基礎上進行封裝的,然後加上自己的東西,形成個性化的開發,且安全性高。這裡就不多透露相關公司的資訊啦,我就叫它MQ。

       由於剛剛從事JAVA開發這個行業不久,所以在使用到這個MQ的時候本人還是比較陌生的,於是花了一些時間去學習,當然學習的時候能記住的東西還是不多的,因為在學習理論的時候,沒有真正的去實踐,效果不是很明顯,就這樣學的也是雲裡霧裡。對公司的MQ有了最基本的瞭解之後,就開始動手擼程式碼了,在這個需求中引入了公司的MQ依賴jar包,然後在開發環境中配置好相關的MQ資訊,寫了一個消費MQ的類,當然發訊息的程式碼還是很好寫的。

MQ生產者的核心程式碼:

@Autowired
 
private MqsTemplate mqsTemplate ;
 
public void sendMqs(String key, ContentDto dto){
 
String content = JSON.toJSONString(dto);
 
mqsTemplate.sendMessage(content, topic, tag, key);
 
}

MQ消費者的核心程式碼:

BaseConsumer.java
 
public abstract class BaseConsumer implements MqsListener<String>{
 
@Autowired
 
private TestMapperOne testMapperOne;
 
@Autowired
 
private TestMapperTwo testMapperTwo;
 
@Override
 
public void onMessage(String topic, String tag, String key, String message){
 
log.info("topic {} tag {} key {}", topic, tag, key);
 
try{
 
this.consumer(key, message, tag);
 
}catch(Exception e){
 
log.error(String.format("topic %s tag %s key %s message %s), topic, tag, key, message), e);
}
}
protected abstract void consumer(String key, String message, String tag);
}
TestConsumer.java
@Service
@MqsMessageListener(consumerId = "${自己去MQ的頁面去新增就行}"//最開始的寫法(錯誤的寫法)
topicTags = ("${haha.mq.topic:TEST_HAHA}:${haha.mq.topic:TEST_TAG01};" +
"${haha.mq.topic:TEST_HAHA}:${haha.mq.topic:TEST_TAG02}")
//在這裡對於同一個topic,使用“ ; ”分割是不當的,分號分割是指多個topicTags的topic是不同的,如果這裡這樣分割的話,
訊息傳送到MQ去,可以發現訊息確實是傳送到了MQ,但是沒有被消費者消費,這也就是我遇到的坑了,由於開年剛來上班,公司的眾
位大佬還沒來上班,能問的人又很少,於是自己琢磨了一上午。
最終發現,原來是由於我在同一個專案的同一個類上的唯一topic對應了不同的tag,在MQ的頁面可以清晰的看到,後面的tag覆蓋了前面的tag,
顯然這樣是不合理的。 經過查閱資料發現,同一個類上的唯一topic對應不同的tag寫法如下 正確寫法: topicTags
= ("${haha.mq.topic:TEST_HAHA}:${haha.mq.topic:TEST_TAG01}||" + "${haha.mq.topic:TEST_TAG02}") ) 在同一個類中(也就是一個消費者中),同一個topic對應不同的tag,應該使用 “ || ”進行分割,使用""或“*”訂閱所有tag。 public class TestConsumer extends BaseConsumer { //此處程式碼就不寫了,主要就是根據不同的tag,然後把對應的資料請求持久層的介面,進行落庫,當然這裡我是為了省事,才踩到這樣的坑,
其實針對不同的情況,就算是使用同一個topic訂閱,分成兩個類去寫就ok了,在MQ中再新增一個消費者,這樣在同一個專案的不同消費者類中,
一個topic對應一個tag。就算它們兩個的topic是一樣的都是沒關係的,而且這樣別人看起你的程式碼來,也是非常直觀的,層次分明。
}

PS:這裡補充一下

@MqsMessageListener 是消費者監聽註解,用於發現消費者,以及屬性包括消費所有單一功能的註解,作用在類上面。

以上就是踩到的RocketMQ的坑,由於開發經驗有限,技術粗糙,上文的描述可能不是太清晰,可能會出現誤點或者錯誤的地方,望大家給予建議,我加以改進,共同進步!

覺得此文不錯的,點贊轉發,本人非常感謝!

相關文章