在更新文件时从AWS S3下载

时间:2016-03-03 19:35:51

标签: amazon-web-services amazon-s3 concurrency race-condition

这看起来像是一个非常基本的问题,但是如果我在从另一个进程更新文件时从S3下载文件,我是否要担心收到不完整的文件?

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

1 个答案:

答案 0 :(得分:12)

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

原因如下:

S3上的

PUT操作是原子的。从技术上讲,没有“修改”对象这样的东西。当一个对象被覆盖时实际发生的事情是该对象被替换与另一个具有相同键的对象。但是原始对象实际上并没有被替换,直到新的(覆盖)对象被完整地上传,并且成功地......并且即使这样,被覆盖的对象在技术上还没有“消失” - 它只被替换在桶的索引中,以便将来的请求将被提供给新对象。

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

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

  

单个密钥的更新是原子的。例如,如果您PUT到现有密钥,后续读取可能会返回旧数据或更新数据,但它永远不会写入损坏或部分数据。

     

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