DynamoDB LimitExceededException

TL;DR — 你一次发起了过多的控制平面操作(或触及了一个表/账户限制)。你账户中同时处于 CREATING/UPDATING/DELETING 状态的表和索引最多可有 500 个。串行化你的表操作,等待 ACTIVE,然后用退避重试。

含义

LimitExceededException: Too many operations for a given subscriber.

这是一个控制平面错误——它来自 CreateTableUpdateTableDeleteTable、索引创建、恢复及类似调用,而不是来自 GetItem/PutItem/Query。DynamoDB 在告诉你,你已经超过了一个并发或账户限制。它是一个 HTTP 400,AWS 把它列为可以重试——随着进行中的操作完成,这个状况会消除。

为什么会发生

  • 并发的表/索引操作过多——处于 CREATINGDELETINGUPDATING 状态的表和索引的累计数量不能超过每账户/区域 500 个。(每个账户最多允许 500 个同时进行的表操作——CreateTableUpdateTableDeleteTableUpdateTimeToLiveRestoreTableFromBackupRestoreTableToPointInTime——而创建带二级索引的表时最多只允许 250 个并发请求。)
  • 批量栈部署——CloudFormation/CDK/Terraform 同时创建或拆除许多表(或许多 GSI)会超出并发预算。
  • 账户资源配额——触及每账户/区域 2,500 张表的软配额,或 50 个同时导入作业的限制。
  • DynamoDB Streams 误用——用大于 1000 的 Limit 调用 GetRecords,或超过 2 个进程同时从同一个 streams 分片读取。
  • 注意: 在同一张表仍处于 UPDATING 时发起的第二个 UpdateTable 会表现为 ResourceInUseException,而不是这个错误——但两者都意味着"先等待 ACTIVE"。

如何修复

  1. 串行化控制平面操作——在对一张表(及每个 GSI)发起下一个变更之前,等它变为 ACTIVE。轮询 DescribeTable 并在 TableStatus === 'ACTIVE' 上设关卡。
  2. 用指数退避重试——这个限制是瞬时的;随着进行中的操作排空,一次退避重试通常会成功。
  3. 限制批量部署的节奏——拆分一个大栈,使你不会一次创建数百个表/GSI,或者添加显式的 DependsOn 排序,让它们不会同时触发。
  4. 检查你的服务配额——如果你接近每账户表数限制,就在 Service Quotas 中请求配额提升,而不是无限重试。
  5. 逐个添加 GSI——每个 UpdateTable 操作只能创建或删除一个全局二级索引,因此串行化索引变更并等待每次回填。

常见问题

如何修复 DynamoDB 中的 LimitExceededException? 停止并行发出控制平面操作(CreateTable/UpdateTable/DeleteTable/索引更改)。等待每个表和索引在下一次更改之前达到 ACTIVE,将 CREATING/UPDATING/DELETING 中的表计数保持在帐户上限以下,然后使用指数退避重试。

LimitExceededException 是节流错误吗? 这是控制平面并发/限制错误,而不是数据平面限制。数据平面限制表面为 ProvisionedThroughputExceededException、ThrottingException 或 RequestLimitExceeded。

将 DynoTable 指向 Local

DynoTable 是数据平面客户端 — GetItemQueryScan 不消耗此错误保护的控制平面并发预算。如果部署脚本命中 LimitExceededException 创建表格时,使用DynoTable 浏览表格已经达到 ACTIVE 并使用 表设置 验证模式,同时你的 IaC 重试。对于本地堆栈,运行 DynamoDB Local 和 -sharedDb 并通过本地配置文件 (Running DynamoDB Local) 连接,以便你可以检查部分部署,而无需等待每个 GSI 在 AWS 中完成。 single-table design planner有助于素描在你在繁忙的帐户中解雇另一个 CreateTable 之前,请先调整表格形状。

相关错误

来源

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。