Zookeeper 为什么要让 Watches 成为一次性触发器?

Why does Zookeeper make Watches one time triggers?

Zookeeper的Watches是一次性触发的;如果我收到手表事件并且我想收到未来更改的通知,我必须设置另一个手表。

有一些缺点:

1) 这让我的代码变得复杂

2) 获取事件和发送新请求以获取手表之间存在延迟,可能会遗漏一些更改!

Zookeeper 为什么要让 Watches 成为一次性触发器?

你可以看到 [ZOOKEEPER-153][1] https://issues.apache.org/jira/browse/ZOOKEEPER-153

实际上,与一次性手表相比,这种永久性手表并没有提供任何额外的好处。具体来说,watch事件中并没有包含数据,所以客户端还是需要做一个查询操作来获取一个change对应的数据;即使这样,znode 也可以在接收到事件之后和客户端发送查询操作之前再次更改。甚至可以使用一次监视并检查 znode 的 stat 结构中的 mzxid 来找到 znode 的更改次数。并且客户端仍然会错过客户端切换 ZooKeeper 服务器时发生的事件。