S3最终一致性:文件部分在PUT上丢失并覆盖

时间:2017-09-20 08:58:16

标签: amazon-s3 append aws-sdk overwrite eventual-consistency

我使用Amazon S3存储大量文本文件 我的软件是用Java编写的,我使用的是官方的S3 SDK 除了创建/删除/检索/之外,我经常需要追加新内容到文件。

S3不支持追加,所以我实现了一个基本上是附加操作:
- 使用S3 GET,从S3获取文件元数据 - 使用S3 GET,将整个文件下载到本地副本中 - 执行附加到本地副本
- 使用S3 PUT,在S3上传本地文件,覆盖旧文件。

追加永远不会同时执行 我测试了该软件,到目前为止似乎运行良好。

这就是我的问题:在追加非常频繁的情况下,当我执行追加时,文件的大部分内容都会丢失。 这可能取决于重写PUT的S3最终一致性?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

是的,它可以。最终的一致性意味着当对象被覆盖时,对象的下一个GET可能会也可能不会返回最后PUT的结果。

启用存储桶版本控制,您应该可以通过每次上载或下载对象的版本ID来轻松识别这些事件中发生的事情。

如果您上次上传的版本不是您随后下载的版本,则表明该问题最终会导致问题。

另一方面,如果您通过使用其上一个已知版本ID(您需要在PUT对象时捕获的特定请求最新版本来主动管理下载,并将其存储在强烈提供的位置 - 一致读取,如DynamoDB或RDS),然后您可以在下载时明确请求最新版本。

对特定版本对象的显式请求解决了问题,因为它们没有一致性限制 - 对象的给定指定版本存在或不存在。一致性问题与隐式获取对象的“最新”版本有关。如果恰好为您的请求提供服务的特定索引副本尚未获知最新版本,则它将提供先前版本。

无论是否启用版本控制都是如此,因为即使在未版本化的存储桶中,对象的覆盖也不是真正的覆盖。它是新内部存储位置+清除旧存储位置操作的存储+更新索引。这没有记录,但原子覆盖和一致性模型规定必须是这种情况。