我的 Amazon Simple Queue Service (Amazon SQS) 佇列中出現訊息待處理量增加的情形,我想防止這種增加的情形出現。
簡短說明
標準與 FIFO SQS 佇列
在下列情況下,訊息的待處理量會增加:
- 生產者傳送訊息的速度比消耗訊息的速度更快。
- 取用者不會在可見度逾期期間內刪除訊息。輪詢 SQS 佇列時,訊息會重新出現在佇列中。
FIFO SQS 佇列
對於 FIFO (先進先出) SQS 佇列,訊息的待處理量也可能會因下列其中一種情況而增加:
- FIFO 佇列的訊息緩衝區的限制為 120,000 則訊息。
- 屬於訊息群組的訊息被取用者佔用,使得系統無法處理來自相同訊息群組的其他訊息。
解決方法
遵循下列最佳實務,即可防止訊息待處理量增加的問題。
標準與 FIFO SQS 佇列
- 設定最佳的 SQS 佇列可見性逾時時間,以允許取用者在可見性逾時期間內處理訊息,然後刪除訊息。如果您不知道處理訊息需要多長時間,請為您的取用者流程建立活動訊號。指定初始可見性逾時 (例如,兩分鐘)。如果取用者需要更多時間來處理訊息,請使用 ChangeMessageVisibility API 呼叫來增加可見性逾時的時間。
- 在您進行 ReceiveMessage API 呼叫時,增加批次大小。將 MaxNumberOfMessages 參數值設定為大於 1,最多可設為 10。
- 監視 SQS 佇列指標「可見訊息的大致數目」。此指標可讓您查看生產者是否以比取用者的訊息消費速度更快的速率來產生訊息。若要進行水平擴展,請增加取用 SQS 佇列的取用者或用戶端數目,或增加會輪詢佇列的執行緒數目。
FIFO SQS 佇列
可容納 120,000 則訊息的緩衝區
FIFO 佇列最多可允許 120,000 則進行中的訊息。進行中的訊息包括取用者從佇列收到,但尚未從佇列中刪除的訊息。如果您達到 120,000 則訊息的配額上限,則 Amazon SQS 不會傳回錯誤訊息。
FIFO 佇列會檢閱前 120,000 則訊息,以確定可用的訊息群組。如果您在單一訊息群組中有一些待處理的訊息,則在成功消耗待處理的訊息之前,您將無法消耗來自其他訊息群組的訊息。
對訊息群組進行擴展
屬於相同訊息群組的訊息,會依照相對於訊息群組的順序逐一受到處理。當您收到具有多個訊息群組 ID 的訊息時,Amazon SQS 會盡量傳回具有相同的訊息群組 ID 的訊息。這讓其他取用者能夠處理具有不同訊息群組 ID 的訊息。
當屬於特定訊息群組 ID 的訊息不可見時,其他取用者無法處理具有相同訊息群組 ID 的訊息。但是,取用者可以處理來自其他訊息群組的訊息。請嘗試增加不要求順序之訊息群組的數量。