如何在重新连接到 Zookeeper 后识别添加和修改的 children?

How to identify added and modified children after reconnecting to Zookeeper?

我们使用 Zookeeper 来协调集群服务器之间的任务执行。我们的一位客户的网络非常不稳定,我们的服务器不断断开连接并重新连接到 Zookeeper。

问题是在断开连接时,我们的服务器会错过发生的事件,即使在 re-connecting 再次发送到 Zookeeper 后也不会处理它们。

目前我的提议是:

  1. 我们会记录上次连接到 Zookeeper 的时间。那是在我们断开连接之前。
  2. 再次在 re-connecting 上,我们要求侦听器 clearAndRefresh 为所有 child 节点触发 CHILD_ADDED 事件监控路径。
  3. 在处理这些 CHILD_ADDED 事件时,我们只处理了上次连接到 Zookeeper 后创建或修改的路径。

我不认为使用时间戳是个好主意。相反,您可以使用 Curator 的内置:

无论你使用哪一个都没有关系,都支持监听 ChildAddedDataChanged 事件,它们将完全满足你的需要。当您在断开连接后重新连接时,Curator 将在内部评估新添加的 children 并比较现有 children 的数据以确定更改。对你没有压力。您只需要使用提供的侦听器即可。

在准确性方面,TreeCache 不保证 100% 的准确性。所以,如果你可以 re-design 你最好改用 PathChildrenCache。