Kafka Consumer 分割槽消費策略

2021-10-05 20:49:06 字數 1012 閱讀 9775

本文主要對 consumer 端對partition的分配策略進行分析。

kafka 分割槽分配的規則是乙個分割槽只能被乙個消費者組的某個消費者進行消費。並且kafka會在此規則下實現消費資料的負載均衡。

kafka 提供的分割槽策略有三種,分別是 range、roundrobin和sticky,其中預設策略為range。

range策略首先會對乙個topic下的所有分割槽進行排序,之後確認當前消費組共有多少個消費者並進行排序,然後用分割槽數除以消費者數得到每個消費者所消費的分割槽數目,如果除不盡,那麼排序靠前的幾個消費者將會多消費乙個分割槽的資料,之後根據消費者消費的分割槽數目從第乙個分割槽開始分配。

我們假設 topic1 存在 5 個分割槽 p0、p1、p2、p3和p4,某個消費組group1存在 2 個消費者 c0和c1。按照上述過程,首先確定了每個消費者消費2個分割槽,但是發現除不盡,所以靠前c0將會多消費乙個分割槽,所以c0將會消費3個分割槽,c1消費2個分割槽。然後從第乙個分割槽開始分配,分配結果為 c0:p0、p1、p2;c1:p3、p4,如下圖:

roundrobin是一種輪詢的概念,kafka首先會對乙個topic下的所有分割槽進行排序,同時也會對當前消費者下的所有消費者進行排序,之後進行一對一的分配,也就是第乙個分割槽對應第乙個消費者,依次類推,當消費者分配一遍之後,再將剩餘的分割槽從第乙個消費者開始分配,直至所有分割槽分配完成。

我們假設和range中的資料一致,按照上述過程,p0–>c0,p1–>c1,p2–>c0,p3–>c1,p4–>c0,如下圖:

sticky分配策略,這種分配策略是在kafka的0.11.x版本才開始引入的,是目前最複雜也是最優秀的分配策略。

sticky分配策略的原理比較複雜,它的設計主要實現了兩個目的:

詳細的分析可見:

kafka consumer深度剖析

producer通過主動push的方式將訊息發布到broker consumer通過pull從broker消費資料,pull的好處 每個partition有乙個leader 和若干個follower replica kafka資料的讀寫都是找leader來完成的,那leader 的負載怎麼解決呢?l...

kafka consumer防止資料丟失

kafka最初是被linkedin設計用來處理log的分布式訊息系統,因此它的著眼點不在資料的安全性 log偶爾丟幾條無所謂 換句話說kafka並不能完全保證資料不丟失。儘管kafka官網聲稱能夠保證at least once,但如果consumer程序數小於partition num 這個結論不一...

kafka consumer防止資料丟失

kafka最初是被linkedin設計用來處理log的分布式訊息系統,因此它的著眼點不在資料的安全性 log偶爾丟幾條無所謂 換句話說kafka並不能完全保證資料不丟失。儘管kafka官網聲稱能夠保證at least once,但如果consumer程序數小於partition num,這個結論不一...