我正在阅读AWS文档,并对我的应用程序的行为有疑问。
get_key
请求。 get_key
请求。现在,文档解释了为什么我在步骤3可能会获得None的原因:“警告是,如果您在创建对象之前向键名发出HEAD或GET请求(以查找对象是否存在),则为Amazon S3为写后读取提供最终的一致性。“(来自文档)
[我担心的是,为什么在第2步之后在我的存储桶上调用list
列出了密钥(即使在第3步中我仍然为相同的键得到了None
)。
for k in bucket.list(some_path):
key = k.get_key(k.name)
这些工作大部分,但随机会返回None。列表是否仅在可用时才返回key
?以及如何确定最终得到的值(是否有一个通知系统,通知我何时第3步实际上将返回我的对象,或者可以超时重试工作->说,等几秒钟然后尝试再次?)
您是正确的,可能您一无所获(404)。据我所知,亚马逊并未为“ S3为写入后读取提供最终一致性”定义最大时间。您肯定知道的是,在步骤2之后,文件已保存在AWS存储桶中。如果您在存储桶上启用了版本控制,则该文件将以该版本存在,即使其他写入也将覆盖您的文件。我认为您有2个选择,
我有时将大量的数据库备份(500GB-1TB)保存到s3,下载完成后(有时需要数小时),在5到60秒之间直到我得到200(我的数据中心网络可能会感到内)也)。 S3 Web控制台页面上的延迟甚至更长,有时我只能在5分钟后对此文件进行过滤。对于小文件,我从未检测到延迟。
这里的问题是,s3键中的某些字符需要特殊处理。
aws-sdk
正在处理需要特殊处理的字符,例如space
被转换为+
字符。
aws-sdk
始终不会更改您的键。因此它正在以当前形式的键来请求对象。例如“我的对象” <=,中间有空格
显示对象没有任何问题,因为您没有将任何参数传递给调用。
随机工作的那些不包含任何需要特殊处理的字符
参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
希望这会有所帮助