AWS SQS FIFO队列SendMessageBatch并发限制及调用可行性问询
AWS SQS FIFO队列服务限制问题解答
1. 最大并发请求上限规则
- SQS FIFO队列不存在固定的并发请求数硬阈值,限流是按每秒API请求数、每秒处理消息数、每秒数据吞吐量三个维度判定,默认配额和队列模式有关:
- 未开启高吞吐量的标准FIFO队列:单队列默认配额为每秒300次API请求、每秒3000条消息、每秒20MB数据吞吐量,三个指标任意一个触顶就会触发限流。由于
sendMessageBatch单次最多支持传10条消息,300次/秒的批量API请求刚好打满3000条/秒的消息数配额。 - 开启高吞吐量模式的FIFO队列:默认配额提升至每秒3000次API请求、每秒30000条消息、每秒200MB数据吞吐量,有更高需求还可以向AWS提交配额提升申请,没有固定上限。
- 未开启高吞吐量的标准FIFO队列:单队列默认配额为每秒300次API请求、每秒3000条消息、每秒20MB数据吞吐量,三个指标任意一个触顶就会触发限流。由于
- 额外注意:FIFO的顺序保证是按消息组(
MessageGroupId)维度生效的,单个消息组默认最多支持每秒300条消息(开高吞吐量后提升到每秒3000条),不同消息组的请求完全并行处理,不会互相阻塞。
2. 200次并发批量发送请求的承载能力判断
你描述的场景(单次sendMessageBatch传10条消息、单批总大小<256KB、并发发起200次调用)完全在SQS FIFO的默认承载范围内,不会出现持续性的服务处理失败,判断依据如下:
- 从API请求数看:200次并发请求低于默认300次/秒的API请求配额;
- 从消息数看:200批累计2000条消息,低于默认3000条/秒的消息数配额;
- 从吞吐量看:受网络传输延迟、SDK连接池调度的影响,200个并发请求不可能在同一毫秒全部到达SQS服务端,会自然形成几十到上百毫秒的时间窗口差,就算单批大小接近256KB,实际落到SQS端的每秒吞吐量也很难打满20MB的默认阈值。
有两个特殊场景需要留意:
- 如果200批消息全部指定了同一个
MessageGroupId,会触发单消息组300条/秒的配额限制,超量请求会收到限流响应,AWS SDK默认配置的指数退避重试机制会自动处理这类偶发限流,不需要额外改代码; - 如果你的部署环境到SQS的网络延迟极低,所有请求真的在极短时间内全部打满20MB/秒的吞吐量阈值,也只会触发偶发限流,重试即可正常处理。
你提供的并发发送代码本身符合API调用规范,参考如下:
const totalSqsBatches = 200; const sqsPromises = []; for (let batch = 0; batch < totalSqsBatches; batch++) { sqsPromises.push( sqs.sendMessageBatch({ Entries: sqsEntries.slice(batch, (batch + 1) * 10), QueueUrl: URL, }) ); } await Promise.all(sqsPromises).catch(err => console.error(err))
- 实操提示:如果运行中频繁收到限流错误,优先检查是否所有消息都用了同一个
MessageGroupId,确认后要么拆分消息组分散压力,要么开启FIFO队列的高吞吐量模式即可,不需要改动业务发送逻辑。
内容的提问来源于stack exchange,提问作者Mithiridi Prasanth
相关产品推荐
相关产品推荐

