1. 程式人生 > >Kafka——分割槽partition

Kafka——分割槽partition

在之前的例子裡(Kafka生產者——向 Kafka寫入資料), ProducerRecord 物件包含了目標主題、鍵和值。 Kafka 的訊息是 一個個 鍵值對, ProducerRecord物件可以只包含目標主題和值,鍵可以設定為預設的 null,不過大多數應用程式會用到鍵。鍵有兩個用途 :可以作為訊息的附加資訊,也可以用來決定訊息該被寫到主題的哪個分割槽。擁有相同鍵的悄息將被寫到同一個分割槽。 也就是說,如果一個程序只從一個主題的分割槽讀取資料(第 4章會介紹更多細節),那麼具有相 同鍵的所有記錄都會被該程序讀取。要建立一個包含鍵值的記錄,只需像下面這樣建立 ProducerRecord 物件:

如果鍵值為 null, 井且使用了預設的分割槽器,那麼記錄將被隨機地傳送到主題內各個可用的分割槽上。分割槽器使用輪詢(Round Robin)演算法將訊息均衡地分佈到各個分割槽上。

如果鍵不為空,並且使用了預設的分割槽器,那麼Kafka會對鍵進行雜湊(使用 Kafka 自己的雜湊演算法,即使升級Java版本,雜湊值也不會發生變化),然後根據雜湊值把訊息對映到特定的分割槽上。這裡的關鍵之處在於 ,同一個鍵總是被對映到同一個分割槽上 ,所以在進 行對映時,我們會使用主題所有的分割槽,而不僅僅是可用的分割槽 。這也意味著,如果寫入資料的分割槽是不可用的,那麼就會發生錯誤。但這種情況很少發生。我們將在第 6章討論 Kafka 的複製功能和可用性。

只有在不改變主題分割槽數量的情況下,鍵與分割槽之間的對映才能保持不變 。舉個例子,在分割槽數量保持不變的情況下,可以保證使用者 045189 的記錄總是被寫到分割槽 34。在從分割槽讀取資料肘,可以進行各種優化。不過,一旦主題增加了新的分割槽,這些就無法保證 了——舊資料仍然留在分割槽 34,但新的記錄可能被寫到其他分割槽上 。 如果要使用鍵來對映分割槽,那麼最好在建立主題的時候就把分割槽規劃好,而且永遠不要增加新分割槽。

實現自定義分割槽策略

我們已經討論了預設分割槽器的特點,它是使用次數最多的分割槽器。不過 ,除了雜湊分割槽之 外,有時候也需要對資料進行不一樣的分割槽。假設你是一個 B2B 供應商,你有 一 個大客 戶,它是手持裝置 Banana 的製造商。 Banana 佔據了你整體業務 10% 的份額。如果使用默 認的雜湊分割槽算怯, Banana 的賬號記錄將和其他賬號記錄一起被分配給相同的分割槽,導致 這個分割槽比其他分割槽要大一些。伺服器可能因此出現儲存空 間不足、處理緩慢等問題。我 們需要給 Banana 分配單獨的分割槽,然後使用雜湊分割槽算住處理其他賬號 。

下面是一個自定義分割槽器的例子 :