AWS S3 最终一致性和先写后读一致性

AWS S3 Eventual Consistency and read after write Consistency

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

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

请澄清或确认这些说法。

首先

这些最初的概念是否正确? 那么,

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

"eventual consistency"的概念更容易理解,因为你必须考虑"latency"将数据传播到不同的节点,客户端可能会在这段时间内访问并且没有新数据还。

但为什么 "read after write" 应该是立即的?在现有数据上传播修改或创建新数据应该具有相同的延迟。我无法理解其中的区别。

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

talking about "read after write" is related only to "new writings"/creation of objects that didn't exist before.

talking about "eventual consistency" is related to "modifying existing objects" (updating or deleting)

几乎正确,但请注意一个警告。这是引自 documentation:

The caveat is that if you make a HEAD or GET request to a key name before the object is created, then create the object shortly after that, a subsequent GET might not return the object due to eventual consistency.

关于为什么他们提供不同的一致性模型,这是我的understanding/speculation。 (注意:以下内容可能是错误的,因为我从来没有为S3工作过,不知道它的实际内部实现。)

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

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

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