我可以在Zookeeper中递归创建路径吗?
我在一个项目中使用ZooKeeper来管理并发,首先我尝试了一些对我来说很明显的事情(使用zkpython绑定):
zh = zookeeper.init('localhost:2181')
zookeeper.create(zh, '/path/to/a/node', '', [ZOO_OPEN_ACL_UNSAFE])
结果我遇到了一个叫NoNodeException
的错误。
经过反思和查看文档(虽然文档不太完善),我发现找不到一种方法可以像在命令行中使用mkdir -p
那样,让ZooKeeper为我自动创建缺失的父节点。
我是不是漏掉了什么,还是说我只能一个一个地创建路径中的每个部分,不管我愿不愿意?
3 个回答
Kazoo有一个叫做ensure_path(path)
的操作,虽然它不是完全原子的(也就是说,它可能在某些情况下不是百分之百可靠)。使用这个功能,至少可以省去你自己写递归创建代码的麻烦。
如果你一个一个地调用create(),在执行到一半的时候可能会被打断或者失败。为了让这个过程更稳妥,你可以使用新的 multi() API。具体可以参考 这个回答。
如果你要创建的路径或者其中的一部分可能已经存在,那么在每次create()完成后再进行下一次调用会显得很慢。在这种情况下,你可以使用异步API来加快这个过程。详细信息可以查看 这个回答。
如果你只是想减少额外的调用,可以使用 Netflix的curator库,它有一个 creatingParentsIfNeeded
方法,但要注意,这可能会比较慢。更多信息请看 这个回答。
你遇到的问题是,每个路径的元素都需要单独调用 create() 方法。Zookeeper 只支持原子操作,也就是说,要么操作成功,要么完全不执行。递归创建路径就不是一个原子操作了。如果在创建路径的一半时操作卡住了,Zookeeper 就不知道你到底想要它做什么了。
我不确定在 Python 中是否已经有 Zookeeper 的辅助库。不过在 Java 中有一个叫 zkClient 的库,可以通过多次调用 create() 方法来创建递归路径。