为什么我需要使用 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
...

这完全可以通过您的代码实现,但这里是为您创建的。


使用已经实现的锁而不是编写自己的锁的原因有很多,但主要归结为:“为什么要重新发明轮子?”