zookeeper-4 watcher

来源:互联网 发布:房产中介软件xiazaiba 编辑:程序博客网 时间:2024/06/08 16:13

zookeeper实现了分布式数据的发布订阅功能, 当一个主题对象发生变更时, 会通知给所有的订阅者, 使订阅者做出相应的处理.

zookeeper发布订阅功能的实现是依靠watcher机制来实现的.简单来说, 客户端向服务器注册watcher, 客户端存储watcher, 主体对象发生变化服务器向客户端发送通知, 客户端主动从服务端拉取数据并处理


1. watcher接口用来表示一个标准的事件处理器, 其中包括两个枚举类用来表示通知状态和事件类型, 此外还包括一个回调方法abstract public void process(WatchedEvent event);

该方法在主题对象改变时触发执行

其中WatchedEvent 类包括三个字段属性

final private KeeperState keeperState; 存储通知状态
final private EventType eventType; 存储事件类型

 private String path; 存储节点路径


watcherevent是一个可序列化的用于传输的类

客户端在收到服务端返回的watcherevent对象时间后将其还原为watchedevent事件对象, 然后传给process方法处理, process回调方法在解析这个时间对象后就能获取完整的服务端事件信息了.客户端无法直接从该事件中获取变化节点的数据变化, 而是需要客户端再次主动重新获取该节点的数据内容

2. 整个订阅发布过程概括为三个阶段:客户端注册watcher, 服务端处理watcher, 客户端回调process方法

3.客户端注册watcher

  1) 调用客户端API传入watcher对象

  2) 标记request, 封装watcher到watchregister

  3) 向服务端发送request

  4) 服务端相应成功, 将watcher放入zkwatchManager中管理

4. 服务端处理watcher

  1) serverCnxn是服务端的接口, 代表了一个客户端和服务端的连接, 当客户端的watcher对象传入到服务端时会把该对象中的数据放入到serverCnxn中, 最后把serverCnxn放入watchManage, 这个相当于是服务端的watcher管理者

  2) watcher触发: 当某节点数据或子节点变化时, 会触发triggerWatch方法,该方法会做三件事:

       a.根据该节点的变化类型, 封装成一个watchedEvent对象

       b.根据节点路径到watchManage中查找对应该节点注册过的watcher(服务端的watcher中保存有对应的客户端sessionId, 是由serverCnxn而来), 如果没有直接退出, 如果有调用process方法处理, 并将该watcher删除

        c. 服务端在回调process方法时做的只是将该watcher事件发送给所有注册过该事件的客户端

5.客户端回调process方法

  1) 客户端由SendThread.readResponse处理服务端的响应, 当响应头中包含XID=-1时, 表明其实通知类型相应

  2) 客户端会一次执行如下四个步骤



5. wacher机制的特性: 一次失效性, 客户端串行执行, 轻量级(来自服务端的wached事件通知不包括数据变化内容, 需要客户端再次主动去拉取)

6.客户端和服务端都维护着watcher, 如果被触发, 则客户端和服务端都会移除该watcher


原创粉丝点击