这似乎是一个非常基本的问题,但如果我从 S3 下载文件,同时另一个进程正在更新该文件,我是否需要担心获得不完整的文件?
示例:200MB 的 CSV 文件。用户 A 开始以 1Mbps 的速度更新文件,其中包含 200MB 的新内容。 16秒后,用户B开始以200Mbps的速度下载文件。用户 B 是否获得了全部 200MB 的原始文件,或者用户 B 是否获得了大约 2MB 的用户 A 的更改,仅此而已?
用户 B 获得原始文件的全部 200MB。
原因如下:
PUT
S3 上的操作是原子的。从技术上讲,不存在“修改”对象这样的事情。当一个对象被覆盖时实际发生的事情是该对象被覆盖replaced与具有相同密钥的另一个对象。但是,直到新的(覆盖)对象完整上传并成功上传后,原始对象才真正被替换……即使如此,被覆盖的对象在技术上还没有“消失”——它只是在存储桶的索引中被替换,以便将来的请求将由新对象提供服务。
(提供新对象实际上被记录为不能保证总是立即发生。与立即可供下载的新对象的上传相比,现有对象的覆盖是最终一致,这意味着有可能(无论可能性如何)在上传对象后的短时间内,旧副本仍可用于后续请求)。
但是,当您覆盖对象时,并且存储桶上未启用版本控制,旧对象和新对象实际上是独立存储在 S3 中,尽管密钥相同。旧对象现在不再被存储桶的索引引用,因此您不再需要为它的存储付费,并且它很快就会从 S3 的后备存储中清除。实际上并没有记录这种情况发生了多久......但是(tl;dr)覆盖当前正在下载的对象不应导致任何意外的副作用。
对单个密钥的更新是原子的。例如,如果您 PUT 到现有密钥,后续读取可能会返回旧数据或更新的数据,但永远不会写入损坏或部分数据。
http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)