RocketMq--key和tag的作用及容易踩坑的點


Producer 實例

Producer 的一個對象實例,不同的 Producer 實例可以運行在不同進程內或者不同機器上。Producer 實例線程安全,可在同一進程內多線程之間共 享。

Message Key

Key 一般用於消息在業務層面的唯一標識。對發送的消息設置好 Key,以后可以根據這個 Key 來查找消息。比如消息異常,消息丟失,進行查找會很 方便。RocketMQ 會創建專門的索引文件,用來存儲 Key 與消息的映射,由於是 Hash 索引,應盡量使 Key 唯一,避免潛在的哈希沖突。
TagKey 的主要差別是使用場景不同,Tag 用在 Consumer 代碼中,用於服務端消息過濾,Key 主要用於通過命令進行查找消息
RocketMQ 並不能保證 message id 唯一,在這種情況下,生產者在 push 消息的時候可以給每條消息設定唯一的 key, 消費者可以通過 message key 保證對消息冪等處理。

Tag

消息標簽,二級消息類型,用來進一步區分某個 Topic 下的消息分類。
TopicTag 都是業務上用來歸類的標識,區分在於 Topic 是一級分類,而 Tag 可以理解為是二級分類。
以天貓交易平台為例,訂單消息和支付消息屬於不同業務類型的消息,分別創建 Topic_OrderTopic_Pay,其中訂單消息根據商品品類以不同的 Tag 再進行細分,如電器類、男裝類、女裝類、化妝品類,最后他們都被各個不同的系統所接收。
通過合理的使用 TopicTag,可以讓業務結構清晰,更可以提高效率。


貨源topic,tag有上架,下架,成交等類型,就是這么用的。下面說說坑點

1.啟動消費者1,消費組為group1,訂閱topicA的消息,tag設置為tag1 || tag2

2.啟動消費者2,消費組也為group1,也訂閱topicA的消息,但是tag設置為tag3

3.啟動生產者,生產者發送含有tag1,tag2,tag3的消息各10條

4.消費者1沒有收到任何消息,消費者2收到部分消息

先上結論

同一個消費組中,設置不同tag時,后啟動的消費者會覆蓋先啟動的消費者設置的tag

tag決定了消息過濾的條件,經過服務端和客戶端兩層過濾,最后只有后啟動的消費者才能收到部分消息

這個問題和兩個CONSUMER使用一個consumerGroup,但是訂閱兩個Topic是一樣的。都是consumer會通過心跳把訂閱信息傳給服務器,服務器上訂閱信息是一個map,map的key就是consumerGroup,所以后面的會覆蓋前面的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM