我一直在阅读有关 AWS S3 的写后读一致性的文档,但我仍然不确定这一点。
如果我向 S3 写入一个对象,并在从写入操作获得成功响应后,我立即地尝试读取它,读取操作是否保证返回该对象?
换句话说,有没有可能因为找不到对象而导致读操作失败?因为读取发生在写入之后太快?
我在这里只讨论新的 PUT,而不是对现有对象的更新。
是的,保证返回对象(仅适用于新对象),但有一个警告:
As per AWS 文档 http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel:
Amazon S3 为新数据的 PUTS 提供写后读一致性
所有区域中 S3 存储桶中的对象,但有一点需要注意。警告
是,如果您对键名称发出 HEAD 或 GET 请求(以查找是否
对象存在)在创建对象之前,Amazon S3 提供
写后读的最终一致性。
Amazon S3 为覆盖 PUTS 和 DELETES 提供最终一致性
在所有地区。
编辑:归功于@Michael - sqlbot,更多关于 HEAD(或)GET 警告:
如果在对象存在之前发送 GET 或 HEAD,比如在上传之前检查是否存在对象,那么即使上传完成后,对于读请求来说,上传也不会立即一致,因为 S3 已经做了唯一立即它将对该对象进行一致的内部查询,权威地发现不存在这样的键。对象创建最终变得一致,因为创建必须“覆盖”之前没有找到任何内容的查找。
Based on following table provided in the link, "consistent reads" will never be stale.
上面提供的链接有一个关于“写后读一致性”和“最终一致性”如何工作的很好的例子。
我想在此答案中添加此警告注释,以使事情更加清楚:
Amazon S3 通过在 Amazon 数据中心内的多个服务器之间复制数据来实现高可用性。如果 PUT 请求成功,您的数据将被安全存储。但是,有关更改的信息必须在 Amazon S3 上复制,这可能需要一些时间,因此您可能会观察到以下行为:
进程将新对象写入 Amazon S3 并立即列出密钥
在它的桶里。直到更改完全传播为止,该对象
可能不会出现在列表中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)