

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

# FIFO 主题的 Amazon SNS 消息排序详细信息
<a name="fifo-topic-message-ordering"></a>

Amazon SNS FIFO 主题始终按照消息发布到主题的确切顺序，向订阅的 Amazon SQS 队列传送消息，并且只传送一次。订阅 Amazon SQS FIFO 队列后，该队列的使用者将按照消息传送到队列的确切顺序接收消息，且不会出现重复消息。但是，订阅了 Amazon SQS 标准队列后，该队列的使用者可能会多次收到乱序消息。这可以进一步将订阅者与发布者分开，从而在消息使用和成本优化方面为订阅者提供更大的灵活性，如基于 [Amazon SNS FIFO 主题示例使用案例](fifo-example-use-case.md)的下图所示。

![\[Amazon SNS FIFO（先进先出）主题中的消息传送系统示例，重点介绍了如何以严格的顺序将消息一致地传递到 Amazon SQS FIFO 队列。这与 Amazon SQS 标准队列的行为形成鲜明对比，在标准队列中，消息可能不按顺序送达，而且不止一次。该示例展示了三种不同的订阅用户类型（分析功能、批发应用程序和零售应用程序），演示了每种订阅用户是如何根据他们订阅的队列类型按严格顺序或按最大努力顺序接收消息的。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/sns-fifo-ordering-1.png)


请注意，不存在订阅者的隐含排序。以下示例显示消息 **m1** 首先传输给批发订阅者，然后传输给零售订阅者，再传输给分析订阅者。消息 **m2** 首先传输给零售订阅者，然后传输给批发订阅者，最后传输给分析订阅者。尽管这两条消息以不同的顺序传递给订阅者，但是每个 Amazon SQS FIFO 订阅者都会保留消息顺序。每个订阅者都与任何其他订阅者隔离感知。

![\[示例：Amazon SNS FIFO 主题和各种类型的订阅用户（包括 Amazon SQS FIFO 和标准队列）如何处理消息的排序和传送。它显示消息被发布到主题并传送到不同类型的队列，确保 FIFO 队列的传送顺序和标准队列的最大努力排序。此设置支持电子商务平台中的场景，在这些场景中，不同的组件需要按特定顺序可靠地传送消息才能进行精确处理。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/sns-fifo-ordering-2.png)


如果 Amazon SQS 队列订阅者无法访问，它可能会不同步。例如，假设批发应用程序队列所有者错误地更改了 [Amazon SQS 队列策略](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-using-identity-based-policies.html)，以防止 Amazon SNS 服务委托人将消息传递到队列。在这种情况下，将价格更新传输到批发队列失败，而零售和分析队列的价格更新成功，从而导致订阅者不同步。批发应用程序队列所有者更正队列策略后，Amazon SNS 将继续向订阅队列传递消息。在队列配置不正确时，发布到主题的任何消息都将被删除，除非对应的订阅已配置了[死信队列](sns-dead-letter-queues.md)。

![\[Amazon SNS FIFO 设置中的消息传递行为示例，在该设置中，消息通过 Amazon SQS 队列发布到不同的订阅用户类型（批发、零售和分析）。它重点介绍了队列策略配置错误对不同订阅用户队列间消息传送同步的影响。该示例演示了批发订阅用户的消息传输为何因策略错误而失败，但零售和分析订阅用户的消息传输却继续成功，这强调了正确的队列配置对于保持同步数据交付的重要性。这种情况凸显了 FIFO 主题在正常情况下确保按顺序交付和精确一次交付的能力以及配置错误的后果。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/sns-fifo-ordering-3.png)


您可以让多个应用程序（或同一应用程序中的多个线程）并行向 SNS FIFO 主题发布消息。执行此操作时，您可以有效地将消息排序委托给 Amazon SNS 服务。要确定已建立的消息序列，您可以检查序列号。

序列号是 Amazon SNS 为每条消息分配的大型、非连续的数字。序列号的长度为 128 位，并且每个[消息组](fifo-message-grouping.md)的序列号会继续增加。序列号作为消息正文的一部分传递给订阅的 Amazon SQS 队列。但是，如果启用[原信息传输](sns-large-payload-raw-message-delivery.md)，则传输到 Amazon SQS 队列的消息不包括序列号或任何其他 Amazon SNS 消息元数据。

![\[多个 Lambda 函数的示例将消息发布到 Amazon SNS FIFO（先入先出）主题，然后该主题将这些消息传送到 Amazon SQS FIFO 队列，从而保持严格的消息处理顺序。此设置用于确保按照在应用程序的不同组件之间发送消息的确切顺序进行处理，序列号表示组中每条消息的顺序。这种类型的配置对于必须严格维护操作和消息顺序以确保一致性的应用程序至关重要。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/sns-fifo-ordering-4.png)


Amazon SNS FIFO 主题定义消息组上下文中的排序。有关更多信息，请参阅 [FIFO 主题的 Amazon SNS 消息分组](fifo-message-grouping.md)。