英文:
ListObjects operation's limit on AWS
问题
我正在阅读 AWS 的 Go SDK 中 ListObjects
函数的文档。
(同样的情况也适用于实际的 API 端点)
文档中写道:
返回存储桶中的一些或全部对象(最多 1,000 个)。
这是什么意思?如果我的存储桶中有 200,000 个对象,这个 API 调用将不起作用吗?
这个示例使用了 ListObjectsPages
(在底层调用了 ListObjects
),并声称列出了__所有__对象。
实际情况是什么?
英文:
I am going through the documentation of ListObjects
function in AWS' go
SDK.
(the same holds more or less for the actual API endpoint)
So the docs write:
> Returns some or all (up to 1,000) of the objects in a bucket.
What does this mean? If my bucket has 200.000 objects this API call will not work?
This example uses ListObjectsPages
(which calls ListObjects
under the hood) and claims to list all objects.
What is the actual case here?
答案1
得分: 3
我正在阅读 AWS Go SDK 中 ListObjects 函数的文档。
请使用 ListObjectsV2。它的行为几乎相同,但是它是 ListObjects 的更新版本。AWS 更新 API 的情况并不常见,但当他们这样做时,通常是有充分理由的。他们非常注重向后兼容性,这就是为什么 ListObjects
仍然存在的原因。
这个示例使用了 ListObjectsPages(在底层调用 ListObjects),并声称列出了所有对象。
ListObjectsPages
是 ListObjects
的分页版本,V2
版本也是如此,我将在下面进行描述。
许多 AWS API 的响应都是分页的。AWS 使用游标分页;这意味着请求响应中包含一个游标 - 在 ListObjectsV2 的情况下是 ContinuationToken
。如果存在更多对象(响应中的 IsTruncated
),则后续的 ListObjectsV2 请求内容可以提供 ContinuationToken,以便从第一个响应结束的地方继续列出。
ListObjectsV2Pages
会为您处理迭代的 ListObjectsV2
请求,因此您不必处理 ContinuationToken
和 IsTruncated
的逻辑。相反,您提供一个函数,该函数将在响应中的每个“页面”上调用。
因此,可以准确地说 ListObjectsV2Pages
将列出“所有”对象,但这是因为它在后台进行了多个 ListObjectsV2
调用,以列出多个响应页面。
因此,...Pages
函数可以被视为方便函数。在适当的情况下,您应该始终使用它们-它们消除了分页的痛苦,而分页对于处理潜在的高容量 API 响应至关重要。在 AWS 中,如果支持分页,请假设您需要它-在典型情况下,即使后续页面包含结果,第一页的结果也不能保证包含任何结果。
英文:
> I am going through the documentation of ListObjects function in AWS' go SDK.
Use ListObjectsV2. It behaves more or less the same, but it's an updated version of ListObjects. It's not super common for AWS to update APIs, and when they do, it's usually for a good reason. They're great about backwards compatibility which is why ListObjects
still exists.
> This example uses ListObjectsPages (which calls ListObjects under the hood) and claims to list all objects.
ListObjectsPages
is a paginated equivalent of ListObjects
, and ditto for the V2
versions which I'll describe below.
Many AWS API responses are paginated. AWS uses Cursor Pagination; this means request responses include a cursor - ContinuationToken
in the case of ListObjectsV2 . If more objects exist (IsTruncated
in the response), a subsequent ListObjectsV2 request content can provide the ContinuationToken to continue the listing where the first response left off.
ListObjectsV2Pages
handles the iterative ListObjectsV2
requests for you so you don't have to handle the logic of ContinuationToken
and IsTruncated
. Instead, you provide a function that will be invoked for each "page" in the response.
So it's accurate to say ListObjectsV2Pages
will list "all" the objects, but it's because it makes multiple ListObjectsV2
calls in the backend that it will list more than one page of responses.
Thus, ...Pages
functions can be considered convenience functions. You should always use them when appropriate - they take away the pain of pagination, and pagination is critical to make potentially high volume api responses operable. In AWS, if pagination is supported, assume you need it - in typical cases, the first page of results is not guaranteed to contain any results, even if subsequent pages do.
答案2
得分: 1
The AWS Go SDK V2提供了分页器类型,帮助我们管理S3每个查询的项目限制。ListObjectsV2Pages
已经被移除。取而代之的是我们得到了ListObjectsV2Paginator,它处理了@Daniel_Farrell提到的分页细节。
构造函数接受与列出对象查询相同的参数(type ListObjectsV2Input
)。分页器公开了两个方法:HasMorePages: bool
和NextPage: (*ListObjectsV2Output, error)
。
var items []Item
for p.HasMorePages() {
batch, err := p.NextPage(ctx)
// etc...
item = append(items, newItems...)
}
英文:
The AWS Go SDK V2 gives us paginator types to help us manage S3's per-query item limits. ListObjectsV2Pages
is gone. In its place we get ListObjectsV2Paginator, which deals with the pagination details that @Daniel_Farrell mentioned.
The constructor accepts the same params as the list objects query (type ListObjectsV2Input
). The paginator exposes 2 methods: HasMorePages: bool
and NextPage: (*ListObjectsV2Output, error)
.
var items []Item
for p.HasMorePages() {
batch, err := p.NextPage(ctx)
// etc...
item = append(items, newItems...)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论