是否可以保证读取AWS S3返回新创建的对象?

RTF*_*RTF 3 amazon-s3 amazon-web-services

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

如果我向S3写入对象,并且在从写入操作中获得成功响应后,我立即尝试读取它,读取操作是否可以保证返回对象?

换句话说,读取操作是否可能因为找不到对象而失败?因为读取发生在写入之后太早了?

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

kos*_*osa 5

是的,保证返回带有一个警告的对象(仅对于新对象):

根据AWS文档

Amazon S3为所有区域中的S3存储桶中的新对象提供PUTS写入后读取一致性,但请注意。需要注意的是,如果在创建对象之前对键名称发出HEAD或GET请求(以查找对象是否存在),Amazon S3最终将为写后读取提供一致性。

Amazon S3为覆盖所有区域中的PUTS和DELETES提供了最终的一致性。

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

如果在对象存在之前发送GET或HEAD,例如在上传之前检查是否存在对象,则即使上传完成后,上传也不立即与读取请求保持一致,因为S3已经成为唯一它将针对该对象进行一致的内部查询,从而权威地发现没有此类关键字。对象创建最终变得一致,因为创建必须“覆盖”没有发现任何内容的先前查找。

根据链接中提供的下表,“一致读取”永远不会过时。 在此处输入图片说明

上面提供的链接提供了一个很好的示例,说明“写后读取一致性”和“最终一致性”如何工作。

我想在此答案中添加此警告说明,以使事情更清楚:

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

进程将新对象写入Amazon S3,并立即在其存储桶中列出密钥。在完全传播更改之前,该对象可能不会出现在列表中。

  • 您误解了警告。如果您在对象存在之前*之前发送了GET或HEAD,例如在上传之前检查对象是否存在,则上传请求对于读请求而言*不一致*上传已完成,因为S3已经对该对象进行了唯一立即一致的内部查询,因此权威地发现没有这样的关键字。对象创建最终变得一致,因为创建必须“覆盖”没有发现任何内容的先前查找。 (3认同)
  • @AbhinavVishak如果您在对象存在之前发送“ GET”或“ HEAD”,例如在上传之前检查是否存在对象,则在“上传”之后立即进行下一个“ GET”或“ HEAD”请求不再保证会返回新对象:它可能会在短时间内返回NoSuchKey。对象可能需要很短的时间才能显示出来,**如果您在首次创建对象之前先对其进行了检查。如果您在上载对象之前不检查对象的存在,然后再上载它,那么您会发现可以保证下一个请求将返回新对象。 (2认同)