在 Zookeeper 中,我们如何处理从前一个手表的回调和重置新手表之间的“丢失数据更改”事件。我正在尝试查看许多可用的解决方案,例如 Apache curator 和互联网上的其他建议。但我仍然不清楚。
我们如何确保我们不会错过任何事件,或者是否有任何其他万无一失的方法来确保我们不会错过 zookeeper 中的任何状态更改(尤其是节点数据更改)?我知道定期投票是一种方式。但这很昂贵。
在 Zookeeper 中,我们如何处理从前一个手表的回调和重置新手表之间的“丢失数据更改”事件。我正在尝试查看许多可用的解决方案,例如 Apache curator 和互联网上的其他建议。但我仍然不清楚。
我们如何确保我们不会错过任何事件,或者是否有任何其他万无一失的方法来确保我们不会错过 zookeeper 中的任何状态更改(尤其是节点数据更改)?我知道定期投票是一种方式。但这很昂贵。
首先,我不推荐使用 Apache Curator。它有一些很棒的包装器,使事情变得超级方便和更健壮。它处理了很多你可能不得不自己编写代码的东西(以及难以正确编写的东西)。
其次,请参阅策展人文档中的此技术说明:
https://cwiki.apache.org/confluence/display/CURATOR/TN1
这里的主要内容是,您为响应监视通知而编写的任何代码都应尽快返回,并且永远不应阻塞(在 i/o 上或等待来自后续 zk 请求的响应等)。
因此,我建议您 (1) 生成一个线程来处理手表启动的代码,以及 (2) 就像在任何分布式/并发场景中一样,将数据验证为该新线程中的代码所做的第一件事. 它有一些开销,但它比轮询更好。
定期轮询永远不应该与 zookeeper 一起玩——这就是手表的用途。您知道何时检查数据是否已更改。您检查数据监视何时准确触发以捕获您关注的后续更新类型。
我认为没有办法永远不会错过更新/事件。
但是,由于接收到 WatchedEvent 对象,客户端代码必须读取最新的值。它不通过事件对象传递。这样做时,将传递一个新的或相同的 Watcher 实例,并通过读取方法调用注册未来的事件通知。这意味着您的客户端将始终获得最新值,并且如果在此方法调用后发生任何更改,将触发一个新事件。
因此,尽管在接收事件和检索最新和最大值的操作之间可能会丢失事件,但您的客户端仍将获得最新值。他永远不会得到最新的价值。中间的更改或值通常是不感兴趣的,如果它们感兴趣,那么您可能应该跳过 ZooKeeper 并寻找另一种通信机制。
大规模免责声明:我对 ZooKeeper 完全陌生,这个答案仅反映通过阅读和谷歌搜索获得的知识。哪一种解释了为什么我不敢在这个答案中添加示例代码。哈哈。