Amazon SQS FIFO (先进先出) 队列 - Amazon Simple Queue Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Amazon SQS FIFO (先进先出) 队列

Amazon SQS FIFO 队列的高吞吐量目前为预览版,可能会发生变化。有关更多信息,请参阅预览版:FIFO 队列的高吞吐量

FIFO 队列具有标准队列的所有功能。

FIFO (先进先出) 队列旨在当操作和事件的顺序很重要或不能容忍重复项时,增强应用程序之间的消息收发。您可能会使用 FIFO 队列的情况示例包括:

  • 确保用户输入的命令按正确的顺序运行。

  • 通过按正确的顺序发送价格修改来显示正确的产品价格。

  • 在注册账户之前阻止学生注册课程。

FIFO 队列还提供恰好一次处理,但每秒事务数 (TPS) 有限:

  • 如果您使用批处理,则 FIFO 队列的每个 API 方法(SendMessageBatchReceiveMessageDeleteMessageBatch)每秒最多支持 3000 个事务。3000 个事务代表 300 个 API 调用,每个调用带有包含 10 条消息的一个批处理。要申请提高配额,请提交支持请求

  • 在不使用批处理的情况下,FIFO 队列的每个 API 方法(SendMessageReceiveMessageDeleteMessage)每秒最多支持 300 个 API 调用。

注意

FIFO 队列的名称必须以 .fifo 后缀结尾。 该后缀也包含在 80 个字符的队列名称配额之内。要确定队列是否为 FIFO,您可以检查队列名称是否以该后缀结尾。

Amazon SQS FIFO 队列在所有提供 的区域中Amazon SQS可用。

有关如何使用 Amazon SQS 控制台创建和配置队列的信息,请参阅创建 Amazon SQS 队列(控制台)。有关 Java 示例,请参阅Amazon SQS JavaSDK示例

有关与 FIFO 队列相关的配额,请参阅与队列相关的配额

有关使用 FIFO 队列的最佳实践,请参阅针对 Amazon SQS FIFO 队列的其他建议针对Amazon SQS标准队列和 FIFO 队列的建议

有关客户端和服务与 FIFO 队列的兼容性的信息,请参阅Compatibility

消息排序

FIFO 队列改进并补充标准队列。此队列类型最重要的特性是 FIFO (先进先出)传送一次性处理:

  • 发送和接收消息的顺序严格保持一致;一条消息传送一次后就保持可用,直到使用者处理并删除它为止。

  • 不会将重复项引入到队列中。

此外,FIFO 队列支持允许单个队列中存在多个有序消息组的消息组。 对于 FIFO 队列中的消息组数量没有配额限制。

关键术语

以下关键术语可帮助您更好地了解 FIFO 队列的功能。有关更多信息,请参阅 Amazon Simple Queue Service API Reference

消息重复数据删除 ID

The 用于已发送消息的重复数据删除的令牌。如果成功发送了一条具有特定消息重复数据删除 ID 的消息,则在发送时使用了同一消息重复数据删除 ID 的任何消息都会被成功接受,但在 5 分钟重复数据删除时间间隔内不会发出。

注意

消息重复数据删除应用于整个队列,而不应用于单个消息组。

Amazon SQS 甚至在消息被接收和删除之后也会继续跟踪消息重复数据删除 ID。

消息组 ID

指定某条消息属于特定消息组的标签。属于同一消息组的消息总是严格按照与消息组有关的某个顺序逐一进行处理(但是属于不同消息组的消息则不会进行有序处理)。

接收请求尝试 ID

用于 ReceiveMessage 调用的重复数据删除的令牌。

序列号

Amazon SQS 分配给每条消息的大型非连续编号。

FIFO 交付逻辑

以下概念可帮助您更好地了解如何向 FIFO 发送消息以及从中接收消息。

发送消息

如果将多条消息连续发送到 FIFO 队列(每条消息具有不同的消息重复数据删除 ID), 将Amazon SQS存储这些消息并确认传输。然后,可按传输每条消息的确切顺序接收和处理消息。

在 FIFO 队列中,消息根据消息组 ID 进行排序。如果多台主机(或同一主机上的不同线程)将具有相同消息组 ID 的消息发送到 FIFO 队列,则 按照消息到达以进行处理的顺序Amazon SQS存储消息。要确保 Amazon SQS 保留发送和接收消息的顺序,每个创建者应使用唯一的消息组 ID 来发送其所有消息。

FIFO 队列逻辑仅适用于每个消息组 ID。每个消息组 ID 表示 Amazon SQS 队列中的不同的有序的消息组。对于每一个消息组 ID,所有消息的发送和接收均严格遵循一定的顺序。但是,具有不同的消息组 ID 值的消息可能不会按顺序发送和接收。您必须将消息组 ID 与消息关联。如果您未提供消息组 ID,此操作将失败。如果您需要一组有序的消息,请为发送到 FIFO 队列的消息提供相同的消息组 ID。

接收消息

您无法请求接收具有特定消息组 ID 的消息。

当从具有多个消息组的 FIFO 队列接收消息时IDs, Amazon SQS 会先尝试返回尽可能多具有相同消息组 ID 的消息。这时其他使用者能处理具有不同消息组 ID 的消息。

注意

可使用 MaxNumberOfMessages 操作的 ReceiveMessage 请求参数在单次调用中接收多达 10 条消息。这些消息将保留其 FIFO 顺序,并且可以具有相同的消息组 ID。因此,如果具有相同消息组 ID 的消息少于 10 条,您可能会从同一批 10 条消息中的另一个消息组 ID 接收消息,但仍按 FIFO 顺序接收消息。

多次重试

FIFO 队列允许创建者或使用者进行多次重试:

  • 如果创建者检测到失败的 SendMessage 操作,它会使用同一个消息重复数据删除 ID 尽可能多地重新尝试发送。假设创建者在重复数据删除间隔过期前收到至少一次确认,则多次重试不会影响消息排序,也不会引入重复项。

  • 如果使用者检测到失败的 ReceiveMessage 操作,它可使用同一个接收请求尝试 ID 进行所需数量的重试。假设使用者在可见性超时过期前收到至少一次确认,则多次重试不会影响消息排序。

  • 在收到一个具有消息组 ID 的消息时,除非您删除该消息或该消息变为可见,否则不会返回同一消息组 ID 的更多消息。

确切一次处理

与标准队列不同,FIFO 队列不会引入重复的消息。FIFO 队列可帮助您避免向队列发送重复项。如果在 5 分钟重复数据删除时间间隔内重试 SendMessage 操作,则 Amazon SQS 不会将任何重复消息引入队列。

要配置重复数据删除,必须执行以下操作之一:

  • 启用基于内容的重复数据删除。这将指示 Amazon SQS 使用 SHA-256 哈希通过消息的正文(而不是消息的属性)生成消息重复数据删除 ID— 有关更多信息,请参阅 中有关 CreateQueueGetQueueAttributesSetQueueAttributes Amazon Simple Queue Service API Reference 操作的文档。

  • 为消息显式提供消息重复数据删除 ID (或查看序列号)。有关更多信息,请参阅 中有关 SendMessageSendMessageBatchReceiveMessage Amazon Simple Queue Service API Reference 操作的文档。

从标准队列移至 FIFO 队列

如果您有使用标准队列的现有应用程序,并且您希望利用 FIFO 队列的排序或确切一次处理功能,则需要正确配置队列和应用程序。

注意

您无法将现有标准队列转换为 FIFO 队列。要进行移动,您必须为应用程序创建新的 FIFO 队列,或删除现有标准队列并将其重新创建为 FIFO 队列。

要确保您的应用程序可正确处理 FIFO 队列,请使用以下核对清单:

  • 如果您使用批处理,则 FIFO 队列的每个 API 方法(SendMessageBatchReceiveMessageDeleteMessageBatch)每秒最多支持 3000 个事务。3000 个事务代表 300 个 API 调用,每个调用带有包含 10 条消息的一个批处理。要申请提高配额,请提交支持请求。 在不使用批处理的情况下,FIFO 队列的每个 API 方法(SendMessageReceiveMessageDeleteMessage)每秒最多支持 300 个 API 调用。

  • FIFO 队列不支持每消息延迟,而仅支持每队列延迟。如果您的应用程序在每条消息上设置相同的 DelaySeconds 参数值,您必须将应用程序修改为删除每消息延迟并改为在整个队列上设置 DelaySeconds

  • 发送到 FIFO 队列的每条消息都需要一个消息组 ID。如果您不需要多个有序的消息组,请为您的所有消息指定相同的消息组 ID。

  • 在将消息发送到 FIFO 队列之前,请确认以下内容:

    • 如果您的应用程序可发送具有相同的消息正文的消息,您可以将应用程序修改为针对每条已发送消息提供唯一的消息重复数据删除 ID。

    • 如果您的应用程序发送具有独特的消息正文的消息,您可以启用基于内容的重复数据删除。

  • 您不必对使用者进行任何代码更改。但是,如果处理消息需要较长时间且您的可见性超时已设置为一个较高值,请考虑向每个 ReceiveMessage 操作添加接收请求尝试 ID。这允许您在网络发生故障时重试接收尝试,并防止队列由于接收尝试失败而导致的暂停。

有关更多信息,请参阅 Amazon Simple Queue Service API Reference

Compatibility

客户

Amazon SQS 缓冲的异步客户端 当前不支持 FIFO 队列。

服务

如果您的应用程序使用多个AWS服务,或者混合使用 AWS 和外部服务,请务必了解哪些服务功能不支持 FIFO 队列。

将通知发送到 的某些AWS或外部服务Amazon SQS可能与 FIFO 队列不兼容,尽管允许您将 FIFO 队列设置为目标。

AWS 服务的以下功能当前与 FIFO 队列不兼容:

有关其他 服务与 FIFO 队列的兼容性的信息,请参阅您的服务文档。