

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

# FIFO 主题的 Amazon SNS 消息持久性
<a name="fifo-message-durability"></a>

Amazon SNS FIFO 主题和 Amazon SQS 队列具有持久性。这两种资源类型都以冗余方式跨多个可用区存储消息，并提供死信队列以处理异常情况。

在 Amazon SNS 中，当 Amazon SNS 主题由于客户端或服务器端错误无法访问订阅的 Amazon SQS 队列时，消息传输将失败。
+ 当 Amazon SNS FIFO 主题具有过时的订阅元数据时，会发生客户端错误。两个常见的客户端错误发生于 Amazon SQS 队列所有者执行以下操作之一时：
  + 删除队列。
  + 以防止 Amazon SNS 服务委托人向其传输消息的方式更改队列策略。

  Amazon SNS 不会重试传输由于客户端错误而失败的消息。
+ 在以下情况下可能会发生服务器端错误：
  + Amazon SQS 服务不可用。
  + Amazon SQS 无法处理来自 Amazon SNS 服务的有效请求。

  在发生服务器端错误时，Amazon SNS FIFO 主题会最多重试失败的传输 100015 次（时间超过 23 天）。有关更多信息，请参阅 [Amazon SNS 消息传输重试](sns-message-delivery-retries.md)。

对于任何类型的错误，Amazon SNS 都可以将消息搁置到 Amazon SQS 死信队列中，以免数据丢失。

在 Amazon SQS 中，当使用者应用程序无法接收消息、处理消息并从队列中删除消息时，消息处理将失败。当接收请求的最大数量失败时，Amazon SQS 可以将消息搁置到死信队列中，以免数据丢失。

在[汽车零部件价格管理示例使用案例](fifo-example-use-case.md)，公司可以为每个 Amazon SNS FIFO 主题订阅以及每个订阅的 Amazon SQS 队列分配一个 Amazon SQS 死信队列 (DLQ)。这可以保护公司免受任何价格更新损失。

![\[一个示例，演示如何将死信队列（DLQ）与 Amazon SNS FIFO 主题和 Amazon SQS 队列集成，以确保汽车零部件价格管理系统中的消息可靠性。它显示了用于批发、零售和分析目的的每个 Amazon SNS FIFO 订阅与相应的 Amazon SQS FIFO 或标准队列配对的设置，每个队列都配备了自己的类型匹配的 DLQ，以防止因处理失败而导致的消息丢失。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/sns-fifo-dlq.png)


与 Amazon SNS 订阅关联的死信队列必须是与订阅队列类型相同的 Amazon SQS 队列。例如，Amazon SQS FIFO 队列的 Amazon SNS FIFO 订阅必须将 Amazon SQS FIFO 队列用作死信队列。同样，Amazon SQS 标准队列的 Amazon SNS FIFO 订阅必须使用 Amazon SQS 标准队列作为死信队列。有关更多信息，请参阅 *AWS 计算博客*上的 [Amazon SNS 死信队列](sns-dead-letter-queues.md) 和[使用 DLQ 为 Amazon SNS、Amazon SQS、AWS Lambda 设计持久的无服务器应用程序](https://aws.amazon.com/blogs/compute/designing-durable-serverless-apps-with-dlqs-for-amazon-sns-amazon-sqs-aws-lambda/ )博客文章。

为了延长持久性以帮助从下游故障中恢复，主题所有者还可以使用 FIFO 主题将消息归档长达 365 天。然后，主题订阅用户可以将这些消息重播到已订阅的端点，以恢复因下游应用程序故障而丢失的消息，或者复制现有应用程序的状态。有关更多信息，请参阅[FIFO 主题的 Amazon SNS 消息归档与重播功能](fifo-message-archiving-replay.md)。