为什么我需要使用 curator 而不是 zookeeper native API 作为分布式锁?
Why do I need to use curator but not zookeeper native API as distributed lock?
我们的项目严重依赖分布式锁。我知道馆长提供了几种锁。我的问题是,我可以只将创建节点用作互斥体吗?
CuratorFramework zkClient = zookeeperConnectionProvider.getZkClientForJobDistributeLock();
try {
zkClient.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.EPHEMERAL)
.forPath("/" + job.getIdentifier().jobNodeString());
LOGGER.info(String.format("create node in zookeeper [%s]", job.getIdentifier().jobNodeString()));
} catch (Exception e) {
LOGGER.info(String.format("create job instance node in zookeeper failed [%s], reason [%s]",
job.getIdentifier().jobNodeString(),
e.getClass().getCanonicalName()));
return NO_WORK;
}
当第一个进程创建成功后,第二个进程获取
NodeExistsException
异常。如果这行不通,我想知道原因。
我认为第一个反对按你的提议做的反对意见是很难 read/understand 代码,将它与:
进行比较
InterProcessSemaphoreMutex lock = new InterProcessSemaphoreMutex(client, path);
lock.acquire();
另一个原因是您通常使用锁来阻塞线程直到另一个线程释放锁,因此您可以编写如下代码:
//do normal work
...
lock.acquire();
//do critical single threaded work
...
lock.release();
//back to normal work
...
这完全可以通过您的代码实现,但这里是为您创建的。
使用已经实现的锁而不是编写自己的锁的原因有很多,但主要归结为:“为什么要重新发明轮子?”
我们的项目严重依赖分布式锁。我知道馆长提供了几种锁。我的问题是,我可以只将创建节点用作互斥体吗?
CuratorFramework zkClient = zookeeperConnectionProvider.getZkClientForJobDistributeLock();
try {
zkClient.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.EPHEMERAL)
.forPath("/" + job.getIdentifier().jobNodeString());
LOGGER.info(String.format("create node in zookeeper [%s]", job.getIdentifier().jobNodeString()));
} catch (Exception e) {
LOGGER.info(String.format("create job instance node in zookeeper failed [%s], reason [%s]",
job.getIdentifier().jobNodeString(),
e.getClass().getCanonicalName()));
return NO_WORK;
}
当第一个进程创建成功后,第二个进程获取
NodeExistsException
异常。如果这行不通,我想知道原因。
我认为第一个反对按你的提议做的反对意见是很难 read/understand 代码,将它与:
进行比较InterProcessSemaphoreMutex lock = new InterProcessSemaphoreMutex(client, path);
lock.acquire();
另一个原因是您通常使用锁来阻塞线程直到另一个线程释放锁,因此您可以编写如下代码:
//do normal work
...
lock.acquire();
//do critical single threaded work
...
lock.release();
//back to normal work
...
这完全可以通过您的代码实现,但这里是为您创建的。
使用已经实现的锁而不是编写自己的锁的原因有很多,但主要归结为:“为什么要重新发明轮子?”