为什么我需要使用curator而不是zookeeper本机API作为分布式锁?

时间:2016-02-17 06:24:54

标签: apache-zookeeper apache-curator

我们的项目严重依赖于分布式锁定。我知道策展人提供了几种锁。我的问题是,我可以将创建节点用作互斥锁吗?

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例外。如果这不起作用,我想知道原因。

1 个答案:

答案 0 :(得分:0)

我认为第一个反对你提出建议的反对意见是,难以阅读/理解代码,将其与以下内容进行比较:

InterProcessSemaphoreMutex lock = new InterProcessSemaphoreMutex(client, path);
lock.acquire();

另一个原因是你通常使用锁来阻塞一个线程,直到另一个线程释放锁,这样你就可以编写如下代码:

//do normal work
...
lock.acquire();
//do critical single threaded work
...
lock.release();
//back to normal work
...

您的代码可以通过哪种方式实现,但这里是为您创建的。

使用已经实现的锁定而不是编写自己的锁定有很多理由,但它主要归结为:'为什么重新发明轮子?"