問題現象
某個 Topic 一直卡在 Rebalance 狀態:
- 管理工具顯示有 2 個 Consumer
- 一直在重新 Rebalance
- 新加入的 Consumer 可以正常取到 Queue
- Partition 分配看起來也正常
Kafka 機制正常,但就是停不下來。
問題分析
Rebalance 循環
- 進入 Preparing Rebalance
- 進入 Completing Rebalance
- 進入 Stable ✓
- 又回到 Preparing Rebalance ← 異常!
- 再次 Stable
正常情況下,到達 Stable 後不應該再回到 Preparing Rebalance。
根本原因
有一個幽靈 Consumer 沒有被正確關閉:
- 可能是之前測試遺留的
- 可能在背景執行緒中
- 不斷觸發 Rebalance
解決方案
步驟一:找出所有 Consumer
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group your-group-name
步驟二:識別異常 Consumer
檢查 Consumer ID 和 Host,找出不應該存在的連線。
步驟三:強制移除
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--delete --group your-group-name
或者找到並終止對應的 Process。
預防措施
1. Consumer 生命週期管理
- 使用
try-finally確保關閉 - 設定 Shutdown Hook
- 容器環境使用優雅關閉
2. 監控機制
- 監控 Consumer Group 狀態
- 設定 Rebalance 次數告警
- 定期檢查 Consumer 數量
3. 命名規範
// 好的命名:包含環境和實例信息
client.id = prod-order-processor-1
// 方便追蹤和管理
Kafka Consumer Group 狀態解析
| 狀態 | 含義 | 處理建議 |
|---|---|---|
| Stable | 正常運作 | 無需處理 |
| Preparing Rebalance | 有成員變動 | 觀察是否持續 |
| Completing Rebalance | 分配中 | 等待完成 |
| Empty | 無成員 | 檢查 Consumer 是否正常 |
| Dead | 已刪除 | 重新建立 |
管理好 Consumer 的生命週期,是避免 Rebalance 風暴的關鍵。
發佈留言