这似乎是一个非常基本的问题,但是如果我正在S3中下载文件,而该文件正在由另一个进程进行更新,那么我是否需要担心获取不完整的文件?
例如:一个200MB的CSV文件。用户A开始以1Mbps的速度使用200MB的新内容更新文件。16秒后,用户B开始以200Mbps的速度下载文件。用户B是否获得了全部200MB的原始文件,还是用户B获得了约2MB的用户A的更改,仅此而已?
用户B获得全部200MB的原始文件。
原因如下:
PUT
S3上的操作是原子的。从技术上讲,没有“修改”对象的事情。覆盖对象时实际发生的情况是,该对象被具有相同密钥的另一个对象替换。但是原始对象实际上并没有被替换,直到新的(覆盖)对象全部上载并成功上传为止……即使如此,覆盖的对象在技术上还没有“消失”-它仅在存储桶的索引中被替换,以便将来的请求将被提供给新对象。
(实际上已记录了服务新对象并不能保证总是立即发生。与可立即下载的新对象上载相比,现有对象的覆盖最终是一致的,这意味着可能(但不太可能)上传对象后的短时间内,仍可以将旧副本提供给后续请求)。
但是,当您覆盖对象时,并且在存储桶上未启用版本控制时,尽管使用了相同的密钥,但旧对象和新对象实际上是独立存储在S3中的。现在,该存储区的索引不再引用该旧对象,因此您不再需要为存储该存储区开帐单,并且很快就会从S3的后备存储中清除该对象。实际没有记录在多久之后发生……但是(tl; dr)覆盖当前正在下载的对象不会引起任何意外的副作用。
单个密钥的更新是原子的。例如,如果将PUT放置到现有密钥上,则后续的读取可能会返回旧数据或更新后的数据,但绝不会写入损坏或部分数据。
http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句