
Kafka保證同一consumer group中只有一個consumer會消費某條消息,實際上,Kafka保證的是穩定狀態下每一個consumer實例只會消費某一個或多個特定的數據,而某個partition的數據只會被某一個特定的consumer實例所消費。這樣設計的劣勢是無法讓同一個consumer group里的consumer均勻消費數據,優勢是每個consumer不用都跟大量的broker通信,減少通信開銷,同時也降低了分配難度,實現也更簡單。另外,因為同一個partition里的數據是有序的,這種設計可以保證每個partition里的數據也是有序被消費。
如果某consumer group中consumer數量少於partition數量,則至少有一個consumer會消費多個partition的數據,如果consumer的數量與partition數量相同,則正好一個consumer消費一個partition的數據,而如果consumer的數量多於partition的數量時,會有部分consumer無法消費該topic下任何一條消息。
Consumer Rebalance算法如下 :
1. 將目標 topic 下的所有 partirtion 排序,存於PT
2. 對某 consumer group 下所有 consumer 排序,存於 CG,第 i 個consumer 記為 Ci
3. N=size(PT)/size(CG),向上取整
4. 解除 Ci 對原來分配的 partition 的消費權(i從0開始)
5. 將第i*N到(i+1)*N-1個 partition 分配給 Ci
目前consumer rebalance的控制策略是由每一個consumer通過Zookeeper完成的。具體的控制方式如下:
在/consumers/[consumer-group]/下注冊id
設置對/consumers/[consumer-group] 的watcher
設置對/brokers/ids的watcher
zk下設置watcher的路徑節點更改,觸發consumer rebalance
在這種策略下,每一個consumer或者broker的增加或者減少都會觸發consumer rebalance。因為每個consumer只負責調整自己所消費的partition,為了保證整個consumer group的一致性,所以當一個consumer觸發了rebalance時,該consumer group內的其它所有consumer也應該同時觸發rebalance。
Herd effect
任何broker或者consumer的增減都會觸發所有的consumer的rebalance
Split Brain
每個consumer分別單獨通過Zookeeper判斷哪些partition down了,那么不同consumer從Zookeeper“看”到的view就可能不一樣,這就會造成錯誤的reblance嘗試。而且有可能所有的consumer都認為rebalance已經完成了,但實際上可能並非如此。
---------------------
作者:_北方的雪_
來源:CSDN
原文:https://blog.csdn.net/wingofeagle/article/details/60966125
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!