我們都都知道kafka的消費組要rebalance,需要觸發以下3個條件之一: 組成員變更,比如新consumer加入組,或已有consumer主動離開組,再或是已有consumer崩潰時則出發rebalance. 組訂閱topic數發生變更,比如使用基於正則表達式的訂閱,當匹配正則表達式的新top ...
我們都都知道kafka的消費組要rebalance,需要觸發以下3個條件之一:
- 組成員變更,比如新consumer加入組,或已有consumer主動離開組,再或是已有consumer崩潰時則出發rebalance.
- 組訂閱topic數發生變更,比如使用基於正則表達式的訂閱,當匹配正則表達式的新topic被創建時則會出發rebalance.
- 組訂閱topic的分區數發生變更,如何使用命令行腳本增加了訂閱topic的分區數
但是我在學習kafka過程中,看到別人遇到一種情況,也會發生kafka rebalance:
該組下的consumer的要處理消息的邏輯過重。
以下是原話:筆者曾經遇到過一個Kafka的線上環境,發現該環境的consumer group頻繁的進行rebalance,但組內所有consumer程式都未出現崩潰的情況,另外消費組的訂閱情況也從未發生過變更。經過一番詳細的分析,最後筆者定位了原因:該group下的consumer處理消息的邏輯過重,而且時間時間波動很大,非常不穩定,從而導致coordinator會經常性的認為某個consumer已經掛掉,引發rebalance。而consumer程式中包含了錯誤重試代碼,使得落後過多的consumer會不斷的申請重新加入組,最後表現為coordinator不停的對group執行rebalance,極大降低了consumer端的吞吐量。鑒於目前一次rebalance操作的開銷很大,生產環境中用戶一定要結合自身業務特點仔細調優consumer參數request.timeout.ms、max.poll.records、和max.poll.interval.ms,以避免不必要的rebalance出現。