【问题标题】:Can I recursively create a path in Zookeeper?我可以在 Zookeeper 中递归创建路径吗?
【发布时间】:2023-03-08 15:02:01
【问题描述】:

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

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

然后我收到了NoNodeException 的麻烦。

在对此进行反思并查看文档(例如文档)之后,我一直无法找到一种方法来执行与 mkdir -p 等效的操作,ZooKeeper 将为我创建缺少的父节点。

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

【问题讨论】:

  • 在哪里可以找到 ZOO_OPEN_ACL_UNSAFE?

标签: python apache-zookeeper


【解决方案1】:

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

【讨论】:

  • 到目前为止,我发现的 Zookeeper 的唯一 Python 接口是 Zookeeper 树中的那个(这只是核心 API 的基本绑定),所以我想我会编写自己的便利方法。 :) 谢谢!
【解决方案2】:

如果您发出单独的 create(),当您执行到一半时,您可能会被打断或失败。要使调用原子化,您可以使用新的multi() API。见this answer

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

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

【讨论】:

    【解决方案3】:

    Kazoo has an ensure_path(path) operation,虽然它不被认为是原子的。使用它至少可以省去您为递归创建编写自己的代码的需要。

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 1970-01-01
      • 2015-09-04
      • 2021-10-28
      • 1970-01-01
      • 2011-06-21
      • 2012-02-17
      • 2010-10-30
      • 1970-01-01
      相关资源
      最近更新 更多