您的问题有点含糊不清。我假设您有 3 个独立的 Zookeeper 节点(独立或 3 个独立的集成),并且希望在所有 3 个 Zookeeper 节点中在/some/path 观看同一个 ZNode。
(如果您指的是具有 3 个节点的单个 ensemble,那么您不必担心节点,因为 ensemble 将保证 ensemble 中节点的一致性)
最简单的方法是使用Apache Curator 配方(参见recipes)、NodeCache。 Apache Curator 是一组配方和标准 ZookeeperClient 的扩展。它在内部管理所有边缘情况和连接状态,因此您不必担心纯 Zookeeper 客户端的困难。 NodeCache 可以监视给定的 ZNode(在给定的 ZPath 上)并通知该 ZNode 发生的变化。
请参阅 this answer 以了解如何初始化 CuratorFramework 实例。
您所要做的就是按照上述答案中的说明使用 3 个连接字符串(用于您的 3 个节点)初始化 3 个 CuratorFramework 实例,然后为每个客户端启动 NodeCache 对象。
CuratorFramework client1=//create CuratorFramework intance with corresponding connection string.
CuratorFramework client2=//create CuratorFramework intance with corresponding connection string.
CuratorFramework client3=//create CuratorFramework intance with corresponding connection string.
然后启动所有这些客户端,
client1.start();
client2.start();
client3.start();
最后,为每个 CuratorFramework 实例的 ZNode 创建并启动 NodeCache 实例。
NodeCache znode1=new NodeCache(client1, "/znode/path");
NodeCache znode2=new NodeCache(client2, "/znode/path");
NodeCache znode3=new NodeCache(client3, "/znode/path");
然后为每个节点缓存添加NodeCacheListener来订阅ZNode的变化。
znode1.getListenable().addListener({listener class implementing NodeCacheListener});
znode2.getListenable().addListener({listener class implementing NodeCacheListener});
znode3.getListenable().addListener({listener class implementing NodeCacheListener});
然后,启动它们。
znode1.start();
znode2.start();
znode3.start();
现在,您将通过您注册的侦听器收到任何更改。希望你明白了。