0

我正在 Amazon S3 上实现一个数据库,并且需要对我的索引对象(实现为 S3 对象)进行并发访问,因此我正在寻找一种方法来实现对 S3 对象的乐观锁定。

我最初的想法是利用S3 版本控制机制,并且仅当对象版本与我阅读时的版本匹配时才更新索引对象(使用 PUT 操作)。但是,根据 S3 文档,S3 版本控制似乎不支持此功能:PUT 不能以特定版本为条件,并且始终更新对象的最新版本。

我的问题是:

  1. 是否可以使用 S3 版本控制来实现这种乐观锁定(似乎不是因为缺少以版本号为条件的 PUT)?

  2. 如果 1 不可能,我是否可以使用我自己的版本控制(版本号保存为 S3 对象标签或其他对象元数据)来实现它——这可能还需要以元数据值为条件的对象放置/更新。

  3. 如果 1 和 2 都不可能,我是否必须引入外部机制(例如 Zookeeper 或其他分布式锁定)来实现对 S3 对象的并发访问?这样做的最佳做法是什么?我考虑使用单独的锁定对象(实现为 S3 对象)来指示索引是否被锁定,但这种方案有一定的缺点。

我意识到以前也有人问过类似的问题,例如,(AWS S3 中是否存在乐观锁定?)。但是,由于 S3 现在采用了新的强一致性模型(写入、覆盖、列出和删除),以前的答案似乎不再有效。

4

1 回答 1

0

您无法通过仅使用 AWS S3 来实现这一点。

您可以实施以下解决方法来实现此目的:

  • 您可以在 AWS DynamoDB 或 AWS SSM Parameter Store 中维护一个锁定变量(以节省资金),该变量可以在 PUT 操作期间设置为 TRUE/FALSE。

  • 您可以在 S3 存储桶上启用版本控制,并为 AWS DynamoDB 或 AWS SSM Parameter Store 中的所有读取操作维护要读取的版本(以节省资金),并在 PUT 操作成功后更新该版本。您也可以通过不在 S3 上启用版本控制并通过在键名中附加版本号作为后缀来创建新对象来实现此目的。

于 2022-02-14T12:14:21.287 回答