本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
對 Amazon SQS 無效字母佇列和 DLQ 重新驅動問題進行故障診斷
下列主題涵蓋 Amazon SQS DLQ 和 DLQ 重新驅動問題的最常見原因,以及如何進行故障診斷。如需詳細資訊,請參閱 AWS 知識中心指南中的如何疑難排解 Amazon SQS DLQ 重新驅動問題?
DLQ 問題
了解常見的 DLQ 問題以及如何解決這些問題。
使用主控台檢視訊息可能會導致訊息被移動至無效字母佇列
Amazon SQS 根據相對應佇列的再驅動政策來計算在主控台中檢視訊息的次數。因此,如果您在主控台中檢視對應佇列的重新驅動政策中指定的訊息次數,訊息會移至對應佇列的無效字母佇列。
若要調整此行為,可執行以下其中一項:
-
提高相應佇列的再驅動政策的最大接收量設定。
-
避免在主控台中檢視相對應佇列的訊息。
無效字母佇列的 NumberOfMessagesSent
和 NumberOfMessagesReceived
不相符
若您手動將訊息傳送至無效字母佇列,其會由 NumberOfMessagesSent 指標擷取。不過,若訊息是因為處理訊息的嘗試失敗而送到無效字母佇列,就不會由此指標擷取。因此, NumberOfMessagesSent
和 的值可能NumberOfMessagesReceived不同。
建立和設定無效字母佇列重新驅動
無效字母佇列重新驅動需要您設定適當的許可,讓 Amazon SQS 從無效字母佇列接收訊息,並將訊息傳送到目的地佇列。如果您沒有正確的許可,無效字母佇列重新驅動任務可能會失敗。您可以檢視訊息重新驅動任務的狀態以修復問題,然後再試一次。
標準和 FIFO 佇列訊息失敗處理
標準佇列會保留處理訊息,直到保留期間過期為止。此持續處理可將佇列被未使用的訊息封鎖的機率降至最低。消費者重複刪除大量訊息可能會增加成本,並對硬體額外負載。若要降低成本,請將失敗的訊息移至無效字母佇列。
標準佇列也允許大量傳輸中訊息。如果您大部分的訊息都無法使用,而且沒有傳送到無效字母佇列,處理訊息的速度可能會變慢。若要維持佇列的效率,請確定您的應用程式正確處理訊息處理。
FIFO 佇列可依序消耗訊息群組內的訊息,藉此確保僅會經過恰好一次的處理。因此,雖然消費者可以繼續從另一個訊息群組擷取排序訊息,但第一個訊息群組仍然無法使用,直到成功處理封鎖佇列的訊息或移至無效字母佇列為止。
此外,FIFO 佇列允許較少數量的傳輸中訊息。為了防止 FIFO 佇列被訊息封鎖,請確定您的應用程式正確處理訊息。
如需詳細資訊,請參閱 Amazon SQS 訊息配額 和 Amazon SQS 最佳實務。
DLQ 重新驅動問題
了解常見的 DLQ 重新驅動問題以及如何解決這些問題。
AccessDenied 許可問題
當 DLQ 重新驅動失敗,因為 AWS Identity and Access Management (IAM) 實體沒有所需的許可時,就會發生此AccessDenied
錯誤。
錯誤訊息範例:
Failed to create redrive task. Error code: AccessDenied - Queue Permissions to Redrive.
發出 DLQ 重新驅動請求需要下列 API 許可:
若要啟動訊息重新驅動:
-
無效字母佇列許可:
-
sqs:StartMessageMoveTask
-
sqs:ReceiveMessage
-
sqs:DeleteMessage
-
sqs:GetQueueAttributes
-
kms:Decrypt
– 當無效字母佇列或原始來源佇列加密時。
-
-
目的地佇列許可:
-
sqs:SendMessage
-
kms:GenerateDataKey
– 當目的地佇列加密時。 -
kms:Decrypt
– 當目的地佇列加密時。
-
若要取消進行中的訊息重新驅動:
-
無效字母佇列許可:
-
sqs:CancelMessageMoveTask
-
sqs:ReceiveMessage
-
sqs:DeleteMessage
-
sqs:GetQueueAttributes
-
kms:Decrypt
– 當無效字母佇列或原始來源佇列加密時。
-
若要顯示訊息移動狀態:
-
無效字母佇列許可:
-
sqs:ListMessageMoveTasks
-
sqs:GetQueueAttributes
-
NonExistentQueue
錯誤
當 Amazon SQS 來源佇列不存在或已刪除時,NonExistentQueue
就會發生錯誤。檢查並重新驅動到存在的 Amazon SQS 佇列。
錯誤訊息範例:
Failed: AWS.SimpleQueueService.NonExistentQueue
CouldNotDetermineMessageSource 錯誤
當您嘗試在下列情況下啟動 DLQ 重新驅動時,會發生此CouldNotDetermineMessageSource
錯誤:
-
使用
SendMessage
API 直接傳送至 DLQ 的 Amazon SQS 訊息。 -
Amazon Simple Notification Service (Amazon SNS) 主題或 AWS Lambda 函數的訊息,其中已設定 DLQ。
若要解決此錯誤,請在啟動重新驅動時選擇重新驅動至自訂目的地。然後,輸入 Amazon SQS 佇列 ARN,將所有訊息從 DLQ 移至目的地佇列。
錯誤訊息範例:
Failed: CouldNotDetermineMessageSource