开始
这里不从代码的角度讲述watcher机制,直接通过抽象的文字进行描述,需要首先说明的是在zookeeper里面watcher本质上可以看做一个行为或者一个回调。
客户端
客户端这边会有一个map专门管理节点和watcher的映射,每当一个请求表示对某个节点的某个时间进行watch时会向该map添加这个映射,注意客户端并不会将watcher发送到服务端,发送到服务端的信息仅仅包含本身请求必须的内容和请求头等信息,同时还包含了请求中是否包含watcher,换句话说,客户端会告诉服务端我对某个时间表示关注。
服务端
服务端收到请求时会检查是否需要watcher,如果需要同样会创建一个map表示哪些客户端对当前节点的哪类信息表示关注,也可以理解为创建了watcher,每当一个节点发生变化时都会去map中查询是否有watcher,如果有则会一个个触发,即发送一个信息到客户端告知当前节点你关注的信息发生变化了,同时移除这些watcher。收到信息的客户端则根据节点去找到所有关注的watcher,并且执行wathcer,同时移除watcher。嗯,watch只有一次
最后
对于客户端来说,单线程轮询所有收到的变化信息,因此如果某个watcher执行的速度很慢可能会影响其他watcher的执行,这个要注意。
watcher得到的信息只是变化了这么一回事,因此如果需要知道什么变化了仍然需要发起请求去服务端查询。
从上面的过程可以看到,watcher机制不是一个阻塞等待的过程,也不需要额外创建tcp连接。