AWS S3最终一致性:为什么存储区列表返回键,但返回头请求无

问题描述 投票:0回答:2

我正在阅读AWS文档,并对我的应用程序的行为有疑问。

  1. 我向不存在的密钥发出get_key请求。
  2. 然后我放了那个物体。
  3. 然后我再次向同一键发出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步实际上将返回我的对象​​,或者可以超时重试工作->说,等几秒钟然后尝试再次?)

amazon-web-services amazon-s3 consistency eventual-consistency
2个回答
0
投票

您是正确的,可能您一无所获(404)。据我所知,亚马逊并未为“ S3为写入后读取提供最终一致性”定义最大时间。您肯定知道的是,在步骤2之后,文件已保存在AWS存储桶中。如果您在存储桶上启用了版本控制,则该文件将以该版本存在,即使其他写入也将覆盖您的文件。我认为您有2个选择,

  1. 选项A:建立缓存机制并将文件保留在缓存中,直到获得200的请求为止。缓存可能是一个简单的文件夹。
  2. 选项B:在STEP 3中->循环,直到得到200(在循环内添加一个延迟)。您知道这会发生的问题是有时可能会更长一些,通常对于普通大小的文件来说这会很快。
  3. 选项C:只有获得200后,才考虑完成STEP 2。

我有时将大量的数据库备份(500GB-1TB)保存到s3,下载完成后(有时需要数小时),在5到60秒之间直到我得到200(我的数据中心网络可能会感到内)也)。 S3 Web控制台页面上的延迟甚至更长,有时我只能在5分钟后对此文件进行过滤。对于小文件,我从未检测到延迟。


0
投票

问题的重点:

这里的问题是,s3键中的某些字符需要特殊处理。

当您放置PutObject时

aws-sdk正在处理需要特殊处理的字符,例如space被转换为+字符。

当您执行GetObject时

aws-sdk始终不会更改您的键。因此它正在以当前形式的键来请求对象。例如“我的对象” <=,中间有空格

列出对象

显示对象没有任何问题,因为您没有将任何参数传递给调用。

为什么它随机工作

随机工作的那些不包含任何需要特殊处理的字符

参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.