这可能看起来是一个非常基础的问题,但如果我在另一个进程更新S3中的文件时下载该文件,我需要担心文件不完整的问题吗?
举个例子:一个200MB的CSV文件。用户A开始以1Mbps的速度更新该文件的200MB新内容。16秒后,用户B以200Mbps的速度开始下载文件。用户B是否会获得原始文件的全部200MB,还是只会获得用户A更改的约2MB内容而已?
这可能看起来是一个非常基础的问题,但如果我在另一个进程更新S3中的文件时下载该文件,我需要担心文件不完整的问题吗?
举个例子:一个200MB的CSV文件。用户A开始以1Mbps的速度更新该文件的200MB新内容。16秒后,用户B以200Mbps的速度开始下载文件。用户B是否会获得原始文件的全部200MB,还是只会获得用户A更改的约2MB内容而已?
User B获得了原始文件的全部200MB。
原因在于:
S3上的PUT
操作是原子性的。技术上讲,不存在“修改”对象的情况。实际上,在覆盖对象时,会用具有相同关键字的新对象替换原对象。但是,在新(覆盖)对象完全上传并成功后,原始对象才真正被替换...即使如此,覆盖的对象还没有从技术上“消失”,它只是在桶的索引中被替换,以便将来的请求将服务于新对象。
(实际上,为新对象提供服务并不保证总是立即发生。与上传新对象不同,覆盖现有对象是“最终一致性”的,这意味着在上传对象后的短时间内,旧副本仍可能为随后的请求提供服务,尽管这种可能性很小)。
但是,当您覆盖一个对象,并且桶上未启用版本控制时,旧对象和新对象实际上在S3中独立存储,尽管具有相同的关键字。旧对象现在不再由桶的索引引用,因此您不再为其存储而计费,它将很快从S3的后备存储中清除。实际上没有记录这会在多久之后发生...但是总之,覆盖当前正在下载的对象不应该引起任何意外的副作用。
对单个密钥的更新是原子的。例如,如果您向现有密钥进行PUT操作,则随后的读取可能返回旧数据或更新的数据,但它永远不会写入损坏或部分数据。
http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel