

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon SQS 錯誤處理和有問題的訊息
<a name="best-practices-error-handling"></a>

本主題提供在 Amazon SQS 中管理和緩解錯誤的詳細說明，包括處理請求錯誤、擷取有問題的訊息，以及設定無效字母佇列保留以確保訊息可靠性的技術。

****主題****
+ [在 Amazon SQS 中處理請求錯誤](handling-request-errors.md)
+ [在 Amazon SQS 中擷取有問題的訊息](capturing-problematic-messages.md)
+ [在 Amazon SQS 中設定無效字母佇列保留](setting-up-dead-letter-queue-retention.md)

# 在 Amazon SQS 中處理請求錯誤
<a name="handling-request-errors"></a>

若要處理請求錯誤，請使用以下其中一種策略：
+ 如果您使用 AWS SDK，則已經有自動*重試和退避*邏輯可供您使用。如需詳細資訊，請參閱 *Amazon Web Services 一般參考* 中的 [AWS中的錯誤重試與指數退避](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)。
+ 如果您不使用 AWS SDK 功能進行重試和退避，請在未收到任何訊息、逾時或收到來自 Amazon SQS 的錯誤訊息後，先允許暫停 （例如 200 毫秒） 再重試 [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) 動作。對於產生相同結果的後續 `ReceiveMessage` 使用，允許較長的暫停 (例如 400 毫秒)。

# 在 Amazon SQS 中擷取有問題的訊息
<a name="capturing-problematic-messages"></a>

若要擷取所有無法處理的訊息並收集準確的 CloudWatch 指標，請設定[無效字母佇列](sqs-dead-letter-queues.md)。
+ Redrive policy 在來源佇列無法處理訊息指定的次數之後，會將訊息重新導向至無效信件佇列。
+ 使用無效字母佇列可以降低訊息數量並降低讓您接觸到*毒丸 (poison pill)* 訊息 (已收到但無法處理的訊息) 的可能性。
+ 佇列中包含毒丸訊息可能會曲解 [`ApproximateAgeOfOldestMessage`](sqs-available-cloudwatch-metrics.md) CloudWatch 指標，因為這樣會提供毒丸訊息的錯誤存在時間。設定無效字母佇列有助於避免使用此指標時產生假警報。

# 在 Amazon SQS 中設定無效字母佇列保留
<a name="setting-up-dead-letter-queue-retention"></a>

對於標準佇列，訊息的到期一律會以其原始排入佇列時間戳記為基礎。訊息被移至無效字母佇列時，排入佇列時間戳記不會變更。此 `ApproximateAgeOfOldestMessage` 測量結果會指出訊息移至無效字母佇列的時間，*而非*原始傳送訊息的時間。例如，假設訊息在移至無效字母佇列之前，在原始佇列中花費 1 天時間。如果無效字母佇列的保留期限為 4 天，則會在 3 天後從無效字母佇列中刪除訊息，而且 `ApproximateAgeOfOldestMessage` 為 3 天。因此，最佳實務是一律將無效字母佇列的保留期間設定為長於原始佇列的保留期間。

若為 FIFO 佇列，訊息移到無效字母佇列時，會重設訊息。此 `ApproximateAgeOfOldestMessage` 測量結果會指出訊息移到無效字母佇列的時間。在上面的相同範例中，訊息會在 4 天後從無效字母佇列中刪除，而且 `ApproximateAgeOfOldestMessage` 為 4 天。