Amazon SNS 死信队列 (DLQ) - Amazon Simple Notification Service

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

Amazon SNS 死信队列 (DLQ)

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

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

  • 对于 FIFO 主题,您可以将 Amazon SQS 队列用作 Amazon SNS 订阅的死信队列。FIFO 主题订阅使用 FIFO 队列,而标准主题订阅使用标准队列。

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

为什么消息传输会失败?

通常,当 Amazon SNS 由于客户端服务器端错误无法访问订阅的终端节点时,消息传输将失败。当 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 死信队列

以下 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 消息传输状态