AWS 上 ListObjects 操作的限制
Posted
技术标签:
【中文标题】AWS 上 ListObjects 操作的限制【英文标题】:ListObjects operation's limit on AWS 【发布时间】:2022-01-19 22:42:26 【问题描述】:我正在通过 AWS 的 go
SDK 中的 documentation 的 ListObjects
函数。
(对于actual API 端点或多或少同样适用)
所以文档写道:
返回存储桶中的部分或全部(最多 1,000 个)对象。
这是什么意思?如果我的存储桶有 200.000 个对象,此 API 调用将不起作用?
This 示例使用ListObjectsPages
(在后台调用ListObjects
)并声称列出所有对象。
这里的实际情况是什么?
【问题讨论】:
【参考方案1】:我正在浏览 AWS 的 go SDK 中 ListObjects 函数的文档。
使用 ListObjectsV2。它的行为或多或少相同,但它是 ListObjects 的更新版本。 AWS 更新 API 并不是很常见,而当他们这样做时,通常是有充分理由的。他们非常擅长向后兼容,这就是 ListObjects
仍然存在的原因。
此示例使用 ListObjectsPages(它在后台调用 ListObjects)并声称列出所有对象。
ListObjectsPages
是 ListObjects
的分页等效项,V2
版本也是如此,我将在下面描述。
许多 AWS API 响应是分页的。 AWS 使用光标分页;这意味着 request responses 包含一个游标 - 在 ListObjectsV2 的情况下为 ContinuationToken
。如果存在更多对象(响应中的IsTruncated
),则后续的ListObjectsV2 request content can provide the ContinuationToken 将在第一个响应停止的位置继续列出。
ListObjectsV2Pages
为您处理迭代的ListObjectsV2
请求,因此您不必处理ContinuationToken
和IsTruncated
的逻辑。相反,您提供了一个函数,该函数将为响应中的每个“页面”调用。
所以说ListObjectsV2Pages
将列出“所有”对象是准确的,但这是因为它使多个 ListObjectsV2
在后端调用它会列出多于一页的响应。
因此,...Pages
函数可以被认为是便利函数。您应该始终在适当的时候使用它们——它们消除了分页的痛苦,而分页对于使潜在的大量 api 响应可操作至关重要。在 AWS 中,如果支持分页,则假设您需要它 - 在典型情况下,不保证结果的第一页包含 任何结果,即使后续页面包含。
【讨论】:
【参考方案2】:The AWS Go SDK V2 为我们提供分页器类型来帮助我们管理 S3 的每个查询项目限制。 ListObjectsV2Pages
不见了。取而代之的是ListObjectsV2Paginator,它处理@Daniel_Farrell 提到的分页细节。
构造函数接受与列表对象查询相同的参数 (type ListObjectsV2Input
)。分页器公开了 2 个方法:HasMorePages: bool
和 NextPage: (*ListObjectsV2Output, error)
。
var items []Item
for p.HasMorePages()
batch, err := p.NextPage(ctx)
// etc...
item = append(items, newItems...)
【讨论】:
以上是关于AWS 上 ListObjects 操作的限制的主要内容,如果未能解决你的问题,请参考以下文章