微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Amazon S3 的 ListObjectsV2 是否在多个页面上自洽?

如何解决Amazon S3 的 ListObjectsV2 是否在多个页面上自洽?

ListObjectsV2 只能返回 1000 个结果,此时您必须返回另一个页面

由于 Amazon S3 现在具有强一致性,并且当我列出其内容时,存储桶可能会发生其他更新,第二页是否会与第一页在同一时间点获得更多结果?还是会在请求第二页时反映bucket的状态?

比如,如果我列出一个bucket,拿到第一页,删除一个本来会出现在第二页的key,然后拿到第二页,我还能看到现在被删除的key吗?

解决方法

确实,Amazon S3 现在是 strongly consistent。这意味着一旦您上传了一个对象,所有读取该对象的人都可以保证获得该对象的更新版本。这并不意味着保证两个不同的 API 调用处于相同的“状态”。值得注意的是,对于下载,存在一种情况,如果在下载时更新了对象,则一次下载可以获得对象的两个版本的一部分。 this answer 中提供了更多详细信息。

对于您的问题,适用相同的基本规则:S3 从一次调用到下一次调用都具有很强的一致性,一旦您对存储桶或对象进行更改,保证更新后的任何调用以获取更新的数据。这意味着当您翻阅对象列表时,您将看到每个 API 调用获得最新状态时的更改:

import boto3

BUCKET='example-bucket'
PREFIX='so_question'

s3 = boto3.client('s3')

# Create a bunch of items
for i in range(3000):
    s3.put_object(Bucket=BUCKET,Key=f"{PREFIX}/obj_{i:04d}",Body=b'')

args = {'Bucket': BUCKET,'Prefix': PREFIX + "/",}
result = s3.list_objects_v2(**args)
# This shows objects 0 to 999
print([x['Key'] for x in result['Contents']])

# Delete an object
s3.delete_object(Bucket=BUCKET,Key=f"{PREFIX}/obj_{1100:04d}")

# Request the next "page" of items
args['ContinuationToken'] = result['NextContinuationToken']
result = s3.list_objects_v2(**args)
# This will not show object 1100,showing objects 1000 to 2000
print([x['Key'] for x in result['Contents']])

这样做的好处是,无法在一次 API 调用中获取存储桶中所有对象的列表(假设它有 1000 多个项目):我不知道如何获得完整的“快照”当然,除非您可以确保在列出对象的过程中存储桶不会发生变化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?