有没有办法在zookeeper中添加观察者队列?

时间:2017-12-21 11:51:19

标签: 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处。触发手表后,将调用观察者回调并调用手表上要调用的相应功能。

对于这样设置的手表:

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

因此,data1节点触发的监视执行function1,data2节点触发的监视执行function2

现在,如果我必须不断监视节点,以便每次更改某些内容,我都必须在触发后立即重新注册:

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

  • 手表有3种类型;数据,儿童和存在
  • 观察者是一次触发,即一旦触发,一个必须重新注册它们以获得进一步的触发。

由于上面提到的第二点,在手表触发和重新注册手表的时间段之间可能会遗漏变化。如zookeeper的官方文档中所述。

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

setWatch(node, functionToTrigger, noOfWatchesInQueue)

因此,我们将为同一节点设置多个监视,对于触发器,只触发其中一个设置监视。因此,如果我为同一个节点设置3个队列,即

对于触发器1,watch1被激活
对于触发器2,观察2等等......

这样,在重新注册手表所用的时间内不会遗漏任何事件。

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

2 个答案:

答案 0 :(得分:0)

Zookeeper无法通过单个操作在同一节点上设置多个监视。这是设计的。

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

Zookeeper监视不是事件队列,并且不保证您将收到每个单独的事件。

我认为最好描述一下你的用例,并试着找一个最好的工具来解决它,因为ZK可能不合适。

答案 1 :(得分:-1)

我认为你应该总是这样做:

  1. 设置监视znode

  2. 检索znode的实际值

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