你会使用哪种分布式锁服务?
要求是:
- 可以从不同进程/机器看到的互斥(锁)
- 锁定...释放语义
- 一定超时后自动释放锁 - 如果锁持有者死亡,它将在 X 秒后自动释放
- Java 实现
- 很高兴拥有:.Net 实施
- 如果它是免费的:死锁检测/缓解
- 易于部署,请参阅下面的注释。
我对“可以通过数据库完成”或“可以通过 JavaSpaces 完成”之类的答案不感兴趣——我知道。我对现成的、开箱即用的、经过验证的实施很感兴趣。
你会使用哪种分布式锁服务?
要求是:
我对“可以通过数据库完成”或“可以通过 JavaSpaces 完成”之类的答案不感兴趣——我知道。我对现成的、开箱即用的、经过验证的实施很感兴趣。
街区里一个新来的孩子是hazelcast。我一直在玩它,它的使用和配置非常简单。
据我所知,Gigaspaces 和 hazelcast 之间不应该有任何冲突,因为 hazelcast 没有任何依赖关系,即没有 jgroups.jar 等
榛树:
java.util.concurrency.locks.Lock
查看 Apache 的Zookeeper(一个 Hadoop 子项目)——它提供分布式同步。文档不是很好,但它看起来是一个有趣的产品——查看食谱以获取有关如何使用 Zookeeper 的想法。
它比您可能想要的级别低,并且确实需要额外的部署,因为它推荐使用专用服务器。
您可以对不同的锁定策略进行建模,它确实为锁持有者死亡(临时节点)提供了解决方案。
Teracotta,包括开源版本,已经通过使用synchronized
或使用分布式锁定语义java.util.concurrent.ReentrantReadWriteLock
- 后者显然符合您的要求。
更新
由于问题现在添加了与 GigaSpaces '混合'的要求,我要说不要混合它们。它只会给您的技术堆栈增加更多复杂性,并且需要付出以下努力:
将更好地用于创建或实施基于 GigaSpaces 的锁定解决方案。
我建议使用Redisson,它是基于 In-Memory Data Grid的Redis 。它实现了熟悉的 Java 数据结构,包括分布式java.util.Lock
和java.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 等云供应商。
在Apache Curator框架的帮助下, ZooKeeper成为分布式锁定的事实标准。查看食谱中的锁以获取更多信息。
Oracle Coherence 非常稳定和成熟,包括互斥支持:
cache.lock(key, -1);
try {
// .. add your critical code here
} finally {
cache.unlock(key);
}
锁在服务器故障、滚动重启等情况下仍然存在。
为了全面披露,我在 Oracle 工作。这篇文章中表达的观点和观点是我自己的,并不一定反映我雇主的观点或观点。