当前位置: 首页 > 知识库问答 >
问题:

有没有办法在动物园管理员中添加守望者队列?

罗俭
2023-03-14

我使用node zookeeper client for html" target="_blank">java脚本作为zookeeper客户端。

我有这样的想法:

const setWatch = (path, functionToExecuteOnTrigger) => {
  client.getData(path, (event) => {
      // watcher set here
      functionToExecuteOnTrigger(event);
  }, null)
  // null because we are only setting watch here and do not need data
}

这个函数会在zoomaster中的一个路径处设置一个watch,一旦触发了watch,就会调用Watcher回调,并调用一个要在watch上调用的合适函数。

对于这样设置的手表:

setWatch('/data1', function1);
setWatch('/data2', function2);

因此,对于在data1节点中触发的监视,函数1被执行;对于在data2节点中触发的监视,函数2被执行

现在,如果我必须不断地在节点上保持监视,以便每次发生变化时,我将不得不在它们被触发后立即重新注册监视:

const setWatch = (path, functionToExecuteOnTrigger) => {
  client.getData(path, (event) => {
      // watcher set here
      // immediately set another watch for the same function
      setWatch(path, functionToExecuteOnTrigger);
      functionToExecuteOnTrigger(event);
  }, null)
  // null because we are only setting watch here and do not need data
}

现在我对zookeeper手表的了解是:

  • 手表有三种类型;数据、子项和存在
  • 观察者是一次性触发器,即一旦触发,就必须重新注册以获得进一步的触发器

由于上面提到的第二点,在触发手表和重新注册手表之间可能会发生丢失更改的情况。正如动物园管理员的官方文件所述。

所以我想知道是否有一种方法,我们可以为同一个节点设置多个表(以队列的方式),并且每次触发一个表时,只调用一个触发器回调。比如:

setWatch(node, functionToTrigger, noOfWatchesInQueue)

所以我们将为同一个节点和触发器设置多个手表,只有一个设置的手表被触发。因此,如果我为同一个节点设置了3个手表

对于触发器1,watch 1被激活
对于触发器2,watch 2等等。。。

这样,在重新注册手表所需的时间内,不会错过任何活动。

有没有办法得到这个??我不知道这是否已经在某个地方完成了,任何关于这个问题的研究材料或实施方案都会很有帮助。

共有2个答案

漆雕彦
2023-03-14

我认为你应该始终做到以下几点:

>

  • 为znode设置手表

    检索znode的实际值

    通过这种方式,您将始终知道znode的最新版本,并将在将来发生更改时收到通知。还要注意,每个znode都有版本号——您可以轻松检查它是否已更改。

  • 赫连骏
    2023-03-14

    在Zookeeper中,无法通过一次操作在同一节点上设置多个手表。这是故意的。

    正如您所提到的,(根据留档)当您读取节点的值时,您只能设置一个手表。这样,您将始终拥有一个节点的最新值,并在它更改时得到通知。这就是ZK提供的,而不是更多。

    Zookeeper手表不是事件队列,也不能保证你会收到每一个事件。

    我认为最好描述一下你的用例,并试着得到一个答案,什么是完成它的最佳工具,因为ZK可能不合适。

     类似资料:
    • 分布式 Apache HBase 安装依赖于正在运行的 ZooKeeper 集群。所有参与节点和客户端都需要能够访问正在运行的 ZooKeeper 集合。 Apache HBase 默认为您管理 ZooKeeper“集群”。它将启动和停止 ZooKeeper 集合作为 HBase 启动/停止过程的一部分。您还可以独立于 HBase 管理 ZooKeeper 集合,只需将 HBase 指向它应该使用

    • 我已经设置了一个带有SASL SCRAM安全性的Kafka集群,它运行良好。 根据文档,我使用了命令< code>kafka-configs.sh来创建用户名和密码,并授予该用户对主题的访问权限。 这也很棒。 但是, 命令本身不需要任何类型的身份验证,因此在我看来,任何人都可以运行该命令并在Kafka中创建自己的用户并授予自己的权限。 也许我需要在Zookeeper上启用SASL安全性?但我找不到

    • 注意:这将只显示有关使用Java消费者API的消费者(非基于ZooKeeper的消费者)的信息。 此工具还适用于基于ZooKeeper的使用者: bin/kafka-consumer-groups.sh--zookeeper localhost:2181--description--group my-group null PS:这似乎没有出现在2.5文档中

    • 我正在为Storm开发代码,这是开发人员的一个示例。我的问题是,当您从IDE Eclipse运行此代码时,不会建立Storm和ZooKeer之间的连接。ZooKeer在2181中运行,也设置在storm.yaml. 我的例外是: 有什么想法或程序要执行吗?是否从配置代码中传递?和我一样?

    • 假设我有 3 台 Kafka 服务器。服务器 1 zoopkeeper1 服务器 2 zoopkeeper2 服务器 3 zoopkeeper3 在集群配置中,zoopkeepers 会发生什么?它们是为每个服务器单独维护的,还是会在群集配置中同步其数据?

    • 在Zookeeper和代理身份验证上启用SASL时,我面临以下错误。 以下配置在JAAS文件中给出,该文件作为KAFKA_OPTS传递,将其作为JVM参数:- Kafka经纪人的服务器。属性设置了以下额外字段:- Zookeeper属性如下所示: