我正在 Amazon S3 上实现一个数据库,并且需要对我的索引对象(实现为 S3 对象)进行并发访问,因此我正在寻找一种方法来实现对 S3 对象的乐观锁定。
我最初的想法是利用S3 版本控制机制,并且仅当对象版本与我阅读时的版本匹配时才更新索引对象(使用 PUT 操作)。但是,根据 S3 文档,S3 版本控制似乎不支持此功能:PUT 不能以特定版本为条件,并且始终更新对象的最新版本。
我的问题是:
是否可以使用 S3 版本控制来实现这种乐观锁定(似乎不是因为缺少以版本号为条件的 PUT)?
如果 1 不可能,我是否可以使用我自己的版本控制(版本号保存为 S3 对象标签或其他对象元数据)来实现它——这可能还需要以元数据值为条件的对象放置/更新。
如果 1 和 2 都不可能,我是否必须引入外部机制(例如 Zookeeper 或其他分布式锁定)来实现对 S3 对象的并发访问?这样做的最佳做法是什么?我考虑使用单独的锁定对象(实现为 S3 对象)来指示索引是否被锁定,但这种方案有一定的缺点。
我意识到以前也有人问过类似的问题,例如,(AWS S3 中是否存在乐观锁定?)。但是,由于 S3 现在采用了新的强一致性模型(写入、覆盖、列出和删除),以前的答案似乎不再有效。