S3一致性,可在写入后成功读取

时间:2019-11-02 09:43:33

标签: amazon-web-services amazon-s3 eventual-consistency

在此处找不到明确的答案。

根据Amazon S3文档,写入后读取的警告是,如果我得到404的GET,然后输入一个新的对象,然后是GET。 我的问题是,在我成功阅读后,
后续读取也会成功吗?

示例:

GET key 404
PUT key 200
GET key 404 # because caveat
GET key 200 

从现在开始,是否可以保证以后的GET key都会成功?

2 个答案:

答案 0 :(得分:1)

AWS在S3 documentation中描述的警告建议他们在数据库顶部使用缓存层,用于在S3中存储对象的详细信息(例如密钥和元数据)。

如果您先对对象执行PUT,然后再进行GET,则GET操作将出现缓存未命中,因此缓存层将获取有关此信息数据库中的对象。

如果您在GET之前执行PUT,则缓存层将查询数据库,即使在{{1之后,也将接收到该对象不存在的信息并缓存该信息。 }}之后不久创建了提到的对象。因此,PUT之后的GET将从缓存中接收到该对象不存在的信息。

这可能就是为什么存在此警告的原因。不幸的是,这不能回答您的问题,因为我们不知道该缓存层如何工作。如果该层使用共享状态,则在收到PUT的一个响应后,您应该为所有请求收到一个200响应。我的猜测是,他们不将共享状态用于缓存层,因为这样更易于扩展。如果没有共享状态,则取决于您的运气,缓存中项目的生存时间,以及它们是否对更新的对象采用某种类型的缓存失效,无论您是否收到200200的请求即使在第一个成功的404请求之后。

因为未知S3内部工作的细节,所以我不会依赖于成功调用的频繁调用,但是我的猜测是,成功200之后收到404的可能性相当大低。最后,您必须根据您的用例来决定考虑这种情况是否以及如何有意义。

答案 1 :(得分:0)

AWS文档没有提及最终写入时间的详细信息,但是是的,这就是为什么这就是为什么在PUT之后得到404的原因。但是根据我的经验,一旦传播了写操作,它们是可靠的,因此在您获取GET的前200个之后,您可以假设其余GET返回200。