我有一个用例,我想拥有一个全局分布式锁。我们开始使用SELECT .. FOR UPDATE
,但随着服务器数量的增加,很快就出现了问题。它也没有考虑检查锁然后死亡并且未能返回锁的进程。
我们需要能够对锁设置过期时间(即如果签出锁的进程在 2 小时内没有归还,则自动将锁归还池中)。我意识到这引入了我们忽略锁的问题,但我们相当肯定如果没有在 2 小时内完成,该过程已经死亡。此外,这项工作是幂等的,所以如果它不止一次完成,这没什么大不了的。
我浏览了许多分布式锁定系统,并遇到了非常有帮助的这些问题。所有解决方案都从 Java 扩展java.util.concurrency.locks.Lock
而来,这实际上可能是我遇到的问题,因为该接口没有我需要的过期功能。我们有一个与mongo-java-distributed-lock类似的策略,我们使用 MongoDB 的findAndModify。我们正在考虑:
作为我们的分布式锁定机制(都恰好实现java.util.concurrency.locks.Lock
)。
最大的问题是,因为java.util.concurrency.locks.Lock
没有使锁过期的选项,所以这些并不适合所有目标。这个答案可能与 hazelcast 最接近,但它依赖于整个服务器的故障,而不仅仅是一个花费太长时间的线程。另一种选择可能是使用带有 hazelcast 的 Samaphore,如此处所述。我可以有一个收割线程,如果他们花费的时间太长,它可以取消其他人的锁。使用 Mongo 和 Redis,我可以利用它们使对象过期的能力,但这似乎不是这两个库的一部分,因为它们java.util.concurrency.locks.Lock
最终只是实现了。
所以这只是一个冗长的询问方式,是否有分布式锁定机制可以在 N 秒后自动过期?java.util.concurrency.locks.Lock
我是否应该考虑与这种情况完全不同的机制?