Too many items requested for the BatchGetItem call
TL;DR — BatchGetItem 每次调用最多取回 100 个项目(且不超过 16 MB 数据)。你请求了超过 100 个键,所以 DynamoDB 拒绝了这个请求。把你的键切成不超过 100 个一组,每组发一次 BatchGetItem。
含义
ValidationException: 1 validation error detected: Value at 'RequestItems.<table-name>.member.Keys' failed to satisfy constraint: Member must have length less than or equal to 100
# on DynamoDB Local the same call is rejected with a shorter sentence:
ValidationException: Too many items requested for the BatchGetItem callBatchGetItem 按主键跨一张或多张表取回项目,但单次调用被限制在 100 个键和 16 MB 返回数据。请求超过 100 个,DynamoDB 就会拒绝整个调用。即便在限额之内,一次响应返回的项目也可能比你要的少(因为 16 MB 上限),剩下的会在 UnprocessedKeys 中报告出来。超限这种情况是 HTTP 400 ValidationException,在改小之前不可重试。
为什么会发生
- 一次调用里请求了一大批键——把几百个键直接塞进
BatchGetItem。 - 分组上界高于 100——按数量分批时误用了 BatchWrite 那边 25 个项目的限制,或者一个差一错误放了 101 个进去。
- 数的是表,不是键——100 这个限制是请求中所有表的键总数。
- 没有对
UnprocessedKeys分页——以为一次调用就能返回全部,于是从不分组。
如何修复
- 把键切成 ≤100 个一组,每组发一次
BatchGetItem。 - 处理
UnprocessedKeys——用指数退避重试返回的那些键;即使在一个合法的 100 键批次内,撞上 16 MB 上限时也会发生这种情况。 - 让响应保持在 16 MB 以内——项目较大时,每次调用请求少于 100 个。
- 搞清楚你的 SDK 替你做了什么——底层客户端和 JavaScript 的 document client 不会拆分过长的键列表;你必须自己切到 100。某些上层客户端(Java SDK 的 Enhanced Client 和 v1 的 DynamoDBMapper)至少会自动重试未处理的项目。
复现方法
A BatchGetItem 要求 101 个钥匙,其中一把超出上限:
const Keys = Array.from({length: 101}, (_, i) => ({pk: {S: `K#${i}`}, sk: {S: 'META'}}));
await client.send(new BatchGetItemCommand({RequestItems: {orders: {Keys}}}));实际输出:
ValidationException: Too many items requested for the BatchGetItem call
HTTP 400这个在请求形状上很快就失败了——没有发生部分读取,并且没有任何内容落在 UnprocessedKeys 中。这就是超过 100 个键限制和超过 16 MB 响应限制之间的区别,后者确实返回部分结果。
从 DynoTable
调试时,在 DynoTable 中一次批量读取少于 100 个键 — 使用 ⌘K 打开表,过滤到键集,并在代码中连接分块 BatchGetItem 之前确认项目存在。当项目很大时,item size calculator有助于选择安全的块大小。首先使用 Query Builder 构建单键读取原型。使用 ⌘P 切换配置文件; 在“设置”→“配置文件”上测试连接。参见连接 AWS和安装。
来源
- BatchGetItem — Amazon DynamoDB API Reference(2026-07-13 验证)
- Quotas in Amazon DynamoDB(2026-07-13 验证)
相关错误
- Too many items requested for the BatchWriteItem call——写入侧的限制(25 个项目)。
- Provided list of item keys contains duplicates——同一个键在一次 BatchGetItem 里出现两次。
- ProvisionedThroughputExceededException——以 UnprocessedKeys 形式浮现出来的限流。
- 代码示例:BatchGetItem in Node.js · in Python (boto3)——带 UnprocessedKeys 重试的分组读取。
- 学习:DynamoDB batch operations
参考资料
- BatchGetItem — Amazon DynamoDB API Reference
- BatchWriteItem — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- Quotas in Amazon DynamoDB — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。
2026-07-26 针对 DynamoDB Local 2.x 与 AWS SDK for JavaScript v3.1095.0 复现——上方输出为原样照录。