1

考虑一个只有最终一致性的未版本化存储桶。

假设我刚刚上传了一个对象,现在我将其删除。删除请求发送到对象尚未传播到的服务器。

现在,在我看来,只有三件事可能发生:

  1. 服务器会记住删除操作,因此一旦对象到达此服务器就会删除该对象。

  2. 服务器回复“404 Not found”,对象继续存在。

  3. 服务器回复“201 No data”,忘记删除操作,对象继续存在。

答案 1意味着每个 S3 服务器都必须记住它收到的每个删除请求,以防它稍后从另一台服务器收到相应的对象。重置此内存的唯一方法是对整个 S3 集群进行某种全局原子同步(因此服务器可以确定它想要忘记的删除没有未完成的更新),我认为这不太可能。但是,如果对象稍后仍然出现,则记忆删除的定期超时将破坏最终的一致性保证。

另一方面,答案 2暗示如果

  1. 我将一个对象上传到服务器 A
  2. 我将对象的新版本上传到服务器 B
  3. 我删除服务器 B 上的对象
  4. 只有现在服务器 B 从服务器 A 那里听到关于上传的信息

..所以我最终会得到一个过时的对象版本,这会破坏最终的一致性保证。

答案 3也意味着最终一致性保证被破坏,因为在发出删除请求后对象仍然存在。

所以基本上所有三个答案似乎都不太可能。我错过了什么吗?

4

0 回答 0