分布式locking服务
您将使用哪种分布式locking服务?
要求是:
- 可以从不同的stream程/机器看到的互斥(locking)
- 锁…释放语义
- 超过一定时间后自动locking释放 – 如果locking器死亡,X秒后自动释放
- Java实现
- 很高兴有:.Net的实现
- 如果它是免费的:死锁检测/缓解
- 易于部署,请参阅下面的注释。
我对“可以通过数据库完成”或者“可以通过JavaSpaces完成”这样的答案不感兴趣 – 我知道。 我对现成的,现成的,经过validation的实施感兴趣。
包括开源版本的Teracotta通过使用synchronized
或java.util.concurrent.ReentrantReadWriteLock
分发了locking语义 – 后者显然符合您的要求。
更新
由于现在的问题增加了与GigaSpaces混合的要求,我想说,不要混合它们。 这只会给你的技术堆栈增加更多的复杂性,以及:
- 整合代码和基础设施;
- pipe理它们之间的同步;
- 学习/调教/debuggingTeracotta。
将更好地创build或实施基于GigaSpaces的locking解决scheme。
这个街区的新生儿是榛子 。 我一直在玩它,它使用和configuration非常简单。
据我所知,Gigaspaces和hazelcast之间不应该有任何冲突,因为hazelcast没有任何依赖,即没有jgroups.jar等
Hazelcast :
- 互斥(lock),是
java.util.concurrency.locks.Lock
实现 - 自动locking释放超时后,所有锁都释放,如果一个成员离开集群
- Java实现,是的
- 很高兴有:.net实现,nope是一个纯java解决scheme,可能有可能移植到j#
- 如果它是免费的:死锁检测/缓解,不费吹灰之力是我的Hazelcast来处理这个
- 易于部署,它是一个具有单个configuration文件的jar,作为应用程序的一部分进行部署,不需要额外的进程
查看Apache的Zookeeper (一个Hadoop子项目) – 它提供分布式同步。 文档不是很好,但它是什么让它看起来很有趣的产品 – 检查如何使用Zookeeper的想法的食谱。
它比你想要的要低,因为它build议专用的服务器,所以它需要额外的部署。
您可以build模不同的locking策略,并为locking持有者临时(短暂节点)提供解决scheme。
我build议使用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等云供应商。
在Apache Curator框架的帮助下, ZooKeeper成为分布式locking的事实标准。 查看食谱中的锁以获取更多信息。
Oracle Coherence非常稳定和成熟,包括互斥支持:
cache.lock(key, -1); try { // .. } finally { cache.unlock(key); }
服务器失效,滚动重启等
为了充分披露,我在甲骨文工作。 本文所expression的意见和看法属于我自己的观点,并不一定反映雇主的意见或看法。