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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon SNS 死信队列 (DLQ)

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

注意
  • Amazon SNS 订阅和 Amazon SQS 队列必须处于相同Amazon账户和区域。

  • 对于FIFO 主题中,使用 Amazon SQS 队列用作 Amazon SNS 子占用的死信队列。

  • 要将加密的 Amazon SQS 队列用作死信队列,您必须使用带有密钥策略的自定义 CMK,该策略将向 Amazon SNS 服务主体授予Amazon KMSAPI 操作。有关更多信息,请参阅 。静态加密并在本指南中和使用服务器端加密 (SSE) 和保护 Amazon SQS 数据Amazon KMS中的Amazon Simple Queue Service 开发者指南

为什么消息传输会失败?

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

客户端错误

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

服务器端错误

当负责已订阅终端节点的系统变得不可用或返回一个指示该系统无法处理来自 Amazon SNS 的有效请求的异常时,可能会发生服务器端错误。当发生服务器端错误时,Amazon SNS 会使用线性或指数退避函数重试失败的传输。对于由Amazon托管终端节点由 Amazon SQS 或Amazon Lambda中,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 来更改消息保留策略SetQueueAttributesAPI 操作。为了使您的应用程序更具弹性,我们建议将死信队列的最长保留期设置为 14 天。

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

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

注意

对于FIFO 主题中,使用 Amazon SQS 队列用作 Amazon SNS 子占用的死信队列。

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

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

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

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

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

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

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

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

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

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