ZooKeeper 提供了一种针对Znode的订阅/通知机制,也就是当Znode节点状态发生变化时或者Zookeeper 客户端连接状态发生变化时,会触发事件通知。这个机制在服务注册于发现中,针对服务调用者及时感知到服务提供者的变化提供了非常好的解决方案。
在Zookeeper提供的Java API 中,提供了三中机制来针对Znode进行注册监听,分别是:
- getData(),用于获取指定节点的value信息,并且可以注册监听,当监听的节点进行创建、修改、删除操作时,会触发相应的时间通知。
- getChildren(),用于获取指点节点的所有节点,并且允许注册监听,当监听节点子节点进行创建、修改、删除操作时,会触发相应得事件通知。
- exists(),用于判断指定节点是否存在,,同样可以注册指定节点得监听,监听得时间类型和getData()相同。
Watcher 事件得触发都是一次性得,比如客户端通过getData('/node',true)注册监听,如果/node节点发生数据修改,,那么该客户端会收到一个修改时间通知,但是/node再次发生改变时,客户端无法收到Watcher事件,为了解决这个问题,客户端必须再收到得事件回调中再次注册事件。