全部產品
Search
文件中心

ApsaraMQ for Kafka:使用雲訊息佇列 Kafka 版時出現訊息堆積

更新時間:Jul 06, 2024

使用ApsaraMQ for Kafka時,可能會發現Group中出現訊息堆積。本文介紹如何判斷訊息堆積是否屬於正常情況,以及處理方法。

用戶端消費流程

瞭解用戶端消費流程,有助於理解訊息是否堆積。一般情況下,用戶端消費流程大致如下:

判斷訊息堆積是否屬於正常情況

如果發現Group中出現訊息堆積,請參見下列步驟,判斷訊息堆積是否屬於正常情況:

  1. 登入雲訊息佇列 Kafka 版控制台

  2. 在頂部功能表列,選擇地區。

  3. 在左側導覽列,單擊執行個體列表

  4. 執行個體列表頁面,單擊目標執行個體名稱。

  5. 執行個體詳情頁面,單擊左側功能表列中的Group管理

  6. Group管理頁面,找到目標Group,在其操作列,選擇更多>消費狀態

  7. 消費狀態頁簽,每間隔1分鐘記錄一次各個Topic分區的最近消費時間堆積量訊息位點,然後進行下列判斷:

    說明

    訊息位點可通過單擊詳情按鈕進行查看。

    • 最近消費時間與目前時間接近,並且堆積量保持在一個穩定的數值之間波動,沒有持續擴大。 說明用戶端一直在拉取最新訊息,沒有訊息堆積,屬於正常情況。

      說明

      訊息堆積量會根據訊息量、消費端位點提交頻率的變化而變化,數值大並不一定表示堆積。例如,某個Topic的發送頻率為10000 tps,消費端位點提交頻率為1 s提交1次,正常情況下展示的堆積量可能會一直在10000左右波動,但並非意味著訊息堆積了。

    • 堆積量逐步擴大,並且訊息位點一直不變。 用戶端的消費線程因為某些原因卡住,沒有繼續消費,也沒有繼續向服務端提交位點,屬於異常情況,即訊息的確堆積了。請參見下文的訊息堆積的處理方式章節進行處理。

    • 堆積量逐步擴大,同時消費位點在前進。 說明用戶端還在消費中,但是訊息的消費速度慢於訊息的發送速度。由於訊息是用戶端主動從服務端批量拉取,用戶端消費流程中的步驟1一般不會是消費的瓶頸。此時,需要排查步驟2的消費耗時,請參見下文的訊息堆積的處理方式章節進行處理。

      說明

      訊息堆積大多是消費速度過慢或者消費線程阻塞造成的,建議不要在消費邏輯中有太多耗時的操作。

    • 分區訊息堆積,下遊消費卻無異常。下遊可能採用了assign消費模式,位點是您自己管理的。這種情況下雖然顯示了堆積,實際上您可能已經消費了,但是沒有提交位點。建議您及時手動提交位點解決訊息堆積問題。

訊息堆積的處理方式

經過上述判斷,確認訊息的確存在堆積情況時,建議列印訊息的消費耗時,或者根據堆棧資訊查看線程執行情況。根據以下方案適當調整以加快訊息的消費速度,避免出現訊息堆積。

  • 增加Consumer執行個體個數。可以在進程內直接增加(需要保證每個執行個體對應一個線程),也可以部署多個消費執行個體進程。需要注意的是,執行個體個數超過分區數量後就不再能提高速度,否則將會有消費執行個體不工作。

  • 增加消費線程。更多資訊,請參見提高消費速度

說明
  • Java進程可以通過Jstack列印消費者進程的堆棧資訊。

  • 若出現訊息堆積,同時控制台上消費狀態出現異常,可能有Rebalance 現象,在Rebalance期間不會進行消費,導致大量堆積,具體原因是有大量用戶端在此上下線。更多資訊,請參見為什麼消費用戶端頻繁出現Rebalance?

相關文檔