java - Java可设置过期的全局分布式锁

标签 java concurrency locking semaphore distributed-lock

我有一个用例,我想要一个全局分布式锁。我们一开始使用SELECT .. FOR UPDATE,但随着我们扩大服务器数量,很快就出现了问题。此外,它没有考虑检查锁然后死亡且无法返回锁的进程。

我们需要能够设置锁的过期时间(即,如果 checkout 锁的进程在 2 小时内没有返回锁,则锁将自动返回到池中)。我意识到这引入了我们忽略锁的问题,但我们相当确定如果在 2 小时内没有完成,该进程就会终止。而且这项工作是幂等的,因此如果多次完成也没什么大不了的。

我查看了许多分布式锁定系统并发现 this questions这非常有帮助。所有解决方案都扩展自 Java 的 java.util.concurrency.locks.Lock,这实际上可能是我遇到的问题,因为该接口(interface)没有我需要的过期功能。我们有类似的策略mongo-java-distributed-lock我们使用 MongoDB 的 findAndModify 。我们正在考虑:

作为我们的分布式锁定机制(都恰好实现了java.util.concurrency.locks.Lock)。

最大的问题是,因为java.util.concurrency.locks.Lock没有使锁过期的选项,所以这些并不符合所有目标。这个answer可能与 hazelcast 最接近,但它依赖于整个服务器失败,而不仅仅是一个线程花费太长时间。另一种选择可能是使用带有 hazelcast 的 Samaphore,如 here 中所述。 。我可以有一个收割者线程,如果其他线程花费的时间太长,它就可以取消它们的锁定。使用 Mongo 和 Redis,我可以利用它们使对象过期的能力,但这似乎不是这两个库的一部分,因为它们只是实现了 java.util.concurrency.locks.Lock结束。

所以这只是一个冗长的询问方式,是否有一种分布式锁定机制可以在 N 秒后自动过期?在这种情况下,我是否应该考虑与 java.util.concurrency.locks.Lock 不同的机制?

最佳答案

您可以使用Redisson基于Redis服务器。它实现了熟悉的 Java 数据结构,包括具有分布式和可扩展能力的 java.util.Lock。包括设置锁定释放超时的能力。使用示例:

Config config = new Config();
// for single server
config.useSingleServer()
      .setAddress("127.0.0.1:6379");
// or 
// for master/slave servers
config.useSentinelConnection()
      .setMasterName("mymaster")
      .addSentinelAddress("127.0.0.1:26389", "127.0.0.1:26379");

Redisson redisson = Redisson.create(config);

Lock lock = redisson.getLock("anyLock");
try {
   // unlock automatically after 10 seconds of hold
   lock.lock(10, TimeUnit.SECONDS);

} finally {
   lock.unlock();
}

...

redisson.shutdown();

关于java - Java可设置过期的全局分布式锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22766988/

相关文章:

c - Linux C 编程 : Concurrent reads/writes to same file descriptor

c# - C# 中是否有 Guava Striped-Class 的等效项?

java - 对 volatile 的写入是 Java 中的内存屏障吗

multithreading - 同步访问 Rust 中的 FFI 调用(通过全局 RWLock?)

java - Netbeans matisse,自定义按钮图标属性错误

java - Primefaces 3.4 单元内可编辑表格在验证失败后将 inputtext-cell 标记为红色

java - 扫描仪未按预期计算空白

java - JAXBContext 上下文路径与 @XMLSeeAlso

Java EE 并发和锁定

java - Java 应用程序的锁分析器