Amazon SNS 死信队列 - Amazon Simple Notification Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon SNS 死信队列

死信队列是 Amazon SNS 订阅针对无法成功递送到订阅者的消息设定的目标 Amazon SQS 队列。由于客户端错误或服务器错误而无法递送的消息将保留在死信队列中,以供进一步分析或重新处理。有关更多信息,请参阅 为 Amazon SNS 订阅配置 Amazon SNS 死信队列消息传输重试

注意
  • Amazon SNS 订阅和 Amazon SQS 队列必须在相同的 AWS 账户和区域下。

  • 当前,您不能将 Amazon SQS FIFO 队列用作 Amazon SNS 订阅的死信队列。

  • 要将加密的 Amazon SQS 队列用作死信队列,必须使用具有密钥策略的自定义 CMK,该策略将授予 Amazon SNS 服务委托人对 AWS KMS API 操作的访问权限。有关更多信息,请参阅本指南中的 静态加密Amazon Simple Queue Service 开发人员指南 中的使用服务器端加密 (SSE) 和 AWS KMS 保护 Amazon SQS 数据

为什么消息传输会失败?

通常,当由于客户端服务器端错误 导致 Amazon SNS 无法访问订阅的终端节点时,消息传输将失败。当 Amazon SNS 收到客户端错误或继续收到超出相应重试策略所指定的重试次数的消息的服务器端错误时,除非已将死信队列附加到订阅,否则 Amazon SNS 会丢弃该消息。失败的传输不会更改您的订阅状态。有关更多信息,请参阅 消息传输重试

客户端错误

当 Amazon SNS 具有过时的订阅元数据时,可能会发生客户端错误。当拥有者删除终端节点(例如,订阅了 Amazon SNS 主题的 Lambda 函数)时,或当拥有者更改附加到已订阅终端节点的策略的方式致使 Amazon SNS 无法将消息传输到终端节点时,通常会发生这些错误。Amazon SNS 不会重试因客户端错误导致失败的消息传输。

服务器端错误

当负责已订阅终端节点的系统变得不可用或返回一个指示该系统无法处理来自 Amazon SNS 的有效请求的异常时,可能会发生服务器端错误。在发生服务器端错误时,Amazon SNS 会使用线性或指数退避函数重试失败的传输。对于因 Amazon SQS 或 AWS Lambda 支持的 AWS 托管终端节点导致的服务器端错误,Amazon SNS 会重试传输最多 100015 次(时间超过 23 天)。

客户托管的终端节点(如 HTTP、SMTP、SMS 或移动推送)也可能会导致出现服务器端错误。Amazon SNS 也将重试传输到这些类型的终端节点。虽然 HTTP 终端节点支持客户定义的重试策略,但 Amazon SNS 会将 SMTP、SMS 和移动推送终端节点的内部传输重试策略设置为 50 次(时间超过 6 小时)。

死信队列的工作方式

死信队列将附加到 Amazon SNS 订阅(而不是主题),因为消息传输是在订阅级别进行的。这使您能够更轻松地识别每条消息的原始目标终端节点。

与 Amazon SNS 订阅关联的死信队列是普通 Amazon SQS 队列。有关消息保留期的更多信息,请参阅 Amazon Simple Queue Service 开发人员指南 中的与消息相关的配额。您可以使用 Amazon SQS SetQueueAttributes API 操作来更改消息保留策略。为了使您的应用程序更具弹性,我们建议将死信队列的最长保留期设置为 14 天。

如何将消息移至死信队列中?

可以使用重新驱动策略 将您的消息移至死信队列中。重新驱动策略是一个引用死信队列 ARN 的 JSON 对象。deadLetterTargetArn 属性指定 ARN。ARN 必须指向您的 Amazon SNS 订阅所在的 AWS 账户和区域中的 Amazon SQS 队列。有关更多信息,请参阅 为 Amazon SNS 订阅配置 Amazon SNS 死信队列

注意

当前,您不能将 Amazon SQS FIFO 队列用作 Amazon SNS 订阅的死信队列。

以下 JSON 对象是附加到 SNS 订阅的示例重新驱动策略。

{ "deadLetterTargetArn": "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue" }

如何将消息移出死信队列?

可以通过两种方式将消息移出死信队列:

  • 避免编写 Amazon SQS 使用者逻辑 – 将死信队列设置为 Lambda 函数的事件源以耗尽死信队列。

  • 编写 Amazon SQS 使用者逻辑 – 使用 Amazon SQS API、AWS 开发工具包或 AWS CLI 编写用于轮询、处理和删除死信队列中的消息的自定义使用者逻辑。

如何监控和记录死信队列?

可以使用 Amazon CloudWatch 指标监控与 Amazon SNS 订阅关联的死信队列。所有 Amazon SQS 队列每五分钟发出一次 CloudWatch 指标。有关更多信息,请参阅 Amazon Simple Queue Service 开发人员指南 中的可用于 Amazon SQS 的 CloudWatch 指标。所有带死信队列的 Amazon SNS 订阅也会发出 CloudWatch 指标。有关更多信息,请参阅 使用 CloudWatch 监控 Amazon SNS 主题

要收到死信队列中的活动的通知,您可以使用 CloudWatch 指标和警报。例如,如果您希望死信队列始终为空,可以为 NumberOfMessagesSent 指标创建 CloudWatch 警报。您可以将警报阈值设置为 0,并指定警报关闭时将通知发送到的 Amazon SNS 主题。此 Amazon SNS 主题可以将警报通知传输到任何终端节点类型(例如,电子邮件地址、电话号码或移动寻呼机应用程序)。

您可以使用 CloudWatch Logs 调查导致任何 Amazon SNS 传输失败以及将消息发送到死信队列的异常。Amazon SNS 会在 CloudWatch 中记录成功和失败的传输。有关更多信息,请参阅 Amazon SNS 消息传输状态