可能是雲訊息佇列 Kafka 版用戶端版本過低或者Consumer沒有獨立線程維持心跳。
問題現象
使用ApsaraMQ for Kafka時,消費用戶端頻繁出現Rebalance。
可能原因
可能導致故障的原因包括:
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
配置參數。
參考以下說明調整參數值:
session.timeout.ms:v0.10.2之前的版本可適當提高該參數值,需要大於消費一批資料的時間,但不要超過30s,建議設定為25s;而v0.10.2及其之後的版本,保持預設值10s即可。
max.poll.records:降低該參數值,建議遠遠小於
<單個線程每秒消費的條數> * <消費線程的個數> *<max.poll.interval.ms>
的積。max.poll.interval.ms:該值要大於
<max.poll.records> / (<單個線程每秒消費的條數> * <消費線程的個數>)
的值。
盡量提高用戶端的消費速度,消費邏輯另起線程進行處理。
減少Group訂閱Topic的數量,一個Group訂閱的Topic最好不要超過5個,建議一個Group只訂閱一個Topic。
將用戶端升級至0.10.2以上版本。