1. 程式人生 > >RocketMQ讀書筆記7——吞吐量優先的場景

RocketMQ讀書筆記7——吞吐量優先的場景

【Broker端進行訊息過濾】

在Broker端進行訊息過濾,可以減少無效訊息傳送到Consumer,少佔用網路寬頻從而提高吞吐量。

 

【過濾方式1——通過Tag過濾】

[ 關於Tag和Key ]

  對一個應用來說,儘可能只用一個Topic,不同訊息子型別用Tag來標識,每條訊息只能有一個Tag,服務端基於Tag進行過濾,並不需要讀取訊息體的內容,效率較高。Producer傳送訊息設定了Tag以後,Consumer在訂閱訊息時,才會利用Tag在Broker端做訊息過濾。

  訊息的Key,傳送的訊息設定好Key,以後可以根據這個Key來查詢訊息,這個Key一般用訊息在業務層面的唯一標識碼識別,這樣後續查詢訊息異常、訊息丟失等都很方便。Broker會建立專門的索引檔案,來儲存Key到訊息的對映,由於Hash索引,應儘量使Key唯一,避免潛在的Hash衝突。

  Tag和Key主要差別是試用場景不同,Tag用在Consumer的程式碼彙總,用來進行服務端訊息過濾,Key主要用於通過命令列查詢訊息。

[ 通過Tag進行訊息過濾 ]

  Tag標籤是一個普通字串,在建立Message時新增,一個Message只能有一個Tag,使用Tag方式過濾非常高效,Broker端可以在ConsumerQueue中做這種過濾,只從CommitLog裡讀取過濾後被命中的訊息。

Consumer的儲存格式如下:

ConsumerQueue的第三部分儲存的是Tag對應的HashCode,是一個定長的字串通過Tag過濾的過程就是對比定長的Hashcode,經過hashcode對比,符合要求的訊息從CommitLog中讀取出來,不用擔心Hash衝突問題,訊息在被消費前,會對比完整的MessageTag字串,消除Hash衝突造成的誤讀。

 

【過濾方式2——用SQL表示式的方式進行過濾】

Tag方式雖然高效,但是支援的邏輯比較簡單。

在Producer端構造Message時,還可以通過putUserProperty方法來增加多個自定義的屬性,基於這些屬性可以做複雜的過濾邏輯。