Amazon SQS
全托管消息队列服务,实现分布式系统间的异步通信,通过解耦发送方和接收方提升系统整体容错性
概述
Amazon Simple Queue Service (SQS) 是一项全托管消息队列服务,在分布式系统组件之间提供可靠的异步通信。发送方将消息放入队列,接收方按自身节奏从队列中取出消息处理。这种解耦使得即使接收方暂时不可用,消息也不会丢失,系统整体的容错性和可扩展性大幅提升。
标准队列与 FIFO 队列的设计决策
SQS 提供标准队列和 FIFO 队列两种类型。标准队列提供近乎无限的吞吐量和至少一次投递保证,但消息可能重复或乱序。FIFO 队列保证严格的先进先出顺序和恰好一次处理,但吞吐量限制为每秒 3,000 条消息(批处理时)。选择标准还是 FIFO 取决于业务需求:日志收集、图像处理等对顺序不敏感的场景用标准队列;订单处理、金融交易等顺序至关重要的场景用 FIFO 队列。FIFO 队列的消息组 ID 允许在保证组内顺序的同时实现组间并行处理。
可见性超时与死信队列
可见性超时(Visibility Timeout)是 SQS 的核心机制。消费者从队列取出消息后,该消息在超时期间对其他消费者不可见。如果消费者在超时内成功处理并删除消息,则流程完成;如果处理失败未删除,消息在超时后重新变为可见供其他消费者处理。默认超时为 30 秒,应根据处理时间设置为预期处理时间的 6 倍。死信队列(DLQ)接收多次处理失败的消息。通过 maxReceiveCount 设置最大接收次数(通常 3-5 次),超过后消息自动移入 DLQ。DLQ 中的消息需要人工调查失败原因,是运维中不可忽视的监控对象。
实务中的活用模式
SQS 最常见的模式是 Lambda 触发器集成。SQS 作为 Lambda 的事件源,Lambda 自动轮询队列并批量处理消息。批量大小(1-10 条)和并发数可配置,实现背压控制。SNS→SQS 扇出模式中,每个 SQS 队列独立消费,一个队列的处理延迟不影响其他队列。长轮询(Long Polling)通过设置 WaitTimeSeconds(最大 20 秒)减少空轮询的 API 调用次数和成本。消息延迟投递(Delay Queue)可设置 0-900 秒的延迟,用于定时任务或重试间隔。费用为每百万次请求 0.40 美元(标准)/ 0.50 美元(FIFO),消息保留期最长 14 天。