4

我将ZooKeeper拉到一个项目中进行一些并发管理,我尝试的第一件事对我来说是非常明显的(使用 zkpython 绑定):

zh = zookeeper.init('localhost:2181')
zookeeper.create(zh, '/path/to/a/node', '', [ZOO_OPEN_ACL_UNSAFE])

我拿回了NoNodeException我的麻烦。

在对此进行了反思并查看了文档(例如它们)之后,我一直无法找到一种方法来做相当于mkdir -pZooKeeper 将为我创建缺少的父节点的地方。

我是否遗漏了任何东西,或者我只是坚持为路径的每个部分发出单独的 create()s,无论我喜欢与否?

4

3 回答 3

9

您必须为路径的每个元素发出单独的 create()。Zookeeper 仅内置原子操作。递归创建路径不再是原子操作。如果在创建一半路径元素后操作挂起,Zookeeper 不知道你想要它做什么。我不知道,python 中是否已经有 Zookeeper 助手库。java (zkClient) 中有一个可以让您通过多次调用 create() 来创建递归路径。

于 2010-07-27T07:21:32.327 回答
2

如果您发出单独的 create(),您可能会在进行到一半时被打断或失败。要使调用原子化,您可以使用新的multi() API。看到这个答案

如果路径或它的一部分可能已经存在,那么在发出下一个之前等待每个 create() 完成将不必要地缓慢。在这种情况下,您可以使用异步 API 来加快处理速度。看到这个答案

如果你只是想避免额外的调用,你可以使用Netflix 的 curator库,它有一个creatingParentsIfNeeded方法,但请注意它可能会很慢。看到这个答案

于 2012-05-22T16:27:20.367 回答
0

Kazoo 有一个ensure_path(path)operation,尽管它不被认为是原子的。使用它至少可以节省您为递归创建编写自己的代码的需要。

于 2014-02-25T17:18:52.527 回答