Amazon SQS 中的 FIFO 队列传递逻辑 - Amazon Simple Queue Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon SQS 中的 FIFO 队列传递逻辑

以下概念阐明了 Amazon SQS FIFO 队列如何处理消息的发送和接收,尤其是在处理消息排序和消息组时。 IDs

发送消息

Amazon SQS FIFO 队列使用唯一的重复数据删除 IDs 和消息组来保留消息顺序。 IDs本主题重点介绍了消息组 IDs 对保持组内严格排序的重要性,并重点介绍了确保在多个生产者之间实现可靠、有序的消息传递的最佳实践。

  1. 订单保存

    • 当多条消息连续发送到具有唯一消息重复数据删除功能的 FIFO 队列时 IDs,Amazon SQS 会存储这些消息并确认其传输。然后按照传输的确切顺序接收和处理这些消息。

  2. 消息组 ID

    • 在 FIFO 队列中,根据消息组 ID 对消息进行排序。如果多个创建者或线程使用相同的消息组 ID 发送消息,Amazon SQS 会确保按照消息到达顺序存储和处理这些消息。

    • 最佳实践:为了保证多个生产者之间的严格消息顺序,请为来自每个生产者的所有消息分配一个唯一的消息组 ID。

  3. 按组排序

    • FIFO 队列逻辑以每个消息组 ID 为基础应用:

      • 每个消息组 ID 代表一组不同的、有序的消息。

      • 在消息组 ID 中,所有消息都按严格的顺序发送和接收。

      • 具有不同消息组的消息 IDs 可能会到达或处理顺序混乱。

    • 要求-您必须将消息组 ID 与每条消息相关联。如果发送的消息没有群组 ID,则操作将失败。

    • 单组方案-如果您要求按严格顺序处理所有消息,请为每封邮件使用相同的消息组 ID。

接收消息

Amazon SQS FIFO 队列处理消息检索,包括批处理、FIFO 订单保证和请求特定消息组的限制。 IDs本主题介绍了 Amazon SQS 如何在保持严格的排序和可见性规则的 IDs 同时检索消息组内和跨消息组的消息。

  1. 批量检索

    • 从包含多个消息组的 FIFO 队列接收消息时 IDs,Amazon SQS:

      • 尝试在一次呼叫中返回尽可能多的具有相同消息组 ID 的消息。

      • 允许其他使用者 IDs 同时处理来自不同消息组的消息。

    • 重要澄清

      • 您可以一次性收到来自同一个消息组 ID 的多条消息(使用MaxNumberOfMessages参数一次调用最多可接收 10 条消息)。

      • 但是,在以下之前,您无法在后续请求中收到来自同一消息组 ID 的其他消息:

        • 当前收到的消息已删除,或者

        • 它们再次变为可见(例如,在可见性超时到期之后)。

  2. FIFO 订单保障

    • 批量检索的消息在组中保留其 FIFO 顺序。

    • 如果同一个消息组 ID 的可用消息少于 10 条,则 Amazon SQS 可能会在同一批次 IDs 中包含来自其他消息组的消息,但每个组都保留 FIFO 顺序。

  3. 消费者限制

    • 您不能明确请求接收来自特定消息组 ID 的消息。

多次重试

生产者和消费者可以安全地重试 Amazon SQS FIFO 队列中失败的操作,而不会中断消息顺序或引入重复消息。本主题重点介绍重复数据删除 IDs 和可见性超时如何确保重试期间的消息完整性。

  1. 制作人重试

    • 如果SendMessage操作失败,创建者可以重试使用相同的消息重复数据删除 ID 多次发送消息。

    • 只要在重复数据删除间隔到期之前,生产者至少收到一次确认,就会重试:

      • 不要引入重复的消息。

      • 不要扰乱留言顺序。

  2. 消费者重试

    • 如果ReceiveMessage操作失败,使用者可以根据需要使用相同的接收请求尝试 ID 重试多次。

    • 只要消费者在可见性超时到期之前收到至少一个确认,就会重试:

      • 不要扰乱留言顺序。

关于 FIFO 行为的其他注意事项

了解如何处理可见性超时、启用多个消息组的并行处理以及确保在单组 IDs场景中进行严格的顺序处理。

  1. 处理可见性超时

    • 当消息被检索但未被删除时,该消息将保持不可见状态,直到可见性超时到期。

    • 在第一条消息被删除或再次可见之前,不会返回来自同一消息组 ID 的其他消息。

  2. 并发和并行处理

    • FIFO 队列允许并行处理不同消息组 IDs中的消息。

    • 为了最大限度地提高并发性,请设计具有多个消息组的系统, IDs 以实现独立的工作流程。

  3. 单组场景

    • 要严格按顺序处理 FIFO 队列中的所有消息,请为队列中的所有消息使用单个消息组 ID。

便于理解的示例

以下是演示 Amazon SQS 中 FIFO 队列行为的实际场景。

  1. 场景 1:单个群组 ID

    • 生产者使用相同的消息组 ID 组 A 发送五条消息

    • 消费者按照 FIFO 的顺序接收这些消息。在消费者删除这些消息或可见性超时到期之前,不会收到来自组 A 的其他消息。

  2. 场景 2:多个群组 IDs

    • 生产者向组 A 发送五条消息,向 B 组发送 5 条消息。

    • 消费者 1 处理来自组 A 的消息,而消费者 2 处理组 B 的消息。这允许并行处理,并在每个组内保持严格的顺序。

  3. 场景 3:批量检索

    • 生产者向A组发送了七条消息,向B组发送了三条消息。

    • 一个消费者最多可以检索 10 条消息。如果队列允许,它可能会返回:

      • 来自 A 组的七封邮件和来自 B 组的三封邮件(如果一个群组中可用的消息较少,则更少)。