

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

# 在 Amazon SQS 中使用無效字母佇列
<a name="sqs-dead-letter-queues"></a>

Amazon SQS 支援無效字母佇列 (DLQs)，這些來源佇列可以鎖定未成功處理的訊息。DLQs有助於偵錯您的應用程式，因為您可以隔離未使用的訊息，以判斷處理未成功的原因。為了獲得最佳效能，最佳實務是將來源佇列和 DLQ 保持在相同 AWS 帳戶 和 區域內。一旦訊息進入無效字母佇列，您就可以：
+ 檢查導致訊息移至無效字母佇列的例外狀況記錄。
+ 分析移至無效字母佇列的訊息內容，以診斷應用程式問題。
+ 判定您是否有給予消費者儲存的訊息處理時間。
+ 使用無效字母佇列[再驅動，將訊息移出無效字母佇列](sqs-configure-dead-letter-queue.md)。

您必須先建立新的佇列，才能將其設定為無效字母佇列。如需使用 Amazon SQS 主控台設定無效字母佇列的相關資訊，請參閱 [使用 Amazon SQS 主控台設定無效字母佇列](sqs-configure-dead-letter-queue.md)。如需無效字母佇列的說明，例如如何為移至無效字母佇列的任何訊息設定警示，請參閱 [使用 Amazon CloudWatch 為無效字母佇列建立警示](dead-letter-queues-alarms-cloudwatch.md)。

**注意**  
若不想打斷訊息或操作的準確順序，請不要將無效字母佇列搭配 FIFO 佇列使用。例如，影像編輯套件的 Edit Decision List (EDL) 中的指示請勿搭配無效字母佇列使用，因為變更編輯順序會改變後續編輯的環境。

## 針對無效字母佇列使用政策
<a name="policies-for-dead-letter-queues"></a>

使用**再驅動政策**來指定 `maxReceiveCount`。`maxReceiveCount` 是取用者在移至無效字母佇列之前，可以從來源佇列接收訊息的次數。例如，如果 `maxReceiveCount` 設定為低值，例如 1，則無法接收訊息會導致訊息移至無效字母佇列。為了確保您的系統能夠抵禦錯誤，請將 `maxReceiveCount` 設定得夠高，以允許足夠的重試。

對於重新驅動政策`maxReceiveCount`大於 3 的標準佇列，如果在未刪除的情況下收到訊息 3 次或更多次，SQS 會將其移至佇列的背面。`ApproximateAgeOfOldestMessage` 指標接著會反映未超過此閾值的下一個訊息的存留期。

**再驅動允許政策**指定哪些來源佇列能存取無效字母佇列。您可以選擇是否允許所有來源佇列、允許特定來源佇列，或拒絕所有來源佇列使用無效字母佇列。預設值允許所有來源佇列使用無效字母佇列。如果您選擇使用 `byQueue`選項允許特定佇列，您可以使用來源佇列 Amazon Resource Name (ARN) 指定最多 10 個來源佇列。若指定 `denyAll`，佇列就無法當作無效字母佇列。

## 了解無效字母佇列的訊息保留期間
<a name="understanding-message-retention-periods"></a>

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

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