存储桶版本控制如何影响 S3 的先写后读一致性保证?

How does bucket versioning affect S3's read-after-write consistency guarantee?

虽然 S3 支持 "read-after-first write" 新创建对象的一致性,但我想了解存储桶版本控制如何影响一致性保证——特别是在使用密钥 和 [=26 访问文档时=]一个版本。

以下是我目前从官方 AWS 文档中收集到的对 S3 提供的一致性保证的理解:

put (new) then get       = strong (with one caveat; see below)
put (overwrite) then get = eventual
put then list            = eventual
delete                   = eventual

显然,当覆盖桶版本控制的现有对象(无论)时,当我单独通过键访问对象时,我将得到最终一致的结果。但是如果我通过密钥和版本访问对象,会发生什么?是否有任何指向定义行为的 AWS 文档?

我的问题与 this question but with one exception: the concept of negative caching from the following caveat. The AWS docs state 高度相关(重点是我的):

Amazon S3 provides read-after-write consistency for PUTS of new objects in your S3 bucket in all regions with one caveat. The caveat is that if you make a HEAD or GET request to the key name (to find if the object exists) before creating the object, Amazon S3 provides eventual consistency for read-after-write.

当我从位于 key@version 的 S3 请求一个不存在的对象时,我然后 create/put 该对象,紧接着我发出对相同 key@version 的请求,行为是什么?

默认情况下,当上传具有相同文件名的新对象时,Amazon S3 将替换对象。 Amazon S3 versioning激活后,S3将保留文件的所有版本,即使文件被覆盖或删除。

文件的特定版本是通过密钥和版本 ID 的组合来引用的。事实上,在版本控制打开的情况下上传文件后,会立即分配 Version-Id

上传具有相同文件名的文件时(从而创建最新的 'version' 对象),先前版本保留最初分配的版本 ID。

示例 Version-Id 为:SnZzeMEz3ngtfBYWc53f_Juuzk5epXkG

您提出的问题:"When I request an object from S3 located at key@version which doesn't exist"。但是,鉴于 Version-Id 的随机性,不可能请求对象的不存在版本,然后期望下一次上传创建具有预测 Version-Id 的版本。

相反,可以这样想:创建对象的一个​​版本时,它保持相同的 Version-Id。因此,版本不会更新,因此一致性将不相关。唯一的变化是默认值 "current version" 会发生变化,因此在更新对象后检索对象可能会受到最终一致性的影响。