在更新文件时从 AWS S3 下载

downloading from AWS S3 while file is being updated

这似乎是一个非常基本的问题,但是如果我从 S3 下载一个文件,而另一个进程正在更新它,我是否需要担心得到一个不完整的文件?

示例:一个 200MB 的 CSV 文件。用户 A 开始以 1Mbps 的速度使用 200MB 的新内容更新文件。 16 秒后,用户 B 开始以 200Mbps 的速度下载文件。用户 B 是否获得了原始文件的全部 200MB,还是用户 B 获得了用户 A 的 ~2MB 更改而没有其他内容?

用户 B 获得原始文件的全部 200MB。

原因如下:

PUT S3 上的操作是原子的。技术上没有 "modifying" 对象这样的东西。当对象被覆盖时实际发生的是该对象被 替换 为另一个具有相同键的对象。但是在新的(覆盖)对象被完整上传并成功上传之前,原始对象实际上并没有被替换……即便如此,被覆盖的对象在技术上还不是"gone"——它只是在桶的索引,以便将来的请求将提供给新对象。

(服务新对象实际上被记录为不能保证总是立即发生。与立即可供下载的新对象的上传相比,现有对象的覆盖最终是一致的,这意味着在您上传对象后的短时间内,旧副本仍然可以为后续请求提供服务。

但是当你覆盖一个对象,并且桶上没有启用版本控制时,旧对象和新对象实际上是独立存储在 S3 中的,尽管有相同的键。旧对象现在不再被存储桶的索引引用,因此您不再需要为它的存储付费,并且它很快就会从 S3 的后备存储中清除。它实际上没有记录发生这种情况的时间......但是(tl; dr)覆盖当前正在下载的对象不应导致任何意外的副作用。

Updates to a single key are atomic. For example, if you PUT to an existing key, a subsequent read might return the old data or the updated data, but it will never write corrupted or partial data.

http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel