【问题标题】:Zookeeper Watches Missed EventsZookeeper 监视错过的事件
【发布时间】:2019-05-27 10:59:32
【问题描述】:

在 Zookeeper 中,我们如何在接收到前一个手表的回调和重置新手表之间处理“丢失数据更改”事件。我正在尝试查看许多可用的解决方案,例如 Apache curator 和互联网上的其他建议。但我仍然不清楚。

我们如何确保我们不会错过任何事件,或者是否有任何其他万无一失的方法来确保我们不会错过 zookeeper 中的任何状态更改(尤其是节点数据更改)? 我知道定期投票是一种方式。但这很昂贵。

【问题讨论】:

  • 我同意“我认为没有办法永远不会错过更新/事件”。通过 DUBBO 存在 watch 事件丢失。

标签: apache-zookeeper apache-curator


【解决方案1】:

首先,我不推荐使用 Apache Curator。它有一些很棒的包装器,可以让事情变得超级方便和更健壮。它处理了很多您可能不得不自己编写代码的东西(以及难以正确编写的东西)。

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

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

这里的主要内容是,您为响应监视通知而编写的任何代码都应尽快返回,并且永远不应阻塞(在 i/o 或等待来自后续 zk 请求的响应等)。

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

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

【讨论】:

  • 感谢马修的宝贵建议。甚至我也倾向于使用策展人!。
【解决方案2】:

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

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

因此,尽管在接收事件和检索最新和最大值的操作之间可能会丢失事件,但您的客户端仍将获得最新值。他永远不会得到最新的值。中间的更改或值通常是不感兴趣的,如果它们感兴趣,那么您可能应该跳过 ZooKeeper 并寻找另一种通信机制。

大量免责声明:我对 ZooKeeper 完全陌生,这个答案仅反映通过阅读和谷歌搜索获得的知识。哪一种解释了为什么我不敢在这个答案中添加示例代码。哈哈。

【讨论】:

    猜你喜欢
    • 2016-12-12
    • 2013-12-02
    • 1970-01-01
    • 2012-08-19
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多