訊息堆積(Message Lag)是 Kafka使用中常見的監控指標之一。合理理解與處理訊息堆積,是保證系統穩定性、即時性和資料一致性的核心。
什麼是Kafka訊息堆積
Kafka訊息堆積是指:消費者未能及時消費生產者寫入的訊息,導致未被消費的訊息在分區中“積壓”。
訊息堆積總量 = 最大位點(全部分區) - 消費位點(全部分區)
訊息堆積總量越大,堆積越嚴重。
訊息堆積總量趨近於0表示消費者跟上了生產速度。
Topic: test (Partition 0)
+----+----+----+----+----+----+----+
| M1 | M2 | M3 | M4 | M5 | M6 | M7 | ← 已寫入的 7 條訊息
+----+----+----+----+----+----+----+
↑ ↑
消費位點 M3 最大位點(M7)
Topic: test (Partition 1)
+----+----+----+----+----+----+
| M1 | M2 | M3 | M4 | M5 | M6 | ← 已寫入的 6 條訊息
+----+----+----+----+----+----+
↑ ↑
消費位點 M3 最大位點(M6)
當前 訊息堆積總量 = 7 - 3 + 6 - 3 = 7
還有 7 條訊息未消費 → 堆積 7 條雲訊息佇列 Kafka 版為解決某些警示問題,允許通過重設消費位點將Topic分區消費位點設定為0,當消費位點為0時,堆積為0。
當消費位點不存在時(Consumer未提交過位點;消費位點到期清理),若Group中有消費線程線上,則
訊息堆積總量 = 最大位點(全部分區) - 最小位點(全部分區);若Group中消費線程均離線,則堆積為0。
訊息堆積的根本原因
消費者處理能力不足:處理邏輯複雜、I/O慢、CPU/記憶體瓶頸。
生產速度突然激增:流量高峰、大量匯入。
消費者宕機或重啟頻繁:Crash、GC長停頓、部署更新。
再均衡(Rebalance)頻繁:消費者頻繁進出、心跳逾時、會話逾時。
消費者代碼問題:死迴圈、異常未捕獲、
poll()間隔過長。消費限流:消費速度達到執行個體預留/彈性上限。
Offset提交延遲或失敗:導致重複拉取、假性堆積。
如何查看訊息堆積
詳情請參見以下文檔中關於堆積的指標:
訂用帳戶/隨用隨付版儀錶盤:Prometheus監控
Serverless版儀錶盤:儀錶盤
訊息堆積的影響
即時性下降:資料處理延遲增加,影響業務決策。
系統響應變慢:消費者線程阻塞,可能引發逾時、熔斷。
Rebalance風險升高:消費者處理延遲導致心跳逾時,進而觸發分區再均衡(Rebalance),而頻繁Rebalance會延長消費空窗期、增加重複拉取機率,進一步惡化消費延遲,形成負向迴圈。
OOM風險:消費者在調用
poll()後未及時處理訊息,導致大量訊息堆積在用戶端記憶體緩衝區,可能引發堆記憶體溢出。
如何解決和最佳化訊息堆積
提升消費者吞吐能力:
增加消費者執行個體:在同一個 Group 中增加消費者,前提是
Partition 數 ≥ 消費者數。增加Partition數:提高並行度。
非同步處理:將耗時操作非同步化,加快poll迴圈。
批量處理:一次處理多條訊息。
調整消費者參數:
參數
推薦值
說明
max.poll.records1~500
每次 poll 拉取更少訊息,減少網路開銷
fetch.min.bytes1KB~1MB
提高吞吐,減少空輪詢
fetch.max.wait.ms500ms
等待更多資料一起返回
session.timeout.ms30s
避免誤判消費者死亡
heartbeat.interval.ms≤ session.timeout * 1/3
保持心跳正常
enable.auto.committrue
推薦自動認可
臨時應急措施:
如果堆積過大,短期無法處理完,則可以重設消費位點到最新。