- 可能原因
可能是Kafka客戶端版本過低或者Consumer沒有獨立線程維持心跳。
v0.10.2之前版本的客戶端:Consumer沒有獨立線程維持心跳,而是把心跳維持與poll接口耦合在一起。其結果就是,如果用戶消費出現卡頓,就會導致Consumer心跳超時,引發Rebalance。
v0.10.2及之后版本的客戶端:如果消費時間過慢,超過一定時間(max.poll.interval.ms設置的值,默認5分鐘)未進行poll拉取消息,則會導致客戶端主動離開隊列,而引發Rebalance。
- 解決方案
首先您需要了解以下幾點信息:
session.timeout.ms:心跳超時時間(可以由客戶端自行設置)。
max.poll.records:每次poll返回的最大消息數量。
v0.10.2之前版本的客戶端:心跳是通過poll接口來實現的,沒有內置的獨立線程。
v0.10.2及之后版本的客戶端:為了防止客戶端長時間不進行消費,Kafka客戶端在v0.10.2及之后的版本中引入了max.poll.interval.ms配置參數。
(1)參考以下說明調整參數值:
session.timeout.ms:v0.10.2之前的版本可適當提高該參數值,需要大于消費一批數據的時間,但不要超過30s,建議設置為25s;而v0.10.2及其之后的版本,保持默認值10s即可。
max.poll.records:降低該參數值,建議遠遠小于<單個線程每秒消費的條數> * <消費線程的個數> *的積。
max.poll.interval.ms:該值要大于 / (<單個線程每秒消費的條數> * <消費線程的個數>)的值。
(2)盡量提高客戶端的消費速度,消費邏輯另起線程進行處理。
(3)減少Group訂閱Topic的數量,一個Group訂閱的Topic最好不要超過5個,建議一個Group只訂閱一個Topic。
(4)將客戶端升級至0.10.2以上版本。