

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

# Amazon SQS 队列类型
<a name="sqs-queue-types"></a>

Amazon SQS 支持两种类型的队列：[**标准队列**](standard-queues.md)和 [**FIFO**](sqs-fifo-queues.md) 队列。使用下表来确定哪种队列最适合您的需求。


| 标准队列 | FIFO 队列 | 
| --- | --- | 
| **无限制吞吐量** – 标准队列支持每个操作（[`SendMessage`](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)、[`ReceiveMessage`](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) 或 [`DeleteMessage`](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessage.html)）每秒几乎无限次的 API 调用。这种高吞吐量使其非常适合需要快速处理大量消息的应用场景，例如实时数据流或大型应用程序。虽然标准队列会根据需求自动扩展，但您必须监控使用模式以确保实现最佳性能，特别是在工作负载较高的区域。<br />**At-least-once 交付 ** — 保证至少传送一次，这意味着每条消息至少传送一次，但在某些情况下，由于重试或网络延迟，一条消息可能会多次传送。在设计应用程序时，您应该使用幂等性操作来处理可能出现的重复消息，从而确保多次处理同一条消息不会影响系统的状态。<br />**Best-effort 排序 ** — 提供尽力排序，这意味着，尽管 Amazon SQS 尝试按照发送顺序传送消息，但不能保证这一点。在某些情况下，消息可能会无序到达，尤其是在高吞吐量或故障恢复的情况下。对于消息处理顺序至关重要的应用程序，您应该处理应用程序中的重新排序逻辑，或者使用 FIFO 队列来保证严格的排序。<br />**耐久性和冗余 ** — 标准队列通过在多个 AWS 可用区存储每条消息的多个副本来确保高耐久性。这样可以确保即使基础设施出现故障，消息也不会丢失。<br />**可见性超时**：Amazon SQS 让您能够配置可见性超时以控制消息在被接收后隐藏多长时间，从而确保在消息得到完全处理或超时到期之前，其他用户无法处理该消息。 | **高吞吐量** – 如果您使用[批处理](sqs-batch-api-actions.md)，则 FIFO 队列支持每个 API 方法（[`SendMessageBatch`](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessageBatch.html)、[`ReceiveMessage`](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html) 或 [`DeleteMessageBatch`](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessageBatch.html)）每秒最多处理 3000 条消息。这种吞吐量依赖于每秒 300 次 API 调用，每次 API 调用都批量处理 10 条消息。通过启用高吞吐量模式，您可以将每秒事务数（TPS）扩展到 3 万个，但这会放宽消息组内的顺序要求。在不使用批处理的情况下，FIFO 队列支持每个 API 方法（`SendMessage`、`ReceiveMessage` 或 `DeleteMessage`）每秒最多 300 次 API 调用。如果您需要更高的吞吐量，可以通过 [AWS Support Center](https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase&limitType=service-code-sqs) 请求增加配额。要启用高吞吐量模式，请参阅[为 Amazon SQS 中的 FIFO 队列启用高吞吐量](enable-high-throughput-fifo.md)。<br />**Exactly-once 处理 ** — FIFO 队列将每条消息传送一次，并保持其可用状态，直到您对其进行处理和删除。通过使用 [`MessageDeduplicationId`](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html) 或基于内容的重复数据删除等功能，即使由于网络问题或超时而重试，也可以防止消息重复。<br />**First-in-first-out 交付 ** — FIFO 队列确保您按照每个消息组内发送消息的顺序接收消息。通过将消息分配到多个组中，您可以并行处理这些消息，同时保持每个组内的顺序。 | 
|  ![标准队列消息传递。](https://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-what-is-sqs-standard-queue-diagram.png)  |  ![FIFO 队列消息传递。](https://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-what-is-sqs-fifo-queue-diagram.png)  | 
| 当吞吐量至关重要时，请使用标准队列在应用程序之间发送数据，例如：+  **将实时用户请求从密集型后台工作中分离。**允许用户快速上传媒体文件，同时您在后台处理诸如调整大小或编码等任务，从而确保快速响应而不会使系统过载。 <br />+  **将任务分配给多个 Worker 节点。**将大量信用卡验证请求分配到多个 Worker 节点，并使用幂等性操作处理重复消息，以避免处理错误。 <br />+  **对消息进行批处理，以供未来使用。**将多个条目排入队列，以便批量添加至数据库。由于消息顺序无法保证，因此您可以将系统设计为能够处理无序消息（如有需要）。  | 如果事件顺序非常重要，可以使用 FIFO 队列在应用程序之间发送数据，例如：+  **确保按正确的顺序运行用户输入的命令。**这是 FIFO 队列的关键应用场景，在这种场景下，命令的顺序至关重要。例如，如果用户在应用程序中执行一系列操作，FIFO 队列可以确保按输入的顺序执行操作。 <br />+  **通过按正确的顺序发送价格修改来显示正确的产品价格。**FIFO 队列可以确保产品价格的多次更新按顺序到达并得到处理。如果不使用 FIFO，系统可能会在价格上涨后处理降价，从而导致显示不正确的数据。 <br />+  **防止学员在注册账户之前参加课程。**借助 FIFO 队列，您可以确保注册流程按正确的顺序执行。系统首先处理账户注册，然后处理选课请求，从而防止系统提前处理选课请求。  | 