Zookeeper监视错过的事件

时间:2014-12-13 05:26:40

标签: apache-zookeeper apache-curator

在Zookeeper中,我们如何处理从上一个手表接收回叫和重置新手表之间的“数据更改丢失”事件。我试着看看许多解决方案,如Apache策展人和互联网上的其他建议。但我还不清楚。

我们如何确保我们不会错过任何事件,或者是否有任何其他简单的方法来确保我们不会错过zookeeper中的任何状态更改(尤其是节点数据更改)? 我理解定期轮询是一种方式。但这很昂贵。

2 个答案:

答案 0 :(得分:2)

首先,我不建议使用Apache Curator。它有一些很好的包装,使事物超级方便,更健壮。它处理了许多您可能需要自己编写代码的东西(以及难以正确编写的东西)。

其次,请参阅策展人文档中的此技术说明:

https://cwiki.apache.org/confluence/display/CURATOR/TN1

这里的主要内容是,您为响应观看通知而编写的任何代码应尽快返回,并且绝不应阻止(在i / o上或等待后续zk请求的响应,& c)。 / p>

因此,我建议您(1)生成一个线程来处理手表启动的代码,(2)就像在任何分布式/并发场景中一样,将数据验证为编码的第一个内容之一新线程呢。它有一些开销,但它比轮询更好。

定期轮询永远不应该与zookeeper一起使用 - 这就是手表的用途。您知道何时检查数据是否已更改。您可以检查数据监视何时触发,以捕获您关注的后续更新类型。

答案 1 :(得分:0)

我认为没有办法永远不会错过更新/事件。

但是,由于接收到WatchedEvent对象,因此客户端代码必须读取最新值。它不会通过事件对象传递。在执行此操作时,将通过读取方法调用注册新的或相同的Watcher实例,以注册将来的事件通知。这意味着您的客户端将始终获得最新的值,并且如果在此方法调用之后发生任何更改,则将触发一个新事件。

因此,尽管在事件接收到获取最新和最大价值的操作之间可能会错过事件,但是您的客户仍将获得最新价值。他将永远不会获得最新的价值。一般来说,之间的更改或值不重要,如果有必要,则您可能应该跳过ZooKeeper并寻找其他通信机制。

大量免责声明:我是ZooKeeper的新手,这个答案仅反映了通过阅读和谷歌搜索获得的知识。哪种解释可以解释为什么我不敢在此答案中添加示例代码。大声笑。