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

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

Amazon SQS 队列类型

Amazon SQS 支持两种类型的队列 - 标准队列和 FIFO 队列。使用下表中的信息选择适合您情况的队列。要详细了解 Amazon SQS 队列,请参阅Amazon SQS 标准队列亚马逊SQSFIFO队列

标准队列 FIFO 队列

无限制吞吐量:标准队列支持每个 API 操作(SendMessageReceiveMessageDeleteMessage)几乎每秒无限次的 API 调用。这种高吞吐量使其非常适合需要快速处理大量消息的应用场景,例如实时数据流或大型应用程序。虽然标准队列会根据需求自动扩展,但您必须监控使用模式以确保实现最佳性能,特别是在工作负载较高的区域。

至少传递一次:保证至少传递一次,这意味着每条消息至少传递一次,但在某些情况下,由于重试或网络延迟,一条消息可能会传递多次。在设计应用程序时,您应该使用幂等性操作来处理可能出现的重复消息,从而确保多次处理同一条消息不会影响系统的状态。

最大努力排序:提供“最大努力排序”功能,这意味着虽然 Amazon SQS 尝试按照消息发送顺序传送消息,但不能保证这一点。在某些情况下,消息可能会无序到达,尤其是在高吞吐量或故障恢复的情况下。对于消息处理顺序至关重要的应用程序,您应该处理应用程序中的重新排序逻辑,或者使用 FIFO 队列来保证严格的排序。

持久性和冗余:标准队列通过在多个 Amazon 可用区存储每条消息的多个副本来确保高持久性。这样可以确保即使基础设施出现故障,消息也不会丢失。

可见性超时:Amazon SQS 让您能够配置可见性超时以控制消息在被接收后隐藏多长时间,从而确保在消息得到完全处理或超时到期之前,其他用户无法处理该消息。

高吞吐量:如果您使用批处理,则 FIFO 队列支持每个 API 方法(SendMessageBatchReceiveMessageBatchDeleteMessageBatch)每秒最多处理 3000 条消息。这种吞吐量依赖于每秒 300 次 API 调用,每次 API 调用都批量处理 10 条消息。通过启用高吞吐量模式,您可以将每秒事务数(TPS)扩展到 3 万个,但这会放宽消息组内的顺序要求。在不使用批处理的情况下,FIFO 队列支持每个 API 方法(SendMessageReceiveMessageDeleteMessage)每秒最多 300 次 API 调用。如果您需要更高的吞吐量,可以通过 Amazon Support Center 请求增加配额。要启用高吞吐量模式,请参阅为 Amazon SQS 中的 FIFO 队列启用高吞吐量

仅处理一次:FIFO 队列仅将每条消息传递一次,并在您处理和删除消息之前保持消息处于可用状态。通过使用 MessageDeduplicationId 或基于内容的重复数据删除等功能,即使由于网络问题或超时而重试,也可以防止消息重复。

先进先出传递:FIFO 队列可以确保您按照每个消息组中的发送顺序接收消息。通过将消息分配到多个组中,您可以并行处理这些消息,同时保持每个组内的顺序。

标准队列消息传递。
FIFO 队列消息传递。
当吞吐量至关重要时,请使用标准队列在应用程序之间发送数据,例如:
  • 将实时用户请求从密集型后台工作中分离。允许用户快速上传媒体文件,同时您在后台处理诸如调整大小或编码等任务,从而确保快速响应而不会使系统过载。

  • 将任务分配给多个 Worker 节点。将大量信用卡验证请求分配到多个 Worker 节点,并使用幂等性操作处理重复消息,以避免处理错误。

  • 对消息进行批处理,以供未来使用。将多个条目排入队列,以便批量添加至数据库。由于消息顺序无法保证,因此您可以将系统设计为能够处理无序消息(如有需要)。

如果事件顺序非常重要,可以使用 FIFO 队列在应用程序之间发送数据,例如:

  • 确保按正确的顺序运行用户输入的命令。这是 FIFO 队列的关键应用场景,在这种场景下,命令的顺序至关重要。例如,如果用户在应用程序中执行一系列操作,FIFO 队列可以确保按输入的顺序执行操作。

  • 通过按正确的顺序发送价格修改来显示正确的产品价格。FIFO 队列可以确保产品价格的多次更新按顺序到达并得到处理。如果不使用 FIFO,系统可能会在价格上涨后处理降价,从而导致显示不正确的数据。

  • 防止学员在注册账户之前参加课程。借助 FIFO 队列,您可以确保注册流程按正确的顺序执行。系统首先处理账户注册,然后处理选课请求,从而防止系统提前处理选课请求。