我正在考虑使用“锁定”S3对象以防止在给定的S3对象上同时执行相同的操作。但我对这项技术解决方案的有效性表示怀疑。
更确切地说,在对象的操作开始时,将创建对应于对象名称和正在进行的操作类型的锁定文件。
示例:在myObject上myOperation的开头,如果它不存在,将查找并创建lck / myObject / myOperation对象。
这个“锁定”对象将在操作结束时被销毁,无论它是否成功。
我知道标准解决方案是使用数据库,但应用程序目前没有。因此,如果我只能处理与S3的一致性,那就足够了。
我担心的是这个锁对象系统将在多线程/可能多节点架构中运行。 现在,我已经读过Amazon S3支持“一致写后读取”。
这是否意味着如果我的应用程序1(节点1)/线程2通过Java Amazon S3 API将锁定对象放在给定存储桶上,则此锁定对象将立即对其他线程和其他应用程序可见相同的API?
答案 0 :(得分:2)
不,不幸的是,它不会。从S3 consistency model:
进程将新对象写入Amazon S3并立即列出密钥 在其桶内。直到更改完全传播,对象 可能不会出现在列表中。
和
Amazon S3目前不支持对象锁定。如果两个PUT 请求同时发出相同的密钥,请求与 最新时间戳获胜。如果这是一个问题,您将需要构建一个 对象锁定机制进入你的应用程序。
因此,如果您的两个线程或进程都尝试在S3中创建锁定,那么它们将被允许但最后写入获胜,因此您没有真正锁定任何内容。锁定工作需要做其他事情