分布式locking服务

您将使用哪种分布式locking服务?

要求是:

  1. 可以从不同的stream程/机器看到的互斥(locking)
  2. 锁…释放语义
  3. 超过一定时间后自动locking释放 – 如果locking器死亡,X秒后自动释放
  4. Java实现
  5. 很高兴有:.Net的实现
  6. 如果它是免费的:死锁检测/缓解
  7. 易于部署,请参阅下面的注释。

我对“可以通过数据库完成”或者“可以通过JavaSpaces完成”这样的答案不感兴趣 – 我知道。 我对现成的,现成的,经过validation的实施感兴趣。

包括开源版本的Teracotta通过使用synchronizedjava.util.concurrent.ReentrantReadWriteLock分发了locking语义 – 后者显然符合您的要求。


更新

由于现在的问题增加了与GigaSpaces混合的要求,我想说,不要混合它们。 这只会给你的技术堆栈增加更多的复杂性,以及:

  • 整合代码和基础设施;
  • pipe理它们之间的同步;
  • 学习/调教/debuggingTeracotta。

将更好地创build或实施基于GigaSpaces的locking解决scheme。

这个街区的新生儿是榛子 。 我一直在玩它,它使用和configuration非常简单。

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

Hazelcast

  1. 互斥(lock),是java.util.concurrency.locks.Lock实现
  2. 自动locking释放超时后,所有锁都释放,如果一个成员离开集群
  3. Java实现,是的
  4. 很高兴有:.net实现,nope是一个纯java解决scheme,可能有可能移植到j#
  5. 如果它是免费的:死锁检测/缓解,不费吹灰之力是我的Hazelcast来处理这个
  6. 易于部署,它是一个具有单个configuration文件的jar,作为应用程序的一部分进行部署,不需要额外的进程

查看Apache的Zookeeper (一个Hadoop子项目) – 它提供分布式同步。 文档不是很好,但它是什么让它看起来很有趣的产品 – 检查如何使用Zookeeper的想法的食谱。

它比你想要的要低,因为它build议专用的服务器,所以它需要额外的部署。

您可以build模不同的locking策略,并为locking持有者临时(短暂节点)提供解决scheme。

我build议使用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(); 

支持Azure和AWS等云供应商。

在Apache Curator框架的帮助下, ZooKeeper成为分布式locking的事实标准。 查看食谱中的锁以获取更多信息。

Oracle Coherence非常稳定和成熟,包括互斥支持:

 cache.lock(key, -1); try { // .. } finally { cache.unlock(key); } 

服务器失效,滚动重启等

为了充分披露,我在甲骨文工作。 本文所expression的意见和看法属于我自己的观点,并不一定反映雇主的意见或看法。

Interesting Posts