在ZooKeeper中,所有的读操作(getData,getChildren和exists)都可以设置监听。监听在某些场景下是非常有用的,当你关注某些数据的变化时,如果没有监听,你就只能不断的轮询查看数据是否发生了改变,而监听则可以避免轮询带来的开销。
设置监听
ZooKeeper的监听事件仅触发一次,监听事件异步通知客户端,并支持多种监听方式。
- 仅触发一次
当数据改变时,一个监听事件被发送到客户端,并取消监听,除非客户端再次设置监听,否则不再监听。
如果你调用了getData(“/znode1”, true)方法,第二个参数true表示设置监听,后续如果/znode1发生了改变或删除,客户端将收到监听消息。而如果/znode1再次发生改变,除非客户端执行了另一个设置监听的get操作,否则不会再收到监听消息。
应用使用ZooKeeper的监听功能的通常方式为:
1. 客户端对特定对象设置监听;
2. 特定对象发生变化,服务端发送监听消息到客户端,并取消监听;
3. 客户端收到监听消息,发起查询,并根据需要决定是否再次监听。
ZooKeeper保证查询和监听是一个原子操作,客户端查询数据之后的所有数据变化都能收到监听。 - 发送到客户端
要求操作必须成功返回到发起操作的客户端后,才能发送通知消息。监听被异步发送给监听者。ZooKeeper提供了顺序的保证:一个设置了监听的客户端在收到监听事件之前不会看到数据变化。 - 监听方式
这涉及到数据改变的不同方式,ZooKeeper服务端维护了两个监听队列:数据监听队