Kafka 實務坑筆記(六):無限 Rebalance 的噩夢

問題現象

某個 Topic 一直卡在 Rebalance 狀態:

  • 管理工具顯示有 2 個 Consumer
  • 一直在重新 Rebalance
  • 新加入的 Consumer 可以正常取到 Queue
  • Partition 分配看起來也正常

Kafka 機制正常,但就是停不下來。

問題分析

Rebalance 循環

  1. 進入 Preparing Rebalance
  2. 進入 Completing Rebalance
  3. 進入 Stable ✓
  4. 又回到 Preparing Rebalance ← 異常!
  5. 再次 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 風暴的關鍵。

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *