利用Amazon S3条件写入提升分布式系统数据完整性

AWS 宣布 Amazon S3 支持条件写入

AWS 最近宣布在 Amazon S3 中支持条件写入功能,允许用户在上传数据之前检查对象是否存在。这一功能有助于防止覆盖现有对象,使应用程序更易于管理数据。

条件写入的用途

条件写入 简化了多个客户端并行更新共享数据集的分布式应用程序的工作方式。每个客户端可以条件性地写入对象,确保不会覆盖其他客户端已写入的对象。这意味着无需构建客户端共识机制来协调更新,也无需使用额外的 API 请求来检查对象是否存在。

开发者如何利用条件写入

开发者可以将此类验证工作交给 S3,从而提高大规模分析、分布式机器学习和高度并行化工作负载的性能和效率。要使用条件写入,开发者可以在 PutObjectCompleteMultipartUpload API 请求中添加 HTTP if-none-match 条件头。

使用 AWS CLI 进行条件写入的示例

以下是一个使用 AWS CLI 进行条件写入的示例:

aws s3api put-object --bucket amzn-s3-demo-bucket --key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --if-none-match "*"

S3 与 DynamoDB 的比较

在 Hacker News 的一个讨论中,有人问及是否需要使用 DynamoDB 来实现可靠的分布式锁定服务。有人认为,使用 S3 更为简单,设置更少,代码更少,成本也更低。

条件写入的行为

根据 AWS 的文档,条件写入的行为如下:

  1. 如果桶中不存在同名对象,写入操作成功并返回 200 响应
  2. 如果存在同名对象,写入操作失败并返回 412 预处理失败响应。如果启用了版本控制,S3 会检查是否存在同名对象的当前版本。
  3. 如果不存在当前对象版本或当前版本是删除标记,写入操作成功。
  4. 对同一对象名的多个条件写入请求中,第一个写入操作成功,后续写入操作失败并返回 412 预处理失败响应。并发请求可能会导致 409 冲突响应
  5. 如果在对对象的删除请求在条件写入操作完成之前成功,删除请求优先。在收到 PutObject 和 CompleteMultipartUpload 的 409 错误后,可能需要重试。

AWS 产品经理的评论

AWS 产品经理 Paul Meighan 在 LinkedIn 的帖子中表示:

这对于具有多个并发写入者的分布式应用程序来说是一个巨大的简化,并且总体上是一个数据完整性的胜利。

Gregor Hohpe 评论道:

现在,这才是我所说的分布式系统“原语”:条件写入。

条件写入的可用性

目前,Amazon S3 的条件写入功能在所有 AWS 区域(包括 AWS GovCloud (US) 区域和 AWS 中国区域)免费提供。此外,示例代码可在 GitHub 仓库 中找到。

阅读 31
0 条评论