DynamoDB ProvisionedThroughputExceededException
TL;DR — 你的读写速度超过了表或索引能提供的服务能力。把表切换到按需容量、调高预置的 RCU/WCU(或启用自动扩缩)、保留 SDK 默认的指数退避重试,并把流量摊开,别让某一个分区键变热。
含义
ProvisionedThroughputExceededException: You exceeded your maximum allowed
provisioned throughput for a table or for one or more global secondary indexes.在预置容量的表上,你超出了读/写容量单元——要么是整体超了,要么(更常见)是在单个分区上超了。它是 HTTP 400,但与 ValidationException 不同,它可以重试:AWS SDK 会自动带指数退避重试它,所以偶尔出现是正常的。持续出现则意味着确实预置不足,或者存在热键。这个错误会带上 ThrottlingReason 字段(例如 TableReadProvisionedThroughputExceeded)以及受影响资源的 ARN,于是你能分辨是哪张表或哪个索引在限流、以及是在哪类操作上。
为什么会发生
- 相对于实际流量预置容量不足。
- 热分区——流量集中在一个分区键上,于是单个分区分到的那份容量被耗尽,而整张表看起来还没吃饱。
- 尖峰流量比自动扩缩反应得更快——它是根据已消耗容量的指标来调整容量的,所以一次突然的阶跃会在扩容落地之前先被限流。
- 一次大的扫描或批量导入一口气吃光了所有容量。
- 某个 GSI 的容量低于写入速率——被限流的 GSI 会把基表也限流。
如何修复
- 如果流量不可预测,就切换到按需容量——它会自动伸缩,这个错误基本上就消失了(代价是改成按请求付费)。
- 如果你继续留在预置模式,就调高预置的 RCU/WCU,或者用一个合理的目标利用率启用自动扩缩。
- 保留指数退避重试——SDK 默认就这么做;别关掉它。对突发型负载使用自适应重试模式。
- 修好热分区——提高键的基数 / 给热键做写分片,让负载摊到各个分区上。
- 给批量作业限速,并缓存热点读取(DAX 或应用层缓存)以卸掉读压力。
常见问题
我该怎么修复 ProvisionedThroughputExceededException? 你的读写速度超过了表或索引能提供的服务能力。把表切换到按需容量、调高预置的 RCU/WCU(或启用自动扩缩)、保留 SDK 默认的指数退避重试,并把流量摊开,别让某一个分区键变热。
复现方法
把一张表预置为 1 RCU,写入一个刚好小于 4 KB 的项目,然后在紧凑循环里用强一致读把它读回来:
import boto3
ddb = boto3.client('dynamodb', region_name='us-east-1')
# table created with ProvisionedThroughput={'ReadCapacityUnits': 1, 'WriteCapacityUnits': 1}
ddb.put_item(TableName='my-table', Item={'pk': {'S': 'A'}, 'blob': {'S': 'x' * 3500}})
while True:
ddb.get_item(TableName='my-table', Key={'pk': {'S': 'A'}}, ConsistentRead=True)实际输出:
ProvisionedThroughputExceededException: The level of configured provisioned throughput for the table was exceeded. Consider increasing your provisioning level with the UpdateTable API.
HTTP 400在一张刚创建、且关闭了 SDK 重试的表上,触发它花了 49 次读取。这个数字才是有意思的地方:一张 1 RCU 的表不会在第二个请求就失败,因为 DynamoDB 会先把攒下来的突发容量借给你——所以一次早早收手的压测,会把一张其实并不健康的表报告成健康。这个错觉的另一半来自 SDK,它默认会替你重试被限流的请求;像上面那样关掉重试,否则这个错误会一直隐形,直到它变成一个延迟问题。
相关错误
- ThrottlingException——账户/控制平面的速率限制。
- Throttled despite spare capacity (hot partition)——一个分区键把流量全吸走了。
- On-demand throughput exceeded——按需模式下的对应错误。
- ItemCollectionSizeLimitExceededException
- 代码示例:BatchWriteItem in Node.js——UnprocessedItems 的退避重试模式。
- 学习:On-demand vs provisioned · Hot partitions
参考资料
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- Troubleshooting throttling in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Best practices for designing and using partition keys effectively in DynamoDB — Amazon DynamoDB Developer Guide
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。
2026-07-26 通过 boto3 1.43.56 针对 us-east-1 的实时 DynamoDB 服务复现,表预置为 1 RCU 且关闭了 SDK 重试——上方输出为原样照录。