【问题标题】:Is AWS S3 read guaranteed to return a newly created object?AWS S3 读取是否保证返回新创建的对象?
【发布时间】:2017-06-22 05:52:45
【问题描述】:

我一直在阅读有关与 AWS S3 写后读一致性的文档,但我仍然不确定。

如果我将一个对象写入 S3,并且在我的写入操作获得成功响应后,我立即尝试读取它,读取操作是否保证返回该对象?

也就是说,读操作会不会因为找不到对象而失败?因为读取发生在写入之后太快?

我在这里只讨论新的 PUT,而不是对现有对象的更新。

【问题讨论】:

标签: amazon-web-services amazon-s3


【解决方案1】:

是的,保证返回对象(仅适用于新对象),但需要注意:

根据AWS documentation

Amazon S3 为新的 PUTS 提供写后读一致性 所有区域的 S3 存储桶中的对象,但有一个警告。警告 是如果您对键名发出 HEAD 或 GET 请求(查找是否 对象存在)在创建对象之前,Amazon S3 提供 写后读的最终一致性。

Amazon S3 为覆盖 PUTS 和 DELETES 提供最终一致性 在所有地区。

编辑:感谢@Michael - sqlbot,更多关于 HEAD(或)GET 警告:

如果在对象存在之前发送GET或HEAD,例如在上传之前检查是否有对象,那么即使在上传完成之后,对于读取请求的上传也不会立即一致,因为S3已经做了它将对该对象进行的唯一立即一致的内部查询,权威地发现没有这样的密钥。对象创建最终变得一致,因为创建必须“覆盖”先前没有发现的查找。

根据链接中提供的下表,“一致读取”永远不会过时。

上面提供的链接有关于“写后读一致性”和“最终一致性”如何工作的很好的例子。

我想在此答案中添加此注意事项以使事情更清楚:

Amazon S3 通过在 Amazon 数据中心内的多台服务器之间复制数据来实现高可用性。如果 PUT 请求成功,您的数据将被安全存储。但是,有关更改的信息必须在 Amazon S3 中复制,这可能需要一些时间,因此您可能会观察到以下行为:

一个进程将一个新对象写入 Amazon S3 并立即列出键 在它的桶内。直到更改完全传播,对象 可能不会出现在列表中。

【讨论】:

  • 这很好,但我不太明白这个警告。它说如果你创建一个 HEAD 或 GET before 创建对象......但如果你这样做,那么它不是一个写后读操作,那么它为什么相关?这就像先读后写,没有意义。
  • 但是 GET 是一种读取,不是吗?他们应该在第一次写入后是安全的。但是,警告与此相矛盾?
  • 您误解了警告。如果你发送GETHEADbefore对象存在,比如上传前先检查是否有对象,则上传立即一致对于读取请求即使在上传完成之后,因为 S3 已经为该对象进行了唯一立即一致的内部查询,权威地发现没有这样的密钥。对象的创建最终变得一致,因为创建必须“覆盖”之前没有发现任何内容的查找。
  • @Michael-sqlbot 谢谢!我删除了我的cmets。您的意见非常有效,感谢您的评论。向您的 cmets 学习很多东西。但我不确定的一件事是,有人会在不检查 GET 调用结果的情况下启动上传的实际原因是什么?任何想法。
  • @AbhinavVishak 如果在对象存在之前发送GETHEAD,例如在上传之前检查那里是否有对象,则下一个GETHEAD 请求立即上传后不再保证返回新对象:它可能在短时间内返回NoSuchKey。对象可能需要很短的时间才会出现,如果您在第一次创建它们之前检查它们。如果您在上传之前不检查对象是否存在,然后上传它,那么您会发现下一个请求保证返回新对象。
猜你喜欢
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
相关资源
最近更新 更多