Amazon S3 现在可以执行条件写入,在更新对象之前评估对象是否未经修改。这有助于您协调对同一对象的同时写入,并防止多个并发写入者在不知道其内容状态的情况下无意中覆盖该对象。您可以通过提供对象的 ETag 来使用此功能 […]
这个新的条件标头可以通过可靠地将比较和交换操作卸载到 S3,帮助提高大规模分析、分布式机器学习和其他高度并行化工作负载的效率。
( Azure Blob Storage和Google Cloud均已具备此功能。)
当 AWS 在 8 月份添加条件写入支持(仅针对具有该键的对象是否存在)时,我写了有关Gunnar Morling 的S3 条件写入领导者选举技巧。这项新功能为沿着这些思路实现分布式锁定系统开辟了一整套新模式。
这是lxgr 在 Hacker News 上提供的一个有用的说明性示例:
作为一个(非常低效,在发生非平凡写入争用的情况下)玩具示例,您可以使用 S3 作为无锁并发 SQLite 存储后端:通过获取整个数据库并在本地满足操作来按预期进行读取工作;写这样的工作:
- 下载当前数据库副本
- 在本地执行写入
- 使用“Put-If-Match”将其上传回来,并将预编辑副本作为匹配对象。
- 如果成功,则认为交易成功。
- 如果失败,请返回步骤 1 并重试。
AWS 还刚刚添加了在存储桶策略中强制执行条件写入的功能:
要强制执行条件写入操作,您现在可以使用 s3:if-none-match 或 s3:if-match 条件键来编写存储桶策略,强制在 S3 中使用 HTTP if-none-match 或 HTTP if-match 条件标头PutObject 和 CompleteMultipartUpload API 请求。实施此存储桶策略后,任何在没有所需条件标头的情况下将对象写入存储桶的尝试都将被拒绝。
通过黑客新闻
原文: https://simonwillison.net/2024/Nov/26/s3-conditional-writes/#atom-everything