来自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 。
答案 0 :(得分:2)
当您有一个要上传的文件但该文件可能已经存在时,就会发生这种情况。因此,执行以下操作而不是覆盖现有文件:
No such key
按此顺序,步骤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,并且您将始终能够在最后一步获得对象,因为他们说它们提供了写后读取的一致性,但它可能不是您刚刚编写的对象因为它提供了最终的一致性。