你会使用哪种分布式锁服务?
要求是:
可以从不同的进程/机器中看到的互斥(锁定)
锁...释放语义
在某个超时后自动锁定释放 - 如果锁定持有者死亡,它将在X秒后自动释放
Java实现
很高兴:.Net实施
如果它是免费的:死锁检测/缓解
易于部署,请参阅下面的说明.
我对"它可以在数据库上完成"或"它可以在JavaSpaces上完成"等答案不感兴趣 - 我知道.我对一个现成的,开箱即用的,经过验证的实现感兴趣.
街区的一个新孩子是淡褐色的.我一直在玩它,使用和配置非常简单.
据我所知,Gigaspaces和hazelcast之间不应该有任何冲突,因为hazelcast没有任何依赖关系,即没有jgroups.jar等
Hazelcast:
互斥(锁定),是的执行 java.util.concurrency.locks.Lock
在某个超时后自动锁定释放,如果成员离开集群,则释放所有锁定
Java实现,是的
很高兴:.Net实现,nope是一个纯java解决方案,可能可以移植到j#
如果它是免费的:死锁检测/缓解,nope没有努力使我的Hazelcast处理这个
易于部署,它是一个带有单个配置文件的jar,作为应用程序的一部分进行部署,无需额外的过程
陶土,包括开源版本,已经分发通过使用锁定语义synchronized
或java.util.concurrent.ReentrantReadWriteLock
-后者显然是适合您的需求.
更新
由于这个问题现在增加了与GigaSpaces"混合"的要求,我将说不要混合它们.这只会增加您的技术堆栈的复杂性,以及:
在代码和基础设施方面进行整合;
管理他们之间的同步;
学习/调整/调试Teracotta.
最好花在创建或实现基于GigaSpaces的锁定解决方案上.
查看Apache的Zookeeper(一个Hadoop子项目) - 它提供分布式同步.文档不是很好,但是有什么使它看起来很有趣 - 查看有关如何使用Zookeeper的想法的方法.
它比您可能想要的更低级别,并且它需要额外的部署,因为它推荐专用服务器.
您可以为不同的锁定策略建模,它确实为锁定持有者死亡(短暂节点)提供了解决方案.
我建议使用Redisson,它是基于内存数据网格的Redis.它实现了熟悉的Java数据结构,包括分布式java.util.Lock
和java.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();
支持Azure和AWS等云供应商.