您将使用哪种分布式锁定服务?
要求是:
我对“它可以在数据库上完成”或“它可以在JavaSpaces上完成”等答案不感兴趣 - 我知道。我对现成的,开箱即用的,经过验证的实施感兴趣。
答案 0 :(得分:22)
街区的一个新生儿是hazelcast。我一直在玩它,使用和配置非常简单。
据我所知,Gigaspaces和hazelcast之间不应该有任何冲突,因为hazelcast没有任何依赖关系,即没有jgroups.jar等
<强> Hazelcast 强>:
java.util.concurrency.locks.Lock
答案 1 :(得分:13)
Teracotta,包括开源版,使用synchronized
或java.util.concurrent.ReentrantReadWriteLock
分发了锁定语义 - 后者显然符合您的要求。
<强>更新强>
由于问题现在增加了与GigaSpaces“混合”的要求,我将说不混合它们。这只会增加您的技术堆栈的复杂性,以及:
的努力最好花在创建或实现基于GigaSpaces的锁定解决方案上。
答案 2 :(得分:13)
查看Apache的Zookeeper(一个Hadoop子项目) - 它提供分布式同步。文档不是很好,但有什么使它看起来很有趣 - 查看关于如何使用Zookeeper的想法的方法。
它低于您可能想要的级别,并且它需要额外部署,因为它推荐专用服务器。
您可以为不同的锁定策略建模,它确实为锁定持有者死亡(短暂节点)提供了解决方案。
答案 3 :(得分:5)
我建议使用基于内存数据网格的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等云供应商。
答案 4 :(得分:3)
Apache Curator成为分布式锁定的事实标准。查看recipes中的锁定以获取更多信息。
答案 5 :(得分:-2)
cache.lock(key, -1);
try {
// ..
} finally {
cache.unlock(key);
}
锁定可以解决服务器故障,滚动重启等问题。
为了充分披露,我在Oracle工作。本文中表达的观点和观点是我自己的,不一定反映我的雇主的意见或观点。