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

2024-05-13 16:45:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

因为我的麻烦,我回来了。

在考虑了这个问题并查看了文档(比如它们)之后,我找不到一种方法来做类似于mkdir -p的事情,ZooKeeper将为我创建缺少的父节点。

是我遗漏了什么,还是我只是为路径的每个部分分别发出create()s,不管我喜欢与否?


Tags: topath项目nodelocalhostinitcreateopen
3条回答

您必须为路径的每个元素分别发出create()s。Zookeeper只有内置的原子操作。递归地创建路径不再是一个原子操作。Zookeeper无法知道,如果在创建了一半路径元素后操作挂起,您希望它做什么。 我不知道,python中是否已经有一个Zookeeper助手库。java中有一个(zkClient)允许您通过多次调用create()来创建递归路径。

Kazoo has an ^{} operation,虽然它不是原子的。使用它至少可以省去编写自己的递归创建代码的需要。

如果发出单独的create()s,则在完成一半时可能会被中断或失败。要使调用成为原子调用,可以使用新的multi() API。见this answer

如果路径或其一部分可能已经存在,那么在发出下一个之前等待每个create()完成将不必要地缓慢。在这种情况下,可以使用异步API来加快进程。见this answer

如果您只是想避免额外的调用,可以使用Netflix's curator库,它有一个creatingParentsIfNeeded方法,但要注意它可能会很慢。见this answer

相关问题 更多 >