全部產品
Search
文件中心

ApsaraMQ for Kafka:訊息堆積

更新時間:Dec 12, 2025

訊息堆積(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提交延遲或失敗:導致重複拉取、假性堆積。

如何查看訊息堆積

詳情請參見以下文檔中關於堆積的指標:

訊息堆積的影響

  • 即時性下降:資料處理延遲增加,影響業務決策。

  • 系統響應變慢:消費者線程阻塞,可能引發逾時、熔斷。

  • Rebalance風險升高:消費者處理延遲導致心跳逾時,進而觸發分區再均衡(Rebalance),而頻繁Rebalance會延長消費空窗期、增加重複拉取機率,進一步惡化消費延遲,形成負向迴圈。

  • OOM風險:消費者在調用 poll() 後未及時處理訊息,導致大量訊息堆積在用戶端記憶體緩衝區,可能引發堆記憶體溢出。

如何解決和最佳化訊息堆積

  1. 提升消費者吞吐能力:

    • 增加消費者執行個體:在同一個 Group 中增加消費者,前提是Partition 數 ≥ 消費者數

    • 增加Partition數:提高並行度。

    • 非同步處理:將耗時操作非同步化,加快poll迴圈。

    • 批量處理:一次處理多條訊息。

  2. 調整消費者參數:

    參數

    推薦值

    說明

    max.poll.records

    1~500

    每次 poll 拉取更少訊息,減少網路開銷

    fetch.min.bytes

    1KB~1MB

    提高吞吐,減少空輪詢

    fetch.max.wait.ms

    500ms

    等待更多資料一起返回

    session.timeout.ms

    30s

    避免誤判消費者死亡

    heartbeat.interval.ms

    ≤ session.timeout * 1/3

    保持心跳正常

    enable.auto.commit

    true

    推薦自動認可

  3. 臨時應急措施:

    如果堆積過大,短期無法處理完,則可以重設消費位點到最新。