分布式锁服务

rip*_*234 55 java timeout locking distributed-lock

你会使用哪种分布式锁服务?

要求是:

  1. 可以从不同的进程/机器中看到的互斥(锁定)
  2. 锁...释放语义
  3. 在某个超时后自动锁定释放 - 如果锁定持有者死亡,它将在X秒后自动释放
  4. Java实现
  5. 很高兴:.Net实施
  6. 如果它是免费的:死锁检测/缓解
  7. 易于部署,请参阅下面的说明.

我对"它可以在数据库上完成"或"它可以在JavaSpaces上完成"等答案不感兴趣 - 我知道.我对一个现成的,开箱即用的,经过验证的实现感兴趣.

Gar*_*vis 22

街区的一个新孩子是淡褐色的.我一直在玩它,使用和配置非常简单.

据我所知,Gigaspaces和hazelcast之间不应该有任何冲突,因为hazelcast没有任何依赖关系,即没有jgroups.jar等

Hazelcast:

  1. 互斥(锁定),是的执行 java.util.concurrency.locks.Lock
  2. 在某个超时后自动锁定释放,如果成员离开集群,则释放所有锁定
  3. Java实现,是的
  4. 很高兴:.Net实现,nope是一个纯java解决方案,可能可以移植到j#
  5. 如果它是免费的:死锁检测/缓解,nope没有努力使我的Hazelcast处理这个
  6. 易于部署,它是一个带有单个配置文件的jar,作为应用程序的一部分进行部署,无需额外的过程

  • 是的,hazelcast使用mutlicast来自动发现它的成员,如果mutlicast不适合,也可以使用hardwiring群集.如果你想使用MySql锁定东西,那真的很容易吗?只是做'从ID锁定LOCK_TABLE ID =`sharedname` FOR UPDATE' (3认同)

Rob*_*anu 13

陶土,包括开源版本,已经分发通过使用锁定语义synchronizedjava.util.concurrent.ReentrantReadWriteLock-后者显然是适合您的需求.


更新

由于这个问题现在增加了与GigaSpaces"混合"的要求,我将说不要混合它们.这只会增加您的技术堆栈的复杂性,以及:

  • 在代码和基础设施方面进行整合;
  • 管理他们之间的同步;
  • 学习/调整/调试Teracotta.

最好花在创建或实现基于GigaSpaces的锁定解决方案上.


小智 13

查看Apache的Zookeeper(一个Hadoop子项目) - 它提供分布式同步.文档不是很好,但是有什么使它看起来很有趣 - 查看有关如何使用Zookeeper的想法的方法.

它比您可能想要的更低级别,并且它需要额外的部署,因为它推荐专用服务器.

您可以为不同的锁定策略建模,它确实为锁定持有者死亡(短暂节点)提供了解决方案.

  • AFAIU,ZooKeeper为每个锁获取写入磁盘.太贵. (4认同)
  • 预写日志的内容是可恢复性的.并且由于锁定服务是分布式的,因此如果未缓存锁定,则锁定获取将导致网络旅行.与网络旅行相比,附加到磁盘并不是非常昂贵.Zookeepr用于许多分布式系统,如HBase.它的表现很好. (4认同)

Nik*_*rov 7

我建议使用Redisson,它是基于内存数据网格的Redis.它实现了熟悉的Java数据结构,包括分布式java.util.Lockjava.util.concurrent.ReentrantReadWriteLock对象.包括设置leaseTime的能力.Lock用法示例:

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();
Run Code Online (Sandbox Code Playgroud)

支持Azure和AWS等云供应商.

  • @Scott我修复了我的答案,在Redisson 1.1.4版本中增加了设置锁定释放超时的新功能 (2认同)