Amazon S3是否保证写入顺序?

时间:2010-07-06 09:05:54

标签: concurrency amazon-s3 cloud

Amazon S3提供“最终一致性”模型,您存储的数据最终会对所有客户端可见。

关于是否保证写入顺序,我找不到任何官方信息。如果您正在构建一个客户端可能希望在其他人存储数据后立即读取数据的架构,这一点非常重要。

如果保留写入顺序,我可以通过让写入器存储保护(例如,特殊键)和写入操作结束来轻松检查数据是否完整。

如果没有保证写入顺序,那么我有一个严重的问题,因为我无法确定我能安全地读取数据。

我读过Werner Vogel关于一致性的文章(http://www.allthingsdistributed.com/2007/12/eventually_consistent.html),他指出没有单调写一致性的系统很难编程,但没有说S3是否保证。

2 个答案:

答案 0 :(得分:3)

当亚马逊的目标是大规模可扩展性时,保证写入顺序是非常愚蠢的。考虑以下情况:

  • 与密钥K关联的值X存在于S3中。
  • 客户1(香港):将值A写入密钥K,由服务器A提供服务
  • 客户端2(堪萨斯城):将值B写入密钥K,由服务器B提供服务

最终的一致性保证所有读者,无论在世界的任何地方,都会看到价值A或价值B或价值X,最终所有读者都会看到价值A或B,但不会看到混合。

如果客户端1和2同时发出写入,则保证写入顺序的唯一方法是沿时间线将写入相互关联。然而,跨大西洋时钟将不会完美同步。这里真正的问题是,当世界两端的两个客户端及时发出写入时,写入顺序是什么意思。

<强>更新

单个客户也是如此。假设从2个位置提供值,并且单个客户端发出2个连续更新。如果两个写入都由相同的端点提供,那么很可能会保留您的排序。但是,没有什么能阻止从第二个位置(路由,网络分割等)满足读取。

答案 1 :(得分:2)

要回答您的直接问题,'Amazon S3是否保证写入订单?',我认为答案是否定的。我在AWS论坛中要求确定一下。

如果您能够接近完美的一致性,我建议您让作者在返回成功之前检查所有文件。虽然这不保证该文件可供所有客户端使用,但它对于大多数用例来说已经足够了。就个人而言,当我这样做时,我从未对客户端S3的一致性产生任何问题。我应该注意,这将需要更多的时间,你会为额外的请求支付更多,但在你的情况下,它可能是值得的。

另一方面,如果您需要保证完美的一致性,我建议您使用美国标准区域以外的区域。除美国标准区域外的所有地区均提供"read-after-write consistency for PUTS of new objects and eventual consistency for overwrite PUTS and DELETES"。这可以解决你的新写入问题,但同样,它会花费更多。

最佳,

扎克

开发者,LongTail视频