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 端点的策略重试总时间不能超过 3600 秒。这是一项硬性限制,无法增加

端点类型 传输协议 立即重试(无延迟)阶段 前退避阶段 退避阶段 后退避阶段 总尝试次数
AWS 托管端点 Amazon Data Firehose¹ 3 次,无延迟 2 次,相隔 1 秒 10 次,带指数退避(1 秒到 20 秒) 100000 次,相隔 20 秒 100015 次,超过 23 天
AWS Lambda
Amazon SQS
客户托管的终端节点 SMTP 0 次,无延迟 2 次,相隔 10 秒 10 次,带指数退避(10 秒到 600 秒(10 分钟)) 38 次,相隔 600 秒(10 分钟) 50 次尝试,超过 6 小时
短信
移动推送

¹ 对于 Firehose 协议的节流错误,Amazon SNS 使用与客户托管端点相同的传输策略。

传输策略阶段

下图显示了传输策略的各个阶段。

一个 x y 轴图,将时间显示为 x 值,将首次传输尝试显示为 y 值。在 y 轴上,传输策略从即刻重试阶段开始,在 x 轴上依次为回退前阶段、回退阶段和回退后阶段。

每个传输策略包含四个阶段。

  1. 立即重试阶段(无延迟)— 此阶段在首次尝试交付后立即出现。在该阶段中重试之间没有延迟。

  2. 退避前阶段 — 此阶段遵循立即重试阶段。Amazon SNS 使用此阶段进行一系列重试,然后再应用退避函数。此阶段指定重试次数以及它们之间的延迟时间量。

  3. 退避阶段 — 此阶段使用重试退避功能控制两次重试之间的延迟。此阶段设置了最短延迟时间、最长延迟时间和重试-退避函数,该函数定义了延迟时间从最小值增加到最大值的速度。退避函数可以是算术、指数、几何或线性的。

  4. 退避后阶段 — 此阶段遵循退避阶段。此阶段指定重试次数以及它们之间的延迟时间量。它是最后一个阶段。

创建 HTTP/S 传输策略

您可以使用包含四个阶段的传输策略来定义 Amazon SNS 如何重试向 HTTP/S 终端节点传送消息:无延迟、退避和后退缩此策略允许您覆盖默认的重试设置,并对其进行自定义以匹配您的 HTTP 服务器的容量。

您可以在主题订阅级别将 HTTP/S 传输策略定义为 JSON 对象:

或者,您也可以在 AWS CloudFormation 模板中使用该AWS::SNS::Subscription资源。

您应该根据 HTTP/S 服务器的容量自定义您的传输策略:

  • 所有订阅使用单台服务器-如果主题中的所有 HTTP/S 订阅都使用同一台服务器,请将交付策略设置为主题属性,以确保所有订阅之间的一致性。

  • 不同的订阅服务器-如果订阅针对不同的服务器,则为每个订阅创建针对特定服务器容量的唯一交付策略。

您还可以在请求策略中设置Content-Type标题以指定通知的媒体类型。默认情况下,Amazon SNS 会将所有通知发送到内容类型设置为 HTTP/S 终端节点。text/plain; charset=UTF-8但是,您可以使用请求策略中的headerContentType字段来覆盖此默认值。

以下 JSON 对象定义了分四个阶段进行重试的交付策略:

  1. 无延迟阶段-立即重试 3 次。

  2. 退避前阶段-以 1 秒的间隔重试 2 次。

  3. 退避阶段 — 重试 10 次,指数延迟范围为 1 到 60 秒。

  4. 后退阶段 — 以 60 秒的固定间隔重试 35 次。

在丢弃一条消息之前,Amazon SNS 总共尝试传送该消息 50 次。要保留所有重试后都无法传送的消息,请将您的订阅配置为将无法送达的消息移至死信队列 (DLQ)。有关更多信息,请参阅 Amazon SNS 死信队列

注意

此传输策略使用该maxReceivesPerSecond属性将每次订阅的传送流量限制为平均每秒 10 条消息。虽然这种机制有助于防止您的 HTTP/S 端点被高流量淹没,但它旨在保持平均传输速率,并且没有严格的上限。偶尔可能会出现超过指定限制的交付流量峰值,尤其是在您的发布速率明显高于限制的情况下。

当发布(入站)流量超过传送(出站)速率时,可能会导致消息积压和更高的交付延迟。为避免此类问题,请确保该maxReceivesPerSecond值与 HTTP/S 服务器的容量和工作负载要求一致。

注意

此传送策略将 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 重试的最长延迟时间。

单位:

最短延迟时间至 3600

原定设置值: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 次尝试的进度。每条彩色线条代表一个函数的延迟模式:指数:快速增加,以最快的速度达到最大延迟,线性:每次重试都会稳步增加,算术和几何:显示适度的增加,比线性更陡但速度低于指数。所有线路的起始延迟都接近 5 秒,第十次重试时将接近 260 秒的最大延迟。