如何防止 Amazon SQS 佇列中不斷增加的積存訊息?

上次更新日期︰2021 年 8 月 26 日

我的 Amazon Simple Queue Service (Amazon SQS) 佇列中的訊息積存正在增加。為什麼會發生這種情況,如何才能防止積存增加?

簡短描述

標準和 FIFO SQS 佇列

在下列情況下訊息積存會增加:

  • 生產者以比訊息取用更快的速度傳送訊息。
  • 消費者不會刪除可見性逾時期間內的訊息。輪詢 SQS 佇列時,訊息會重新出現在佇列中。

FIFO SQS 佇列

針對 FIFO (先進先出) SQS 佇列,訊息積存的增加也會因下列其中一種情況而產生:

  • FIFO 佇列 20,000 則訊息緩衝區限制。
  • 屬於訊息群組的訊息會透過消費者卡住,防止處理來自相同訊息群組的其他訊息。

解決方案

請遵循這些最佳實務,以防止訊息積存增加。

標準和 FIFO SQS 佇列

  • 設定 SQS 佇列最佳可見性逾時,以允許消費者在可見性逾時期間內處理訊息後將其刪除。如果您不知道處理訊息需要多長時間,則針對消費者程序建立活動訊號。指定初始可見性逾時 (例如,2 分鐘)。然後,如果消費者需要更多時間來處理訊息,則使用 ChangeMessageVisibility API 呼叫,繼續增加可見性逾時。
  • 當您進行 ReceiveMessage API 呼叫時,增加批次大小。將 MaxNumberOfMessages 參數值設定為 1 以上,最大值為 10。
  • 監督 SQS 佇列指標 Approximate Number of Messages Visible (可見訊息近似值)。透過該指標,您可以查看生產者是否開始以高於消費者可取用訊息的速率來產生訊息。若要水平擴展,則增加取用 SQS 佇列的消費者或用戶端數目,或是增加輪詢佇列的執行緒數目。

FIFO SQS 佇列

20,000 個訊息緩衝區

FIFO 佇列最多可容納 20,000 則執行中訊息。執行中訊息包括消費者從佇列收到,但尚未從佇列中刪除的訊息。如果您達到 20,000 個配額,Amazon SQS 不會傳回錯誤訊息。FIFO 佇列會查看前 20,000 則訊息,以確定可用的訊息群組。如果單一訊息群組中有積存訊息,則您無法取用來自其他訊息群組的訊息,直到您成功取用積存中的訊息為止。

擴展訊息群組

屬於相同訊息群組的訊息,會依照相對於訊息群組的順序逐一處理。當接收含有多個訊息群組 ID 的訊息時,Amazon SQS 會先嘗試使用相同訊息群組 ID 的訊息,傳回盡可能多的訊息。這可讓其他消費者處理具有不同訊息群組 ID 的訊息。當屬於特定訊息群組 ID 的訊息不可見時,其他消費者無法處理具有相同訊息群組 ID 的訊息。然而,消費者可以處理來自其他訊息群組的訊息。嘗試增加順序不重要的訊息群組數目。


此文章是否有幫助?


您是否需要帳單或技術支援?