【问题标题】:S3 consistency for sucessful read after write写入后成功读取的 S3 一致性
【发布时间】:2019-11-02 09:43:33
【问题描述】:

在这里找不到明确的答案。

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

例子:

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

从现在开始,后续的GET key是否保证成功?

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您在PUT 之前执行GET,缓存层将查询数据库,将接收该对象不存在的信息并缓存该信息,即使在PUT 创建提到的对象之后也是如此不久之后。所以PUT后面的GET会从缓存中收到对象不存在的信息。

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

    由于 S3 的内部工作细节未知,我不会依赖后续调用来成功,但我的猜测是在成功的 200 之后收到 404 的概率相当低。最后,您必须根据您的用例决定是否以及如何考虑这种情况。

    【讨论】:

      【解决方案2】:

      更新答案

      来自official AWS blog的片段

      S3 现在具有高度一致性

      在冗长的介绍之后,我 准备好分享一些好消息了!

      立即生效,所有 S3 GET、PUT 和 LIST 操作也一样 作为更改对象标签、ACL 或元数据的操作,现在 强烈一致。你写的就是你会读的 LIST 的结果将准确反映列表中的内容 桶。这适用于所有现有的和新的 S3 对象,适用于所有 地区,并且免费提供给您!没有影响 在性能上,您可以每秒更新一个对象数百次 如果您愿意,并且没有全局依赖项。

      【讨论】:

      • 是的,当然,一旦它完全传播,但这主要是“传播”的定义。问题是您无法确定何时是,除了新对象的 PUT(只要您之前没有 HEAD 或 GET 相同的密钥)。我不知道任何保证在这种情况下额外的 GET 将返回 200。
      • 而且...AWS刚刚用strong read after write consistency改变了一些东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多