我正在使用 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/