Producer 實例
Producer 的一個對象實例,不同的 Producer 實例可以運行在不同進程內或者不同機器上。Producer 實例線程安全,可在同一進程內多線程之間共 享。
Message Key
Key 一般用於消息在業務層面的唯一標識。對發送的消息設置好 Key,以后可以根據這個 Key 來查找消息。比如消息異常,消息丟失,進行查找會很 方便。RocketMQ 會創建專門的索引文件,用來存儲 Key 與消息的映射,由於是 Hash 索引,應盡量使 Key 唯一,避免潛在的哈希沖突。
Tag 和 Key 的主要差別是使用場景不同,Tag 用在 Consumer 代碼中,用於服務端消息過濾,Key 主要用於通過命令進行查找消息
RocketMQ 並不能保證 message id 唯一,在這種情況下,生產者在 push 消息的時候可以給每條消息設定唯一的 key, 消費者可以通過 message key 保證對消息冪等處理。
Tag
消息標簽,二級消息類型,用來進一步區分某個 Topic 下的消息分類。
Topic 與 Tag 都是業務上用來歸類的標識,區分在於 Topic 是一級分類,而 Tag 可以理解為是二級分類。
以天貓交易平台為例,訂單消息和支付消息屬於不同業務類型的消息,分別創建 Topic_Order 和 Topic_Pay,其中訂單消息根據商品品類以不同的 Tag 再進行細分,如電器類、男裝類、女裝類、化妝品類,最后他們都被各個不同的系統所接收。
通過合理的使用 Topic 和 Tag,可以讓業務結構清晰,更可以提高效率。
貨源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,所以后面的會覆蓋前面的。