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

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

Amazon SNS無效字母佇列

無效字母佇列是 Amazon SNS訂閱的目標 Amazon SQS佇列,無法成功交付給訂閱者的訊息。由於用戶端錯誤或伺服器錯誤而無法傳遞的訊息,會保留在無效字母佇列,以供進一步分析或重新處理。如需詳細資訊,請參閱 設定訂閱的 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 SQS資料 (SSE) 和 AWS KMSAmazon Simple Queue Service 開發人員指南中的

訊息傳遞為何失敗?

一般而言,由於用戶端伺服器端錯誤,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、SMS、 SMTP或行動推送) 也可能導致伺服器端錯誤。Amazon SNS 也會重試交付至這些類型的端點。雖然HTTP端點支援客戶定義的重試政策,但 Amazon SNS會將 SMTP、 SMS和行動推送端點的內部交付重試政策設定為 6 小時的 50 倍。

無效字母佇列的運作方式

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

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

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

訊息是透過再驅動政策移至無效字母佇列。重新驅動政策是參考無效字母佇列ARN的 的JSON物件。deadLetterTargetArn 屬性會指定 ARN。必須ARN指向與您的 Amazon SNS訂閱位於相同 AWS 帳戶 和 區域中的 Amazon SQS佇列。如需詳細資訊,請參閱設定訂閱的 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 可用 CloudWatch 指標SQS所有具有無效字母佇列的 Amazon SNS訂閱也會發出 CloudWatch 指標。如需詳細資訊,請參閱使用 監控 Amazon SNS主題 CloudWatch

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

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

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

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

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