消息传输重试 - Amazon Simple Notification Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

消息传输重试

Amazon SNS 为每个传输协议定义了一个传输策略。传输策略定义了在发生服务器端错误时(当承载已订阅终端节点的系统变得不可用时),Amazon SNS 如何重试消息传输。在传输策略用尽时,除非已将死信队列附加到订阅,否则 Amazon SNS 会停止重试传输并丢弃该消息。有关更多信息,请参阅 Amazon SNS 死信队列

传输协议和策略

注意
  • 除 HTTP/S 外,您无法更改 Amazon SNS 定义的传输策略。只有 HTTP/S 支持自定义策略。请参阅 创建 HTTP/S 传输策略

  • Amazon SNS 将抖动应用于传输重试。有关更多信息,请参阅 AWS 架构博客 上的指数退避和抖动博文。

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

传输策略阶段

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

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

  1. 立即重试阶段(无延迟)– 此阶段在首次传输尝试结束后立即发生。在该阶段中重试之间没有延迟。

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

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

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

创建 HTTP/S 传输策略

您可以使用传输策略及其四个阶段来定义 Amazon SNS 如何重试将消息传输到 HTTP/S 终端节点。Amazon SNS 允许您在可能需要根据 HTTP 服务器的容量自定义策略时重写 HTTP 终端节点的默认重试策略。

您可以在订阅或主题级别将 HTTP/S 传输策略设置为 JSON 对象。在主题级别定义策略时,它将应用于与主题关联的所有 HTTP/S 订阅。

您应根据 HTTP/S 服务器的容量来自定义您的传输策略。可以将策略设置为主题属性或订阅属性。如果主题中的所有 HTTP/S 订阅都针对相同的 HTTP/S 服务器,我们建议您将传输策略设置为主题属性,以使其对主题中的所有 HTTP/S 订阅保持有效。否则,您必须根据策略所针对的 HTTP/S 服务器的容量,为主题中的每个 HTTP/S 订阅编写传输策略。

以下 JSON 对象表示一个传输策略,该策略指示 Amazon SNS 重试失败的 HTTP/S 传输尝试,如下所示:

  1. 在无延迟阶段立即尝试 3 次

  2. 在前退避阶段尝试 2 次(相隔 1 秒)

  3. 10 次(带指数退避,1 秒到 60 秒)

  4. 35 次(相隔 60 秒)

在丢弃消息之前,Amazon SNS 总共会尝试 50 次。

注意

此传输策略还指示 Amazon SNS 将传输限制为每秒不超过 10 次。

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

传输策略包含一个重试策略和一个限制策略。传输策略共有 8 个属性。

策略 描述 Constraint
minDelayTarget 重试的最短延迟时间。

单位:

1 至最长延迟时间

默认值:20

maxDelayTarget 重试的最长延迟时间。

单位:

最短延迟时间至 3600

默认值:20

numRetries 重试总数,包括立即重试、前退避重试、退避重试和后退避重试。 0 至 100

默认值:3

numNoDelayRetries 要立即完成的重试次数,各个重试之间无延迟。 0 或更多

默认值:0

numMinDelayRetries 前退避阶段的重试次数,各个重试之间有指定的最短延迟时间。 0 或更多

默认值:0

numMaxDelayRetries 后退避阶段的重试次数,各个重试之间有最长延迟时间。 0 或更多

默认值:0

backoffFunction 各个重试之间退避的模型。

四个选项之一:

  • 算术

  • 指数

  • 几何

  • 线性

默认:线性

maxReceivesPerSecond 每个订阅每秒的最大传输次数。 1 或更多

默认:无限制

Amazon SNS 使用以下公式计算退避阶段的重试次数:

numRetries - numNoDelayRetries - numMinDelayRetries - numMaxDelayRetries

您可以使用三个参数来控制退避阶段的重试频率。

  • minDelayTarget – 定义了在退避阶段中与第一次重试尝试关联的延迟时间。

  • maxDelayTarget – 定义了在退避阶段中与最后一次重试尝试关联的延迟时间。

  • backoffFunction – 定义了 Amazon SNS 用于计算与退避阶段中第一次与最后一次重试之间的所有重试尝试关联的延迟时间的算法。您可以从四个重试-退避函数中进行选择。

下图显示了每个重试退避函数如何影响退避阶段中与重试关联的延迟时间:一种传输策略,其重试总数设置为 10,最短延迟时间设置为 5 秒,最长延迟时间设置为 260 秒。纵轴以秒为单位表示与 10 次重试中的每个重试相关的延迟。水平轴表示从第 1 次尝试到第 10 次尝试的重试次数。