Amazon SNS 訊息交付重試 - Amazon Simple Notification Service

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

Amazon SNS 訊息交付重試

Amazon 會為每個交付通訊協定SNS定義交付政策。 交付政策定義 Amazon SNS 如何在發生伺服器端錯誤 (託管訂閱端點的系統無法使用) 時重試訊息交付。交付政策用盡時,Amazon 會SNS停止重試交付並捨棄訊息,除非無效字母佇列已連接至訂閱。如需詳細資訊,請參閱Amazon SNS無效字母佇列

傳遞通訊協定和政策

注意
  • 除了 HTTP/S, you can't change Amazon SNS-defined delivery policies. Only HTTP/S支援自訂政策。請參閱 建立 HTTP/S 交付政策

  • Amazon 會將抖動SNS套用至交付重試。如需詳細資訊,請參閱 AWS 架構部落格中的指數退避和抖動貼文。

  • HTTP/S 端點的政策重試總時間不能大於 3,600 秒。這是硬性限制,無法再增加

端點類型 傳遞通訊協定 立即重試 (無延遲) 階段 預先輪詢階段 輪詢階段 事後輪詢階段 嘗試總次數
AWS 受管端點 Amazon Data Firehose1 3 次,毫無延遲 2 次,相隔 1 秒 10 次,含指數退避,從 1 秒到 20 秒 100,000 次,相隔 20 秒 100,015 次,在 23 天內
AWS Lambda
Amazon SQS
客戶管理的端點 SMTP 0 次,毫無延遲 2 次,相隔 10 秒 10 次,含指數退避,從 10 秒到 600 秒 (10 分鐘) 38 次,相隔 600 秒 (10 分鐘) 50 次嘗試,在 6 小時內
SMS
行動推播

1 對於 Firehose 通訊協定的限流錯誤,Amazon SNS會使用與客戶受管端點相同的交付政策。

傳遞政策階段

下圖顯示傳遞政策的各個階段。

x y 軸圖顯示時間作為 x 值,初始嘗試交付作為 y 值。交付政策從 y 軸上的立即重試階段開始,接著是退避前階段、退避階段和退避後階段的 x 軸。

每個傳遞政策都是由四個階段組成。

  1. 立即重試階段 (無延遲) - 此階段會在初始傳遞嘗試後立即發生。在此階段各次重試之間無延遲。

  2. 預先輪詢階段 - 在立即重試階段之後。Amazon SNS使用此階段在套用退避函數之前嘗試一組重試。此階段會指定重試次數和各次重試之間的延遲量。

  3. 輪詢階段 - 此階段會使用重試輪詢函數,控制重試之間的延遲。此階段會設定最小延遲、最大延遲,以及重試輪詢函數,以定義延遲多快從最小增加到最大延遲。輪詢函數可以是算術、指數、幾何或線性類型。

  4. 事後輪詢階段 - 此階段在輪詢階段之後。它會指定重試次數和各次重試之間的延遲量。此為最後一個階段。

建立 HTTP/S 交付政策

您可以使用交付政策及其四個階段來定義 Amazon SNS 如何重試將訊息交付至 HTTP/S 端點。例如,當您可能想要根據HTTP伺服器容量自訂政策時,Amazon SNS可讓您覆寫HTTP端點的預設重試政策。

您可以設定與主題相關聯的HTTP/S delivery policy as a JSON object at the subscription or topic level. When you define the policy at the topic level, it applies to all HTTP/S訂閱。若要在訂閱層級設定交付政策,您可以使用 SubscribeSetSubscriptionAttributesAPI動作。若要在主題層級設定交付政策,您可以使用 CreateTopicSetTopicAttributesAPI動作。或者,您也可以在 AWS CloudFormation 範本中使用 AWS::SNS::訂閱資源。

您應該根據政策目標的HTTP/S server's capacity. You can set the policy as a topic attribute or a subscription attribute. If all HTTP/S subscriptions in your topic target the same HTTP/S server, we recommend that you set the delivery policy as a topic attribute, so that it remains valid for all HTTP/S subscriptions in the topic. Otherwise, you must compose a delivery policy for each HTTP/S subscription in your topic, according the capacity of the HTTP/S伺服器自訂交付政策。

您也可以設定請求政策中的 Content-Type 標頭,以指定通知的媒體類型。根據預設,Amazon SNS會將所有通知傳送至內容類型設定為 的 HTTP/S 端點text/plain; charset=UTF-8。Amazon SNS可讓您覆寫預設請求政策。如需支援 headerContentType 與拘束,請參閱下列表格。

下列JSON物件代表 交付政策,指示 Amazon SNS 重試失敗的 HTTP/S 交付嘗試,如下所示:

  1. 3 次,在無延遲階段中立即執行

  2. 2 次 (相隔 1 秒),在預先輪詢階段中執行

  3. 10 次 (含指數退避,從 1 秒到 60 秒)

  4. 35 次 (相隔 60 秒),在預先輪詢階段中執行

在此範例交付政策中,Amazon 在捨棄訊息之前總共SNS會嘗試 50 次。若要在交付政策中指定的重試用盡後保留訊息,請設定訂閱將無法交付的訊息移至無效字母佇列 (DLQ)。如需詳細資訊,請參閱Amazon SNS無效字母佇列

注意

此交付政策也會指示 Amazon 使用 maxReceivesPerSecond 屬性,SNS將交付限制為每秒不超過 10 次。此自我調節速率可能會導致發佈的訊息 (傳入流量) 多於傳遞的訊息 (傳出流量)。當輸入流量超過輸出流量時,您的訂閱可能會累積大量的郵件待處理項目,這可能會導致郵件傳遞延遲過高。在您的傳遞政策中,請務必為 maxReceivesPerSecond 指定一個數值,不會對您的工作負載造成負面影響。

注意

此交付政策會覆寫 HTTP/S 通知的預設內容類型。 application/json

{ "healthyRetryPolicy": { "minDelayTarget": 1, "maxDelayTarget": 60, "numRetries": 50, "numNoDelayRetries": 3, "numMinDelayRetries": 2, "numMaxDelayRetries": 35, "backoffFunction": "exponential" }, "throttlePolicy": { "maxReceivesPerSecond": 10 }, "requestPolicy": { "headerContentType": "application/json" } }

傳遞政策是由重試政策、限流政策和請求政策組成。一個傳遞政策中總共有 9 個屬性。

政策 描述 限制條件
minDelayTarget 重試的最小延遲。

單位:

1 到最大延遲

預設:20

maxDelayTarget 重試的最大延遲。

單位:

最小延遲到 3,600

預設:20

numRetries 重試總數,包括立即、預先輪詢、輪詢和事後輪詢重試。 0 到 100

預設:3

numNoDelayRetries 要立即完成的重試次數,且各次重試之間毫無延遲。 0 或以上

預設:0

numMinDelayRetries 預先輪詢階段中的重試次數,且各次重試之間有指定的最小延遲。 0 或以上

預設:0

numMaxDelayRetries 事後輪詢階段中的重試次數,且各次重試之間有最大延遲。 0 或以上

預設:0

backoffFunction 重試之間的輪詢模式。

下列四個選項之一:

  • 算術

  • 指數

  • 幾何

  • 線性

預設值:線性

maxReceivesPerSecond 每個訂閱的每秒最大傳遞次數。 1 或以上

預設值:無調節

headerContentType

傳送至 HTTP/S 端點的通知內容類型。

如果未定義請求政策,則內容類型預設為 text/plain; charset=UTF-8

當訂閱停用原始訊息傳遞時 (預設),或在主題層級定義傳遞政策時,支援的標頭內容類型為 application/jsontext/plain

啟用訂閱的原始訊息傳遞時,支援下列內容類型:

  • text/css

  • text/csv

  • text/html

  • text/plain

  • text/xml

  • application/atom+xml

  • application/json

  • application/octet-stream

  • application/soap+xml

  • 應用程式/x-www-form-urlencoded

  • application/xhtml+xml

  • application/xml

Amazon SNS使用以下公式計算退避階段的重試次數:

numRetries - numNoDelayRetries - numMinDelayRetries - numMaxDelayRetries

您可以使用三個參數來控制輪詢階段中的重試頻率。

  • minDelayTarget - 定義與輪詢階段中第一次重試嘗試相關聯的延遲。

  • maxDelayTarget - 定義與輪詢階段中最後一次重試嘗試相關聯的延遲。

  • backoffFunction – 定義 Amazon SNS用來計算與退避階段中第一次和最後一次重試嘗試之間所有重試嘗試相關聯的延遲的演算法。您可以使用四個重試輪詢函數中的其中一個函數。

下圖顯示每個重試輪詢函數如何影響與輪詢階段期間之重試相關聯的延遲:重試總次數設為 10、最小延遲設為 5 秒,且最大延遲設為 260 秒的傳遞政策。垂直軸代表 10 次重試的每一次相關的延遲 (以秒為單位)。水平軸代表重試次數,從第一次到第十次嘗試。

在交付政策的退避階段重試的延遲時間,繪製超過 10 次重試嘗試。四個不同的退避函數 - 指數函數、算術函數、線性函數和幾何函數 - 以不同的彩色線條來說明,每個函數都顯示延遲如何隨著每次重試而增加。指數退避函數顯示最陡峭的上升,比其他函數更快達到最大延遲,而線性函數則以穩定速率增加。算術函數和幾何函數會顯示中等的延遲增加,但比線性模型更陡。每行大約會開始 5 秒的最小延遲,並在第十次重試時,會朝 260 秒的最大延遲前進。