对S3存储桶中新对象的PUTS写入后读取一致性的警告

时间:2019-04-16 12:01:19

标签: amazon-web-services amazon-s3

来自https://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html

  

Amazon S3为所有区域的S3存储桶中的新对象提供PUTS写入后读取一致性,但有一项警告。需要注意的是,如果在创建对象之前对键名称发出HEAD或GET请求(以查找对象是否存在),则Amazon S3最终会为写后读取提供一致性。

我不确定我是否正确理解警告。 Before creating the object:好的,我还没有创建键为 K 的对象,因此不存在键为 K 的对象;我向 K 发出GET请求... 根据上述说明,我的请求结果是什么?

我很困惑,因为其中的解释涉及eventual consistency for read-after-write。但是到目前为止,还没有 write

2 个答案:

答案 0 :(得分:2)

当您有一个要上传的文件但该文件可能已经存在时,就会发生这种情况。因此,执行以下操作而不是覆盖现有文件:

  1. 尝试获取文件。它不存在,因此您得到一个No such key
  2. 的404
  3. 放入文件。
  4. 尝试立即获取文件(无论出于何种原因)。

按此顺序,步骤3可能会也可能不会返回文件。 最终您可以检索文件,但是从上传时间起需要花费多长时间取决于S3的内部情况(我可以推测为什么会发生这种情况,但这仅是推测)。

答案 1 :(得分:1)

该文档尚不清楚警告事项,但我相信它是在讨论一种情况,即您要在编写对象之前先检查对象的存在,然后在编写对象后立即读取对象。

这是正常情况。

client 1: GET key_a --> not exist
client 1: PUT key_a (value: v1)
client 1: GET key_a --> v1

之所以说它提供最终的一致性,是因为这种情况。 (不过,这不是唯一的情况。)

client 1: GET key_a --> not exist
client 2: PUT key_a (v0)
client 1: PUT key_a (v1)
client 1: GET key_a --> this might be v0 or v1.

我假设他们想说由GET - PUT - GET组成的步骤不是原子的。

因此,您的请求的初始结果将始终为404,并且您将始终能够在最后一步获得对象,因为他们说它们提供了写后读取的一致性,但它可能不是您刚刚编写的对象因为它提供了最终的一致性。