aws s3 如何处理覆盖文件和访问?

Posted

技术标签:

【中文标题】aws s3 如何处理覆盖文件和访问?【英文标题】:How does aws s3 handle overwriting a file and access? 【发布时间】:2017-05-17 20:04:17 【问题描述】:

所以我是亚马逊 s3 的新手,想知道是否有人可以帮助回答这个问题。

我有一组静态 API / JSON 文件,用于为移动应用程序提供动力,而 JSON 数据大部分是静态的,可以随时触发更新,从而更新数据和 JSON文件也随之更新。

我的问题是,亚马逊如何处理有关访问的文件更新,我的意思是,如果有人在我希望写入的时间访问该文件,它会被阻止还是亚马逊员工是否有一些文件缓存到防止这种情况发生。

谢谢!

【问题讨论】:

如果您担心 API 中的数据过时,可以将 Dynamodb 用于条件写入和强一致性读取。如果自上次读取后数据未更改,则条件写入将允许更改数据。而Strongly consistent reads 将始终在所有 dynamodb 节点上提供相同的数据。 Working with Conditional Writes 【参考方案1】:

您不会被阻止,但如果对象已经存在并且最近被替换或删除,您可以获得过时的数据。

S3 为新对象的 PUTS 提供写后读一致性。

S3 为覆盖 PUTS 和 DELETES 提供最终一致性。这意味着即使 user1 替换了它(亚秒级), user2 也可以获得 JSON 的陈旧版本。

【讨论】:

谢谢戴夫!这应该可以工作,基本上我触发我的应用程序在更新后根据缓存键查找更新,并且仅在创建 Json 文件后更新,所以我不会遇到问题。【参考方案2】:

您实际上无法在 S3 中更新对象。您所能做的就是存储、检索和删除整个对象。要“更新”对象的内容,您需要替换整个对象。

如果客户端 A 上传了替换对象,并且在确认上传之前,客户端 B 访问相同的对象密钥,则客户端 B 将获取原始对象。

这是来自Amazon S3 data consistency model 的支持引用:

对单个键的更新是原子的。例如,如果您从一个线程向现有密钥发出 PUT 请求,并同时从第二个线程对同一密钥执行 GET 请求,您将获得旧数据或新数据,但绝不会获得部分或损坏的数据。

截至 2020 年 12 月 13 日,S3 现在提供strong consistency:

在成功写入新对象或覆盖或删除现有对象后,任何后续读取请求都会立即收到该对象的最新版本。 S3 还为列表操作提供了强一致性,因此在写入之后,您可以立即执行存储桶中对象的列表,并反映任何更改。

【讨论】:

这是原子操作吗?如果你读取一个文件,你会得到一个分布式的多部分流超时传送给你(一个大的对象,需要更多的时间和收到的部分)。如果有人在流中替换了该对象,那么会发生什么? @ChrisIvan 好问题,我无法立即找到任何权威。我确实找到了this 和this。 感谢分享,@jarmod。这种情况表明,是的,文件确实只被写入部分,如果在被覆盖时尝试读取文件,则可能导致文件损坏。 @ChrisIvan 我已经用来自Amazon S3 data consistency model 的信息更新了我的答案:“如果您从一个线程向现有密钥发出 PUT 请求,并在一秒钟内对同一密钥执行 GET 请求线程并发,您将获得旧数据或新数据,但不会获得部分或损坏的数据”。

以上是关于aws s3 如何处理覆盖文件和访问?的主要内容,如果未能解决你的问题,请参考以下文章

批处理脚本通过ftp下载文件,我该如何处理覆盖

从多个进程访问 Amazon S3 文件

AWS DMS:如何处理 Presto/Athena 中的 TIMESTAMP_MICROS parquet 字段

如何处理覆盖固定元素的Android键盘?

如何处理来自 S3 的大文件并在 Spring Batch 中使用它

存储桶之间的 AWS S3 同步覆盖较新的目标文件