Amazon SNS 無效字母佇列 - Amazon Simple Notification Service

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

Amazon SNS 無效字母佇列

無效字母佇列是一種 Amazon SQS 佇列,Amazon SNS 將它作為無法成功傳遞給訂閱者訊息的目標。由於用戶端錯誤或伺服器錯誤而無法傳遞的訊息,會保留在無效字母佇列,以供進一步分析或重新處理。如需詳細資訊,請參閱設定訂閱的 Amazon SNS 無效字母佇列Amazon SNS 訊息傳遞重試

注意
  • Amazon SNS 訂閱和 Amazon SQS 佇列必須位於相同的 AWS 帳戶和區域下。

  • 對於 FIFO 主題,您可以使用 Amazon SQS 佇列做為 Amazon SNS 訂閱的無效字母佇列。FIFO 主題訂閱使用 FIFO 佇列,而標準主題訂閱則使用標準佇列。

  • 若要使用加密的 Amazon SQS 佇列做為無效字母佇列,您必須使用具有金鑰政策的自訂 KMS,以授予 Amazon SNS 服務主體對 AWS KMS API 動作的存取權。如需詳細資訊,請參閱本指南中的 使用伺服器端加密保護 Amazon SNS 資料Amazon Simple Queue Service 開發人員指南中的保護 Amazon SQS 資料與使用伺服器端加密 (SSE) 和 AWS KMS

訊息傳遞為何失敗?

一般而言,當 Amazon SNS 因用戶端伺服器端錯誤而無法存取訂閱的端點時,訊息傳遞就會失敗。當 Amazon SNS 收到用戶端錯誤,或繼續收到伺服器端錯誤 (因為訊息超出對應重試政策所指定的重試次數),除非已將無效字母佇列附加至訂閱,否則 Amazon SNS 就會捨棄訊息。失敗傳遞不會改變您的訂閱狀態。如需詳細資訊,請參閱Amazon SNS 訊息傳遞重試

用戶端錯誤

當 Amazon SNS 有過時的訂閱中繼資料時,可能就會發生用戶端錯誤。當擁有者刪除端點 (例如對 Amazon SNS 主題訂閱的 Lambda 函數) 或擁有者變更附加至訂閱端點的政策而阻止 Amazon SNS 將訊息傳遞至端點,則經常會發生這些錯誤。Amazon SNS 不會重試因用戶端錯誤而失敗的訊息傳遞。

伺服器端錯誤

當負責訂閱端點的系統無法使用或傳回例外狀況,表示無法處理 Amazon SNS 的有效請求,可能就會發生伺服器端錯誤。發生伺服器端錯誤時,Amazon SNS 會使用線性或指數退避函數來重試失敗的傳遞。對於由 Amazon SQS 或 支援的 AWS 受管端點引起的伺服器端錯誤 AWS Lambda,Amazon SNS 會在 23 天內重試交付最多 100,015 次。

客戶管理的端點 (例如 HTTP、SMTP、SMS 或行動推播) 可能也會導致伺服器端錯誤。Amazon SNS 也會重試傳遞到這些類型的端點。雖然 HTTP 端點支援客戶定義的重試政策,但針對 SMTP、SMS 和行動推播端點,Amazon SNS 會將內部傳遞重設政策設為 6 小時內 50 次。

無效字母佇列的運作方式

無效字母佇列會附加至 Amazon SNS 訂閱 (而不是主題),因為訊息傳遞是在訂閱層級發生。這可讓您更輕鬆地識別每個訊息的原始目標端點。

與 Amazon SNS 訂閱相關聯的無效字母佇列是一般的 Amazon SQS 佇列。如需訊息保留期間的詳細資訊,請參閱 Amazon Simple Queue Service 開發人員指南中的訊息相關配額。您可以使用 Amazon SQS SetQueueAttributes API 動作來變更訊息保留期間。若要讓應用程式更具彈性,建議您將無效字母佇列的最大保留期間設為 14 天。

訊息如何移至無效字母佇列?

訊息是透過再驅動政策移至無效字母佇列。再驅動政策是參照無效字母佇列之 ARN 的 JSON 物件。deadLetterTargetArn 屬性會指定 ARN。ARN 必須指向與您的 Amazon SNS 訂閱位於相同 和 區域中的 Amazon SQS 佇列。 AWS 帳戶 Amazon SNS 如需詳細資訊,請參閱設定訂閱的 Amazon SNS 無效字母佇列

以下 JSON 物件是附加至 SNS 訂閱的再驅動政策範例。

{ "deadLetterTargetArn": "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue" }

如何將訊息從無效字母佇列中移出?

您可以透過下列兩種方式將訊息從無效字母佇列中移出:

  • 避免編寫 Amazon SQS 消費者邏輯 - 將無效字母佇列設為 Lambda 函數的事件來源,以耗盡無效字母佇列。

  • 寫入 Amazon SQS 消費者邏輯 – 使用 Amazon SQS API、 AWS SDK 或 AWS CLI 撰寫自訂消費者邏輯,以輪詢、處理和刪除無效字母佇列中的訊息。

如何監控和記錄無效字母佇列?

您可以使用 Amazon CloudWatch 指標來監控與您 Amazon SNS 訂閱相關聯的無效字母佇列。所有 Amazon SQS 佇列都會每隔一分鐘發出 CloudWatch 指標。如需詳細資訊,請參閱《Amazon Simple Queue Service 開發人員指南》中的適用於 Amazon SQS 的 CloudWatch 指標所有包含無效字母佇列的 Amazon SNS 訂閱也會發出 CloudWatch 指標 如需詳細資訊,請參閱使用 Amazon CloudWatch 監控 Amazon SNS 主題

若要獲得無效字母佇列中的活動通知,您可以使用 CloudWatch 指標和警示。為NumberOfMessagesSent指標設定警示並不合適,因為此指標不會擷取因處理嘗試失敗而傳送到 DLQ 的訊息。反之,請使用 ApproximateNumberOfMessagesVisible 指標,該指標會擷取 DLQ 中目前可用的所有訊息,包括因處理失敗而移動的訊息。

CloudWatch 警示設定範例
  1. 為指標建立 CloudWatch 警示ApproximateNumberOfMessagesVisible

  2. 將警示閾值設定為 1 (或根據您的期望和 DLQ 流量的其他適當值)。

  3. 指定警示關閉時要通知的 Amazon SNS 主題。此 Amazon SNS 主題可將警示通知傳遞給任何端點類型 (例如電子郵件地址、電話號碼或行動傳呼應用程式)。

您可以使用 CloudWatch Logs 調查導致任何 Amazon SNS 傳遞失敗的例外狀況以及傳送至無效字母佇列的訊息。Amazon SNS 可以在 CloudWatch 中記錄成功和失敗的交付。如需詳細資訊,請參閱Amazon SNS 行動應用程式屬性