SQS Standard 与 FIFO 队列
比较具有最大吞吐量的 Standard 队列与支持有序且恰好一次处理的 FIFO 队列,并选择合适的类型。
SQS Standard 与 FIFO 队列 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。
消息队列为何重要
消息队列将生产者与消费者解耦:生产者向队列发送消息时,无需等待消费者处理。消费者可以按照自己的速率处理消息。这种模式可以防止处理速度快的生产者压垮处理速度慢的消费者,支持对每个层级独立扩展,并在消费者暂时不可用时提供持久化缓冲区。Amazon SQS 是 AWS 完全托管且高可用的消息队列服务。
SQS 标准队列特性
Standard 队列提供无限吞吐量(每秒事务数几乎不受限制)。它们保证至少一次投递——在极少数情况下,由于分布式基础设施的原因,一条消息可能会被投递多次。消息顺序采用尽力而为的方式:消息通常会按照发送顺序投递,但不作保证。当吞吐量至关重要,并且您的消费者能够处理偶尔的重复消息和乱序投递时,Standard 队列非常适用。
# Create a Standard queue
aws sqs create-queue \
--queue-name 'OrderProcessingQueue'
# Send a message
aws sqs send-message \
--queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/OrderProcessingQueue' \
--message-body 'OrderId-12345'SQS FIFO 队列特性
FIFO 队列(先进先出)保证恰好一次处理和严格的消息顺序。消息会严格按照发送顺序投递。FIFO 队列支持每秒最多300 个事务(使用批处理时为 3,000 个)。FIFO 队列名称必须以 .fifo 结尾。当顺序和恰好一次语义至关重要时,请使用 FIFO 队列,例如金融交易、电商订单处理和库存更新。
# Create a FIFO queue
aws sqs create-queue \
--queue-name 'OrderProcessingQueue.fifo' \
--attributes '{
"FifoQueue": "true",
"ContentBasedDeduplication": "true"
}'FIFO 队列中的消息组
FIFO 队列使用消息组 ID对队列内的顺序进行分区。具有相同组 ID 的消息会按顺序投递;具有不同组 ID 的消息可以并行处理。例如,使用 customerId 作为组 ID:每位客户的订单会按顺序处理,而不同客户的订单可以并发处理。这样既能实现 FIFO 语义,又能让多个消费者进行水平扩展。
aws sqs send-message \
--queue-url 'https://sqs.us-east-1.amazonaws.com/123456789012/Orders.fifo' \
--message-body 'Order details here' \
--message-group-id 'customer-789' \
--message-deduplication-id 'order-uuid-abc123'FIFO 队列中的去重
FIFO 队列使用去重 ID来防止重复处理消息。如果两条消息在 5 分钟的去重时间间隔内使用相同的 ID 发送,第二条消息会被静默丢弃。您可以显式提供去重 ID(MessageDeduplicationId),也可以启用基于内容的去重,让 SQS 自动计算消息正文的 SHA-256 哈希值并将其用作去重 ID。基于内容的去重更简单,但要求消息正文具有唯一性。
消息保留期和大小限制
SQS 会在可配置的时间段内保留消息:最短1 分钟,最长14 天(默认为 4 天)。在保留期内未被使用的消息会自动删除。消息大小上限为256 KB。对于更大的负载,请使用SQS 扩展客户端库,或将负载存储在 S3 中,仅在 SQS 消息中发送 S3 对象引用。Standard 和 FIFO 队列共享这些限制。
接收和删除消息
消费者使用 receive-message 轮询队列。接收后,消息会在可见性超时期间变为不可见(其他消费者无法看到)。消费者必须处理消息,然后在超时到期前使用回执句柄显式删除消息。如果消费者崩溃或未能及时删除消息,消息会重新出现,其他消费者便可以处理它——这使 Standard 队列能够实现至少一次投递。
RECEIPT=$(aws sqs receive-message \
--queue-url 'https://...' \
--query 'Messages[0].ReceiptHandle' --output text)
# Process message, then delete it
aws sqs delete-message \
--queue-url 'https://...' \
--receipt-handle "$RECEIPT"实际吞吐量比较
Standard 队列适用于:生成图片缩略图、发送通知邮件、处理日志等场景——这些工作负载可以幂等地处理重复消息,且不要求消息顺序。FIFO 队列适用于:银行转账处理(先借记后贷记)、电商购物车更新(先添加商品后结算),以及要求步骤 2 必须在步骤 1 之后执行的工作流。对于大多数高吞吐量架构,Standard 队列是默认选择;只有在顺序或恰好一次投递属于硬性要求时,才应切换到 FIFO。
通过批处理提升吞吐量并降低成本
SQS 按 API 请求收费。请使用批处理操作,每次 API 调用最多发送、接收和删除10 条消息,从而最多将成本降低 10 倍。FIFO 队列支持高吞吐量模式(启用批处理),使用每批 10 条消息时可将上限提高到每秒 3,000 条消息。在生产环境中,请始终使用 send-message-batch 和 delete-message-batch,以尽量降低 API 调用成本。
aws sqs send-message-batch \
--queue-url 'https://...' \
--entries '[
{"Id": "msg1", "MessageBody": "Order-001"},
{"Id": "msg2", "MessageBody": "Order-002"},
{"Id": "msg3", "MessageBody": "Order-003"}
]'队列访问策略
SQS 队列通过基于资源的策略(队列策略)进行保护,这些策略控制谁可以向队列发送消息或从队列接收消息。当允许跨账户访问,或 SNS 向 SQS 队列发布消息时,这一点至关重要。Lambda 访问 SQS 的权限由 Lambda 执行角色的 IAM 策略控制(sqs:ReceiveMessage、sqs:DeleteMessage、sqs:GetQueueAttributes)。请始终遵循最小权限原则:不要向消费者授予超出接收和删除所需范围的权限。
选择 Standard 还是 FIFO:决策指南
请通过以下问题进行选择:(1) 顺序是否重要?如果重要 → FIFO。(2) 是否要求恰好一次处理?如果要求 → FIFO。(3) 是否需要超过 3,000 TPS 的吞吐量?如果需要 → Standard(FIFO 使用批处理时上限为 3,000 TPS)。(4) 消费者能否处理重复消息?如果可以 → Standard 更简单且成本更低。对于 SAA-C03 考试,FIFO 的关键词包括:“ordering”“exactly-once”“sequential”“deduplication”。Standard 的关键词包括:“high throughput”“best effort”“at-least-once”。
快速检查
请测试您对本课 AWS 解决方案架构师(SAA-C03)概念的理解。
课程回顾
本课介绍了以下内容:Standard 队列提供无限吞吐量、至少一次投递和尽力而为的顺序,适合能够容忍重复消息的高容量工作负载;FIFO 队列通过消息组 ID 和去重 ID 保证恰好一次处理及严格的消息顺序,使用批处理时上限为 3,000 TPS;两者的选择取决于顺序和去重是否属于硬性要求。接下来我们将学习可见性超时、死信队列和长轮询。
常见问题解答
「SQS Standard 与 FIFO 队列」课时是免费的吗?
是的 — 「SQS Standard 与 FIFO 队列」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。
「SQS Standard 与 FIFO 队列」这节课中我会学到什么?
比较具有最大吞吐量的 Standard 队列与支持有序且恰好一次处理的 FIFO 队列,并选择合适的类型。 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AWS Solutions Architect 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「SQS Standard 与 FIFO 队列」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AWS Solutions Architect 课中编写并运行代码吗?
能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- SQS Standard 与 FIFO 队列
- 可见性超时、DLQ 与长轮询
- SNS 主题与扇出架构
- SQS 消息筛选与 SNS + SQS 集成