1. watch概述
ZooKeeper可以为所有的读操作设置watch,这些读操作包括:exists()、getChildren()及getData()。
watch事件是一次性的触发器,当watch的对象状态发生改变时,将会触发此对象上watch所对应的事件。
watch事件将被异步地发送给客户端,并且ZooKeeper为watch机制提供了有序的一致性保证。
理论上,客户端接收watch事件的时间要快于其看到watch对象状态变化的时间。
2. watch类型
ZooKeeper所管理的watch可以分为两类:
- 数据watch(data watches):getData和exists负责设置数据watch;
- 孩子watch(child watches):getChildren负责设置孩子watch;
可以通过操作返回的数据来设置不同的watch:
- getData和exists:返回关于节点的数据信息;
- getChildren:返回孩子列表;
因此:
- 一个成功的setData操作将触发Znode的数据watch;
- 一个成功的create操作将触发Znode的数据watch以及孩子watch;
- 一个成功的delete操作将触发Znode的数据watch以及孩子watch;
3.watch注册与触发

- exists操作上的watch,在被监视的Znode创建、删除或数据更新时被触发。
- getData操作上的watch,在被监视的Znode删除或数据更新时被触发。在被创建时不能被触发,因为只有Znode一定存在,getData操作才会成功。
- getChildren操作上的watch,在被监视的Znode的子节点创建或删除,或是这个Znode自身被删除时被触发。可以通过查看watch事件类型来区分是Znode,还是他的子节点被删除:NodeDelete表示Znode被删除,NodeDeletedChanged表示子节点被删除。
watch由客户端所连接的ZooKeeper服务器在本地维护,因此watch可以非常容易地设置、管理和分派。当客户端连接到一个新的服务器 时,任何的会话事件都将可能触发watch。另外,当从服务器断开连接的时候,watch将不会被接收。但是,当一个客户端重新建立连接的时候,任何先前注册过的watch都会被重新注册。
4.注意事项
Zookeeper的watch实际上要处理两类事件:
- 连接状态事件(type=None, path=null):这类事件不需要注册,也不需要我们连续触发,我们只要处理就行了。
- 节点事件:节点的建立,删除,数据的修改。它是one time trigger,我们需要不停的注册触发,还可能发生事件丢失的情况。
上面2类事件都在watch中处理,也就是重载的process(Event event)
节点事件的触发,通过函数exists,getData或getChildren来处理这类函数,有双重作用:1.注册触发事件;2.函数本身的功能。
函数的本身的功能又可以用异步的回调函数来实现,重载processResult()过程中处理函数本身的的功能。
网友评论