在 SOFAStack 消息隊列中,Topic 與 Tag 都是業務上用來歸類的標識,區分在于 Topic 是一級分類,而 Tag 可以理解為是二級分類。您可通過本文了解如何搭配使用 Topic 和 Tag 來實現消息過濾。
背景信息
Topic 和 Tag 的定義如下:
Topic:消息主題,通過 Topic 對不同的業務消息進行分類。
Tag:消息標簽,用來進一步區分某個 Topic 下的消息分類,消息從生產者發出即帶上的屬性。
Topic 和 Tag 的關系如下圖所示。
適用場景
您可能會有這樣的疑問:到底什么時候該用 Topic,什么時候該用 Tag?
建議您從以下幾個方面進行判斷:
消息類型是否一致:如普通消息、事務消息、定時或延時消息、順序消息,不同的消息類型使用不同的 Topic。創建 Topic 時需要指定消息類型,無法通過 Tag 進行區分。
業務是否相關聯:沒有直接關聯的消息,如支付消息、芝麻信用消息、會員消息可以使用不同的 Topic 進行區分;而同樣是支付消息,如付款、紅包到賬、轉賬等消息可以用 Tag 進行區分。
消息量級是否相當:有些業務消息雖然量小但是實時性要求高,如果跟某些萬億量級的消息使用同一個 Topic,則有可能會因為過長的等待時間而“餓死”,此時需要將不同量級的消息進行拆分,使用不同的 Topic。
總的來說,針對消息分類,您可以選擇創建多個 Topic,或者在同一個 Topic 下創建多個 Tag。但通常情況下,不同的 Topic 之間的消息沒有必然的聯系,而 Tag 則用來區分同一個 Topic 下相互關聯的消息,例如全集和子集的關系、流程先后的關系。
注意事項
同一個 Topic 下有多個 Tag 的情況時,無法區分每個 Tag 的消費進度、消息積壓數量等,且 Tag 間相互影響。例如 Topic 下分為 Tag 1 和 Tag 2,假如 Tag 2 消費較慢會導致同一 Topic 下的 Tag 1 同樣消費速度減慢;假如實際 Tag 1 積壓 100,Tag 2 積壓 200,最終只能確定該 Topic 的整體消費進度、積壓量為 300,無法準確區分出每個 Tag 的消費進度和積壓數量。
如為避免 Tag 間相互影響需要申請接入多個 Topic,請自行評估整體峰值,超過 5000 Quota 需向消息隊列提供機器資源。