消息分區策略 這裡不是說Kafka的主題為什麼要分區,而是說在分區的結構下,如何讓具有某種特點的消息發送到特定分區。 這裡有一個很明顯的問題,就是主題分區,那麼生產者發送的消息到底被髮送到了哪個分區呢?一般我們都知道有輪詢機制或者是隨機機制,這兩種機制都比較好理解。而且Kafka也都支持,在新版本中 ...
消息分區策略
這裡不是說Kafka的主題為什麼要分區,而是說在分區的結構下,如何讓具有某種特點的消息發送到特定分區。
這裡有一個很明顯的問題,就是主題分區,那麼生產者發送的消息到底被髮送到了哪個分區呢?一般我們都知道有輪詢機制或者是隨機機制,這兩種機制都比較好理解。而且Kafka也都支持,在新版本中預設使用的是輪詢機制,如下圖所示:
但是在某些場景下我們需要控制某種類型的消息發送到特定分區或者說我們需要嚴格的進行消息的順序消費,也就是說這些消息有因果關係,要想消費下一條必須先要消費前一條。消費者消費某個分區的消息肯定是順序消費,但是由於消息不是順序進入分區的,你可以從上圖看到0002消息並不是在0001消息之後,這就導致有可能消費者程式先消費了0002。如果這些消息沒有因果關係那麼則沒問題,只要保證消費者都消費完就可以了至於先後順序無需關心。但是如果有因果關係就不行,這樣會造成混亂。
要想實現因果關係的消費可以有2個辦法
單分區模式
我們創建一個具有單分區的主題,這樣消息就順序進入分區,消費者也就順序消費。這樣實現了全局順性,不過這樣就降低了吞吐量。
基於消息Key的分區策略
這種就是為消息設置Key,Key相同的發送到同一分區。要註意這裡雖然是多個分區看似吞吐量增加,但是你可以設想一下如果你的因果消息Key都一樣那麼這種模式和上面的單分區模式其實一樣。如果你的因果消息可以繼續細分為幾個不同的Key,那麼在多分區模式下相對於整體來講吞吐量是提高的。