59

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

要求是:

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

我对“可以通过数据库完成”或“可以通过 JavaSpaces 完成”之类的答案不感兴趣——我知道。我对现成的、开箱即用的、经过验证的实施很感兴趣。

4

6 回答 6

23

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

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

榛树

  1. 互斥(锁),是的实现java.util.concurrency.locks.Lock
  2. 特定超时后自动释放锁,是的,如果成员离开集群,所有锁都会被释放
  3. Java实现,是的
  4. 很高兴拥有:.Net 实现,不是纯 java 解决方案,也许可以移植到 j#
  5. 如果它是免费的:死锁检测/缓解,不,我的 Hazelcast 没有努力处理这个问题
  6. 易于部署,它是带有单个配置文件的单个 jar,作为应用程序的一部分部署,不需要额外的过程
于 2009-06-30T08:29:34.340 回答
14

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

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

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

于 2009-06-30T10:19:25.350 回答
12

Teracotta,包括开源版本,已经通过使用synchronized或使用分布式锁定语义java.util.concurrent.ReentrantReadWriteLock- 后者显然符合您的要求。


更新

由于问题现在添加了与 GigaSpaces '混合'的要求,我要说不要混合它们。它只会给您的技术堆栈增加更多复杂性,并且需要付出以下努力:

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

将更好地用于创建或实施基于 GigaSpaces 的锁定解决方案。

于 2009-06-29T18:02:41.430 回答
8

我建议使用Redisson,它是基于 In-Memory Data Grid的Redis 。它实现了熟悉的 Java 数据结构,包括分布式java.util.Lockjava.util.concurrent.ReentrantReadWriteLock对象。包括设置租约时间的能力。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 等云供应商。

于 2014-01-12T06:48:13.570 回答
2

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

于 2014-04-16T08:46:48.177 回答
-2

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

  cache.lock(key, -1);
    try {
      // .. add your critical code here
    } finally {
      cache.unlock(key);
    }

锁在服务器故障、滚动重启等情况下仍然存在。

为了全面披露,我在 Oracle 工作。这篇文章中表达的观点和观点是我自己的,并不一定反映我雇主的观点或观点。

于 2014-02-14T19:36:16.477 回答