我可以在Zookeeper中递归创建路径吗?

4 投票
3 回答
11354 浏览
提问于 2025-04-16 01:53

我在一个项目中使用ZooKeeper来管理并发,首先我尝试了一些对我来说很明显的事情(使用zkpython绑定):

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

结果我遇到了一个叫NoNodeException的错误。

经过反思和查看文档(虽然文档不太完善),我发现找不到一种方法可以像在命令行中使用mkdir -p那样,让ZooKeeper为我自动创建缺失的父节点。

我是不是漏掉了什么,还是说我只能一个一个地创建路径中的每个部分,不管我愿不愿意?

3 个回答

0

Kazoo有一个叫做ensure_path(path)的操作,虽然它不是完全原子的(也就是说,它可能在某些情况下不是百分之百可靠)。使用这个功能,至少可以省去你自己写递归创建代码的麻烦。

3

如果你一个一个地调用create(),在执行到一半的时候可能会被打断或者失败。为了让这个过程更稳妥,你可以使用新的 multi() API。具体可以参考 这个回答

如果你要创建的路径或者其中的一部分可能已经存在,那么在每次create()完成后再进行下一次调用会显得很慢。在这种情况下,你可以使用异步API来加快这个过程。详细信息可以查看 这个回答

如果你只是想减少额外的调用,可以使用 Netflix的curator库,它有一个 creatingParentsIfNeeded 方法,但要注意,这可能会比较慢。更多信息请看 这个回答

9

你遇到的问题是,每个路径的元素都需要单独调用 create() 方法。Zookeeper 只支持原子操作,也就是说,要么操作成功,要么完全不执行。递归创建路径就不是一个原子操作了。如果在创建路径的一半时操作卡住了,Zookeeper 就不知道你到底想要它做什么了。

我不确定在 Python 中是否已经有 Zookeeper 的辅助库。不过在 Java 中有一个叫 zkClient 的库,可以通过多次调用 create() 方法来创建递归路径。

撰写回答