1

帮助我更好地理解这些我无法完全掌握的概念。

谈论 aws S3 一致性模型,我将尝试解释我掌握的内容。

请消除或确认我这些说法。

首先

  • 谈论“写后读”仅与“新作品”/创建以前不存在的对象有关。
  • 谈论“最终一致性”与“修改现有对象”(更新或删除)有关

这些第一个概念是否正确?然后,

  • 最终一致性:在数据完全写入节点之前访问数据的“客户端”可以读取对象的旧版本,因为写入可能仍在进行中,即对象可能尚未被提交。这是在分布式系统中普遍容忍的行为,在这种情况下,这种类型的一致性优于其他选项,即在提交对象时等待某种锁被移除。

  • 写后读一致性:对象立即可供客户端使用,客户端将读取对象的“真实”版本,而不是旧版本,如果我理解得很好,这仅适用于新对象。

如果是这样,为什么这些复制方法如此不同?并产生这种不同的一致性?

“最终一致性”的概念更容易理解,因为您必须考虑将数据传播到不同节点的“延迟”,并且客户端可能在此期间访问并且尚未获得新数据。

但是为什么“写后读”应该是立即的?传播对现有基准的修改或创建新基准,应该具有相同的延迟。我无法理解其中的区别。

你能否告诉我我的主张是否正确,并以不同的方式解释这个概念。

4

1 回答 1

2

谈论“写后读”仅与“新作品”/创建以前不存在的对象有关。

是的

谈论“最终一致性”与“修改现有对象”(更新或删除)有关

几乎是正确的,但请注意一个警告。这是文档中的引用:

需要注意的是,如果您在创建对象之前向键名发出 HEAD 或 GET 请求,然后在此之后不久创建对象,则由于最终一致性,后续 GET 可能不会返回该对象。

关于他们为什么提供不同的一致性模型,这是我的理解/推测。(注:以下内容可能是错误的,因为我从未在 S3 工作过,也不知道它的实际内部实现。)

S3 是一个分布式系统,因此 S3 很可能使用了一些内部缓存服务。想想 CDN 是如何工作的,我想你可以在这里使用类似的比喻。如果您获取的对象的键尚未在缓存中,则为缓存未命中!S3 将获取请求对象的最新版本,将其保存到缓存中,然后将其返回给您。这是先读后写模型。

另一方面,如果您更新一个已经在缓存中的对象,那么除了将您的新对象复制到其他可用区之外,S3 还需要做更多的工作来更新缓存中的现有数据。因此,传播过程可能会更长。S3 没有让您等待请求,而是决定返回缓存中的现有数据。此数据可能是此对象的旧版本。这结束了最终的一致性。

正如 Phil Karlton 所说,计算机科学中只有两件难事:缓存失效和命名事物。AWS 没有很好的方法来完全解决这个问题,也必须做出一些妥协。

于 2020-05-08T20:12:31.260 回答