我将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手表的了解是:
由于上面提到的第二点,在手表触发和重新注册手表的时间段之间可能会遗漏变化。如zookeeper的官方文档中所述。
所以我想知道是否有一种方法可以实际为同一节点设置多个监视(以队列排序方式),并且每次触发监视时,只调用一个触发器回调。像这样:
setWatch(node, functionToTrigger, noOfWatchesInQueue)
因此,我们将为同一节点设置多个监视,对于触发器,只触发其中一个设置监视。因此,如果我为同一个节点设置3个队列,即
对于触发器1,watch1被激活
对于触发器2,观察2等等......
这样,在重新注册手表所用的时间内不会遗漏任何事件。
有没有办法获得这个?我不知道这是否已经在某个地方完成,任何关于这个问题的研究材料或实施都会有所帮助。
答案 0 :(得分:0)
Zookeeper无法通过单个操作在同一节点上设置多个监视。这是设计的。
正如您所提到的,(并且根据文档),当您读取节点的值时,您只能设置一个监视。这样,您将始终拥有节点的最新值,并在其发生更改时得到通知。这就是ZK所提供的,而不是更多。
Zookeeper监视不是事件队列,并且不保证您将收到每个单独的事件。
我认为最好描述一下你的用例,并试着找一个最好的工具来解决它,因为ZK可能不合适。
答案 1 :(得分:-1)
我认为你应该总是这样做:
设置监视znode
检索znode的实际值
通过这种方式,您将始终知道最新版本的znode,并会在将来更改时收到通知。 另请注意,每个znode都有版本号 - 您可以轻松检查它是否已更改。