Amazon SNS 消息传输重试
Amazon SNS 为每个传输协议定义了一个传输策略。传输策略定义了在发生服务器端错误时(当承载已订阅终端节点的系统变得不可用时),Amazon SNS 如何重试消息传输。当传输策略用尽时,Amazon SNS 将停止重试传输并丢弃邮件——除非已将死信队列附加到订阅。有关更多信息,请参阅 Amazon SNS 死信队列。
传输协议和策略
注意
-
除 HTTP/S 外,您无法更改 Amazon SNS 定义的传输策略。只有 HTTP/S 支持自定义策略。请参阅创建 HTTP/S 传输策略。
-
Amazon SNS 将抖动应用于传输重试。有关更多信息,请参阅发布在 Amazon 架构博客上的指数回退和抖动
博客文章。 -
HTTP/S 端点的策略重试总时间不能超过 3600 秒。这是一项硬性限制,无法增加。
端点类型 | 传输协议 | 立即重试(无延迟)阶段 | 前退避阶段 | 退避阶段 | 后退避阶段 | 总尝试次数 |
---|---|---|---|---|---|---|
Amazon 托管的终端节点 | Amazon Data Firehose¹ | 3 次,无延迟 | 2 次,相隔 1 秒 | 10 次,带指数退避(1 秒到 20 秒) | 100000 次,相隔 20 秒 | 100015 次,超过 23 天 |
Amazon Lambda | ||||||
Amazon SQS | ||||||
客户托管的终端节点 | SMTP | 0 次,无延迟 | 2 次,相隔 10 秒 | 10 次,带指数退避(10 秒到 600 秒(10 分钟)) | 38 次,相隔 600 秒(10 分钟) | 50 次尝试,超过 6 小时 |
短信 | ||||||
移动推送 |
¹ 对于 Firehose 协议的节流错误,Amazon SNS 使用与客户托管端点相同的传输策略。
传输策略阶段
下图显示了传输策略的各个阶段。
每个传输策略包含四个阶段。
-
立即重试阶段(无延迟) – 此阶段在首次传输尝试结束后立即发生。在该阶段中重试之间没有延迟。
-
前退避阶段 – 此紧随即刻重试阶段。Amazon SNS 使用此阶段进行一系列重试,然后再应用退避函数。此阶段指定重试次数以及它们之间的延迟时间量。
-
退避阶段 – 此阶段通过使用重试-退避函数控制各个重试之间的延迟。此阶段设置了最短延迟时间、最长延迟时间和重试-退避函数,该函数定义了延迟时间从最小值增加到最大值的速度。退避函数可以是算术、指数、几何或线性的。
-
后退避阶段 – 此阶段在退避阶段之后发生。此阶段指定重试次数以及它们之间的延迟时间量。它是最后一个阶段。
创建 HTTP/S 传输策略
您可以使用传输策略及其四个阶段来定义 Amazon SNS 如何重试将消息传输到 HTTP/S 端点的操作。Amazon SNS 允许您在可能需要根据 HTTP 服务器的容量自定义策略时覆盖 HTTP 端点的原定设置重试策略。
您可以在订阅或主题级别将 HTTP/S 传输策略设置为 JSON 对象。在主题级别定义策略时,它将应用于与主题关联的所有 HTTP/S 订阅。要在订阅级别设置传送策略,您可以使用 Subscribe
或 SetSubscriptionAttributes
API 操作。要在主题级别设置传送策略,您可以使用 CreateTopic
或 SetTopicAttributes
API 操作。或者,您也可以在 Amazon CloudFormation 模板中使用 AWS::SNS::Subscription 资源。
您应根据 HTTP/S 服务器的容量来自定义您的传输策略。可以将策略设置为主题属性或订阅属性。如果主题中的所有 HTTP/S 订阅都针对相同的 HTTP/S 服务器,我们建议您将传输策略设置为主题属性,以使其对主题中的所有 HTTP/S 订阅保持有效。否则,您必须根据策略所针对的 HTTP/S 服务器的容量,为主题中的每个 HTTP/S 订阅编写传输策略。
您还可以在请求策略中设置 Content-Type 标头,以指定通知的媒体类型。原定设置情况下,Amazon SNS 会将所有通知发送到 HTTP/S 端点,内容类型设置为 text/plain; charset=UTF-8
。Amazon SNS 允许您覆盖原定设置的请求策略。有关支持的 headerContentType 和约束,请参阅下表。
以下 JSON 对象表示一个传输策略,该策略指示 Amazon SNS 重试失败的 HTTP/S 传输尝试,如下所示:
-
在无延迟阶段立即尝试 3 次
-
在前退避阶段尝试 2 次(相隔 1 秒)
-
10 次(带指数退避,1 秒到 60 秒)
-
在后退避阶段尝试 35 次(相隔 60 秒)
在此示例传输策略中,Amazon SNS 在丢弃消息之前,总共会尝试 50 次。要在传输策略中指定的重试用尽后保留消息,请配置您的订阅以将无法交付的消息移动到死信队列 (DLQ)。有关更多信息,请参阅 Amazon SNS 死信队列。
注意
此传输策略还使用 maxReceivesPerSecond
属性指示 Amazon 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 |
重试的最长延迟时间。 单位:秒 |
最短延迟时间至 3600 原定设置值:20 |
numRetries |
重试总数,包括立即重试、前退避重试、退避重试和后退避重试。 | 0 至 100 原定设置值:3 |
numNoDelayRetries |
要立即完成的重试次数,各个重试之间无延迟。 | 0 或更多 原定设置值:0 |
numMinDelayRetries |
前退避阶段的重试次数,各个重试之间有指定的最短延迟时间。 | 0 或更多 原定设置值:0 |
numMaxDelayRetries |
后退避阶段的重试次数,各个重试之间有最长延迟时间。 | 0 或更多 原定设置值:0 |
backoffFunction |
各个重试之间退避的模型。 |
四个选项之一:
默认:线性 |
maxReceivesPerSecond
|
每个订阅每秒的最大传输次数。 | 1 或更多 默认:无限制 |
headerContentType
|
发送到 HTTP/S 端点的通知的内容类型。 |
如果未定义请求策略,则内容类型原定设置为 当为订阅禁用原始消息传送时(原定设置),或者在主题级别定义传送策略时,支持的标头内容类型为 为订阅启用原始消息传送时,支持以下内容类型:
|
Amazon SNS 使用以下公式计算退避阶段的重试次数:
numRetries - numNoDelayRetries - numMinDelayRetries - numMaxDelayRetries
您可以使用三个参数来控制退避阶段的重试频率。
-
minDelayTarget
– 定义了在退避阶段中与第一次重试尝试关联的延迟时间。 -
maxDelayTarget
– 定义了在退避阶段中与最后一次重试尝试关联的延迟时间。 -
backoffFunction
– 定义了 Amazon SNS 用于计算与退避阶段中第一次与最后一次重试之间的所有重试尝试关联的延迟时间的算法。您可以从四个重试-退避函数中进行选择。
下图显示了每个重试退避函数如何影响退避阶段中与重试关联的延迟时间:一种传输策略,其重试总数设置为 10,最短延迟时间设置为 5 秒,最长延迟时间设置为 260 秒。纵轴以秒为单位表示与 10 次重试中的每个重试相关的延迟。水平轴表示从第 1 次尝试到第 10 次尝试的重试次数。