node.js - 有没有办法在 zookeeper 中添加观察者队列?

标签 node.js apache-zookeeper

我正在使用 node-zookeeper-client用于 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
}

此函数将在 zookeeper 中的 path 处设置一个 watch。触发 watch 后,将调用观察者回调并调用要在 watch 上调用的适当函数。

对于这样设置的 watch :

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

所以function1在data1 Node 触发的watch执行,function2在data2 Node 触发的watch执行

现在,如果我必须持续监视 Node ,以便每次发生更改时,我都必须在触发后立即重新注册监视:

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 watches 的了解是:

  • 有 3 种类型的 watch ;数据、 child 和存在
  • 观察者是一次性触发器,即一旦它们被触发,一个人必须重新注册它们以获得进一步的触发器。

因为上面提到的第2点, watch 触发和重新注册 watch 之间的变化有可能会丢失。在zookeeper的官方文档中有提到。

所以我想知道是否有一种方法可以让我们为同一个 Node 设置多个监视(以队列的方式)并且每次触发一个监视时,只调用一个触发器回调。像这样:

setWatch(node, functionToTrigger, noOfWatchesInQueue)

所以我们将为同一个 Node 和触发器设置多个监视,只有一个设置的监视被触发。因此,如果我为同一 Node 在队列中设置 3 个 watch ,即

对于trigger 1,watch1被激活
对于触发 2,观看 2 等等......

这样,在重新注册 watch 期间不会错过任何事件。

有没有办法得到这个??我不知道这是否已经在某处完成,关于该问题的任何类型的研究 Material 或实现也会有所帮助。

最佳答案

在 Zookeeper 中无法通过单个操作在同一 Node 上设置多个 watch 。这是设计使然。

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

Zookeeper 监视不是事件队列,不能保证您会收到每个事件。

我认为最好描述您的用例并尝试找到实现它的最佳工具的答案,因为 ZK 可能不合适。

关于node.js - 有没有办法在 zookeeper 中添加观察者队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47924402/

相关文章:

javascript - 失败后重新启动 Promise

使用文件系统层次结构创建树的 Java 方法

javascript - Node.js - 阻止用户打开包含数据库详细信息的 .js 文件?

node.js - node_redis(npm redis模块)支持redis集群模式还是必须使用ioredis?

apache-kafka - 无法停止kafka服务器和zookeeper

java - 无法启动 Zookeeper 服务器。没有jdk目录

java - 如何监控 Kafka 消息的应用程序处理以进行负载测试

java - Apache Storm - Spout/Bolt 因高延迟而崩溃

node.js - 如何使用 mocha 和 chai 正确测试 Promise?

node.js - 通过 SSL 的 WebSocket : Cloudflare