分布式锁服务

时间:2009-06-29 17:53:39

标签: java timeout locking distributed-lock

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

要求是:

  1. 可以从不同进程/机器看到的互斥(锁定)
  2. lock ... release semantics
  3. 在某个超时后自动锁定释放 - 如果锁定持有者死亡,它将在X秒后自动释放
  4. Java实现
  5. 很高兴:.Net实施
  6. 如果它是免费的:死锁检测/缓解
  7. 轻松部署,请参阅下面的说明。
  8. 我对“它可以在数据库上完成”或“它可以在JavaSpaces上完成”等答案不感兴趣 - 我知道。我对现成的,开箱即用的,经过验证的实施感兴趣。

6 个答案:

答案 0 :(得分:22)

街区的一个新生儿是hazelcast。我一直在玩它,使用和配置非常简单。

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

<强> Hazelcast

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

答案 1 :(得分:13)

Teracotta,包括开源版,使用synchronizedjava.util.concurrent.ReentrantReadWriteLock分发了锁定语义 - 后者显然符合您的要求。


<强>更新

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

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

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

答案 2 :(得分:13)

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

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

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

答案 3 :(得分:5)

我建议使用基于内存数据网格的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等云供应商。

答案 4 :(得分:3)

ZooKeeper框架的帮助下,

Apache Curator成为分布式锁定的事实标准。查看recipes中的锁定以获取更多信息。

答案 5 :(得分:-2)

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

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

锁定可以解决服务器故障,滚动重启等问题。

为了充分披露,我在Oracle工作。本文中表达的观点和观点是我自己的,不一定反映我的雇主的意见或观点。