你会使用哪种分布式锁服务?
要求是:
我对"它可以在数据库上完成"或"它可以在JavaSpaces上完成"等答案不感兴趣 - 我知道.我对一个现成的,开箱即用的,经过验证的实现感兴趣.
我有一个包含3个主节点的Redis集群,每个主节点都有相应的从节点。我想获取集群上的锁来执行一些写操作,然后释放锁。
据我所知,要连接到集群,我们通常连接到集群中的一个节点,并在该节点上执行所有操作,该节点又处理重定向到集群中其他节点的操作。
Redis集群是否可以获取锁?[PS我正在使用Redisson客户端]从Redisson客户端中Multilock和redlock( https://github.com/redisson/redisson/wiki/8.-Distributed-locks-and-synchronizers )下的示例中,它们正在获取锁在各个节点上。
Jedis 似乎还支持集群锁定(https://github.com/kaidul/jedis-lock)。
PS:我已经广泛阅读了这方面的内容,但我无法找到有关锁定集群的明确答案。非常感谢一些帮助。
distributed-computing redis distributed-lock spring-data-redis redis-cluster
我们目前正在评估apache-curator的分布式锁定用例.以下是我们的测试用例:
public class Test {
private static CuratorFramework client = CuratorFrameworkFactory.newClient("zook.company.com", new ExponentialBackoffRetry(10,5));
public static void main(String[] args) {
client.start();
int numLocks = 50000;
int numThreads = 200;
String[] keyPool = new String[numLocks];
for (int i = 1; i <= numLocks; i++) {
keyPool[i - 1] = String.valueOf(100 + i);
}
for (int i = 0; i < numThreads; i++) {
Thread t = new Thread(new Job(numLocks, keyPool));
t.setName("T" + (i + 1));
t.start();
}
}
private static class Job …Run Code Online (Sandbox Code Playgroud) 我有两个Java应用程序(app1,app2)。两个应用程序都将JedisCluster客户端用于Redis集群。app1从Redis集群写入或读取数据。app2就像一个调度程序,仅将一些数据写入Redis集群。它在固定的时间间隔后运行。我必须确保当app2执行写操作时,直到app2完成整个写操作后,才为app1提供数据或为之写数据。我想在app2运行时为app1锁定Redis集群。当时app1是否获得异常无关紧要。
我正在寻找适用于多台机器的锁定机制的建议。就我而言,我基本上只希望能够在2台计算机上启动服务,并阻塞一个直到另一个完成,这是确保在服务计算机出现故障时确保冗余的一种简单方法。
类似于分布式锁服务,但专门寻找人们已成功与.NET集成的项目。
Hazelcast锁定(例如http://www.hazelcast.com/docs/1.9.4/manual/multi_html/ch02s07.html),据我所知,它的行为方式与Java并发原语相同,但在整个群集中.这使得可以用于在本地进程中的线程之间以及在集群之间进行同步.
但是,有什么办法可以选择退出这种行为吗?在我当前的项目中,我需要一种协调集群中资源的唯一所有权的方法,但是想要从我的应用程序中的多个点获取并释放这种所有权 - 我是否可以通过某种方式执行此操作,而不涉及将线程专用于管理这锁定在我的过程中?
为了
Hazelcast.getLock(Object key)
Run Code Online (Sandbox Code Playgroud)
方法,什么是预期/可接受的关键对象?例如,是否可以使用String从集群中的不同节点引用此锁?或者它必须是某种分布式对象?
是完全精确的,并呼叫Hazelcast.getLock("myLock")中,当从两个不同的集群成员调用,是指相同的分布式锁?