kafka入門第三篇 生產者消息分區機制原理剖析


1.為什么分區
kafka有主題(Topic)的概念,它是承載真實數據的邏輯容器,而在主題之下還分為若干個分區,也就是說kafka的消息組織方式實際上是三級結構: 主題---分區---消息。主題下的每條消息只會保存在某一個分區中,而不會在多個分區中保存多份。官網上的這張圖非常清晰地展示了kafka的三級結構,如下:
其實分區的作用就是提供負載均衡的能力,或者說對數據進行分區的主要原因,就是為了實現系統的高伸縮性。不同的分區能夠放置到不同節點機器上,而數據庫的讀寫操作也都是針對分區這個粒度而進行的,這樣每個節點的機器都能獨立的執行各自分區的讀寫請求處理。並且,我們還可以通過添加新的節點記起來增加整體系統的吞吐量。
 
2.都有那些分區策略
所謂的分區策略是決定生產者將消息發送到那個分區的算法。kafka為我們提供了默認的分區策略,同時它也支持你自定義的分區策略。常見的分區策略就那么幾種,如下:
  1. 輪訓策略
輪訓策略,也稱Round-robin策略,即順序分配。比如下面一個主題有三個分區,那么第一條消息被發送到分區0,第二條消息被發送到分區1,第三條消息被發送到分區2,一次類推,第四條消息又被發送到分區0,就像下面這張圖:
如果未指定分區策略那么生產者程序會按照輪訓的方式在主題的所有分區中寫入消息。
輪訓策略是非常有優勢的負載均衡表現,它總是能保證消息最大限度的被平均分配到所有分區上,故默認情況下它是最合理的分區策略,也是我們常用的分區策略之一。
  1. 隨機策略
隨機策略也稱Randomness策略,所謂隨機就是我們隨機的將消息發送到一個分區上,如下面這張圖所示:
先計算出該主題的分區數,然后隨機的返回一個小於它的整數。
本質上看隨機策略也力求將消息均勻的分配到的所有的分區中,但是從實際表現來看,它的表現是不如輪訓策略的。
  1. 按消息健保序策略
kafka允許為每條消息定義消息建,簡稱Key。這個Key可以是有着明確業務含義的字符串;也可以用來表征消息元數據。
特別是在kafka不支持時間戳的年代,在一些場景中,工程師們都是將消息創建時間分裝進Key里面。一旦消息被定義了key,那么你就可以保證同一個key的所有消息都進入到相同的分區里面,由於每個分區下的消息處理都是有順序的,故這個策略被稱為按消息健保序策略,如下圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM