考虑一个只有最终一致性的未版本化存储桶。
假设我刚刚上传了一个对象,现在我将其删除。删除请求发送到对象尚未传播到的服务器。
现在,在我看来,只有三件事可能发生:
服务器会记住删除操作,因此一旦对象到达此服务器就会删除该对象。
服务器回复“404 Not found”,对象继续存在。
服务器回复“201 No data”,忘记删除操作,对象继续存在。
答案 1意味着每个 S3 服务器都必须记住它收到的每个删除请求,以防它稍后从另一台服务器收到相应的对象。重置此内存的唯一方法是对整个 S3 集群进行某种全局原子同步(因此服务器可以确定它想要忘记的删除没有未完成的更新),我认为这不太可能。但是,如果对象稍后仍然出现,则记忆删除的定期超时将破坏最终的一致性保证。
另一方面,答案 2暗示如果
- 我将一个对象上传到服务器 A
- 我将对象的新版本上传到服务器 B
- 我删除服务器 B 上的对象
- 只有现在服务器 B 从服务器 A 那里听到关于上传的信息
..所以我最终会得到一个过时的对象版本,这会破坏最终的一致性保证。
答案 3也意味着最终一致性保证被破坏,因为在发出删除请求后对象仍然存在。
所以基本上所有三个答案似乎都不太可能。我错过了什么吗?