You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DynamoDB单表触发ProvisionedThroughputExceededException异常排查求助

DynamoDB吞吐量超限异常分析与代码问题排查

代码的核心问题

这段共用代码确实是引发该表异常的潜在原因,问题出在GetRemainingAsync()方法上:

  • QueryAsync返回的AsyncSearch<T>对象,调用GetRemainingAsync()会自动拉取该哈希键下的所有数据,过程中会触发多次分页请求。如果这张表里有某个哈希键对应了大量数据(比如几千上万条),单次请求就会瞬间消耗掉大量RCU,直接打满你设置的20个RCU上限,哪怕整体业务流量不高也会触发超限。
  • 其他表没出问题,无非是那些表的哈希键对应数据量少,分页请求数不多,不会触发阈值。

优化方案

  • 避免一次性拉取全量数据:如果业务不需要所有数据,改成分页查询,用Limit控制每次返回的条数,让调用方自行处理分页逻辑:
    public async Task<IEnumerable<T>> GetItemsByHashKeyAsync(object hashKeyValue, int limit, DynamoDBOperationConfig dynamoDBOperationConfig = null)
    {
        var search = context.QueryAsync<T>(hashKeyValue, dynamoDBOperationConfig);
        search.Limit = limit;
        return await search.GetNextSetAsync();
    }
    
  • 调高自动扩容上限:当前自动扩容上限是20,如果该表确实存在大数量的哈希键,20的容量顶不住单次全量查询的开销,得根据实际数据量适当上调。
  • 添加重试逻辑:针对DynamoDB的吞吐量异常,增加指数退避重试,避免一次失败就抛出异常,还能平滑流量峰值:
    var retryPolicy = new RetryPolicy(new DynamoDBThroughputErrorDetectionStrategy(), RetryStrategy.ExponentialBackoff(3, TimeSpan.FromMilliseconds(500)));
    await retryPolicy.ExecuteAsync(async () => 
    {
        return await context.QueryAsync<T>(hashKeyValue, dynamoDBOperationConfig).GetRemainingAsync();
    });
    

额外排查点

  • 检查该表的哈希键分布:是否存在热点键(某个键对应的数据量远大于其他键),热点键会让流量集中在单个分区,哪怕总吞吐量足够,单个分区也会触发超限。
  • 确认自动扩容是否生效:查看AWS监控里的ProvisionedReadCapacityUnits和ConsumedReadCapacityUnits指标,要是扩容不及时,也会出现短暂的超限异常。

内容的提问来源于stack exchange,提问作者Mysterious288

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:27:21