當消費客戶端出現Rebalance時,您可以查看Rebalance的詳情,包括Rebalance的時間、耗時、次數、原因以及是否有新成員加入。
背景信息
Rebalance是云消息隊列 Kafka 版對分區和Consumer Group之間的消費對應關系進行重分配的過程。消費客戶端出現Rebalance可能是以下原因:
當消費者主動新增訂閱或者取消訂閱時,會觸發該Consumer Group內的Rebalance。
當Topic的分區數量發生變化時,會觸發Rebalance。
當Consumer Group內的消費者成員數量增加或者減少時,會觸發Rebalance。
消費出現卡頓,導致消費者心跳超時,觸發Rebalance來篩選不健康的消費者。
消費時間過慢,超過一定時間(
max.poll.interval.ms
設置的值,默認5分鐘)未進行Pull拉取消息,則會導致客戶端主動離開隊列,觸發Rebalance。消費者數量過多,為避免當前Topic-Partition的任務浪費,需要關閉一定數量的消費者,觸發Rebalance。
消費者數量不足,當前Topic-Partition的任務出現延遲,需要增加一定數量的消費者,觸發Rebalance。
操作步驟
登錄云消息隊列 Kafka 版控制臺,在左側導航欄,單擊實例列表。
在頂部菜單欄,選擇地域,然后在實例列表頁面單擊目標實例名稱。
在左側導航欄,單擊Group 管理,然后單擊目標Group名稱。
在Group詳情頁面,單擊Rebalance 詳情頁簽。
為什么客戶端頻繁出現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以上版本。