




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Watcher详解、接口 在 ZooKeeper 中, 接口类 Watcher 用于表示一个标注你的事件处理器,其定义了事件通知相关的逻辑,包含 KeeperState 和 EventType 两个枚举类,分别代表了通知状态和事件类型,同时定义了事件的回调方法:process(WatchedEvent event)Watcher 触发条件: 增、删、改 ( 重复修改也会触发,因为他只告诉你变更了,不告诉你变更多少,需要 C 自己去拿)abstract public void process ( WatchedEvent event
2、 )。 process() 是 Watch 接口中的回调方法。当 ZooKeeper 向客户端发送一个 Watcher 时间通知时,客户端就会对相应的 process 方法进行回调,从而实现对事件的处理。 like this:syncNodes()方法。 Watcher 设置是开发中最常见的,需要搞清楚watcher的一些基本特征,对于exists、getdata、getchild对于节点的不同操作会收到不同的 watcher信息对父节点的变更以
3、及子节点的变更都不会触发watcher,而对watcher本身节点以及子节点的变更会触发watcher继续。ZooKeeper 使用 WatchedEvent 对象封装服务端事件并传递给 Watcher, 从而方便回调方法 process 对服务端事件进行处理。WatcherEvent 实体实现了序列化接口,因此可以用于网络传输。数据结构如下。Class WatcherEvent type:int state:int path:Stringstate=-112 会话超时状态state= -113认证失败状态state=
4、0;1 连接建立中state= 2 (暂时不清楚如何理解这个状态,ZOO_ASSOCIATING_STATE)state=3 连接已建立状态state= 999 无连接状态type=1 创建节点事件type=2 删除节点事件type=3 更改节点事件type=4 子节点列表变化事件type= -1 会话session事件type=-2 监控被移除事件Watcher 发送过程。 当服务端产生 WatchedEvent 事件之后,会调用 getWrapper 方法将自己包装成一个可序列化的 Watcher
5、Event 事件,以便于通过网络传输到客户端。客户端在接收到服务端的这个事件对象后,首先会将 WatcherEvent 事件还原成一个 WatchedEvent 事件。并传递给 process方法处理。 回调方法根据传入参数解析完整服务端事件。Watcher 发送的数据 无论是 WatcherEvent 还是 WatchedEvent,他对 ZooKeeper 服务端事件的封装都是极其简单的。 当 /Test/te
6、st1/1_1节点发生变更时,服务端会发送给客户端一个“ZNode数据变更“ 事件,客户端也只能接收到如下信息: KeeperState : SyncConnected EventType : NodeDataChanged Path : /zk-b 也就是说,客户端无法直接从该事件中获取到对应数据节点的原始数据内容,以及变更后的新数据内容。而是客户端再次主动去重新获取数据。这个也是 ZooKeeper 一个非常重要
7、的特性。Watcher 工作机制服务端发送不处理逻辑、客户端发送并处理逻辑。客户端注册 Watcher 创建一个 new ZooKeeper() 客户端对象实例时,可以传入一个 Watcher . new ZooKeeper(String connectString,int sessionTimeout, Watcher watcher)
8、 这个Watcher 将作为整个 ZooKeeper 回话期间的默认 Watcher,会一直被保存在客户端 ZKWatchManager 的 defaultWatcher 中。 另外,ZooKeeper 客户端也可以通过 getData、 getChildren 和 exist 三个接口来向 ZooKeeper 服务器注册 Watcher。 列举个getData 例: public byte getData(String path,
9、boolean watch, Stat stat) public byte getData(final String path,Watcher watch, Stat stat) 第一个通过一个 boolean 参数来标识是否使用默认 Watcher 进行注册,具体注册逻辑与第二个接口一致。注册 Watcher 后
10、 在 getData 接口注册 Watcher 后,客户端首先会对当前客户端请求 request 进行标记, 将其设置为 ”使用Watcher“监听。同时会封装一个 Watcher 的注册信息,WatchRegistration 对象。 用于暂时保存数据节点的路径 和 Watcher 的对应关系。Packet 与 WatchRegistration。 Packet 类 在 ZooKeeper 中 Packet 可以看做是一个最小的通信协议单元,用于进行客户端与服务端之间的网络传输,任何需要传输的对象都需要包
11、装成一个 Packet 对象。 因此,在 ClientCnxn 中 WatchRegistration 又会被封装到 Packet 中去, 然后放入发送队列中等待客户端发送。随后,ZooKeeper 客户端就会向服务端发送这个请求,同时等待请求的返回。完成请求发送后,会由客户端 SendThread 线程的 readResponse 方法负责接收来自服务端的相应, finishPacket 方法会从 Packet 中取出对象的 Watcher 并注册到 ZKWatchManager 中去。 WatchRegis
12、tration 封装到了 Packet 对象中去,但事实上,在底层的网络传输过程中,没有将 WatchRegistration 对象完全的序列化到底层字节数组中去。ZooKeeper 只会将 requestHeader 和 request 两个属性进行序列化。 也就是说,即使WatchRegistration 对象呗封装在了 Packet 中,但是并没有被序列化到底层字节数组中去。因此也就不会进行网络传输了。客户端 Watcher 的注册流程如下: 服务端注册 Watcher 服务端处理 Watcher 的序列图:1 Fi
13、nalRequest PcessRequest( ) 中会判断当前请求是否是需要注册 Watcher: 1) 如果 ZooKeeper 判断当前客户端需要进行 Watcher 注册,于是就会将当前的 ServerCnxn 对象和数据路径传入 getData 方法中去。 ServerCnxn 是一个 ZooKeeper 客户端和服务器之间的连接接口,代表了一个客户端和服务器的连接。我们可以 ServerCnxn 看做是一个 Watcher 对象。因为他实现了 Watcher 的 proce
14、ss 接口WatcherManager 是 ZooKeeper 服务端 Watcher 的管理者,其内部管理的 watchTable 和 watch2Paths 两个存储结构,分别从两个维度对 Watcher 进行存储。 1) watchTable 是从数据节点路径的粒度管理 Watcher。 2) watch2Paths 是从 Watcher 的粒度来控制事件触发的数据节点在服务端,DataTree 中会托管两个 Watch
15、Manager, 分别是 dataWatches (数据变更Watch) 和 childWatches(子节点变更Watch)。Watcher 触发逻辑 1 封装 WatchedEvent。 将通知状态 - KeeperState、事件类型 - EventType、节点路径 - Path 封装成一个 WatchedEvent 对象 2 查
16、询 Watcher。 根据路径从 watchTable 中取出对应的 Watcher。若无-没注册 直接退出。若有-注册过 将数据提取出来 同时 从wTable w2Paths 中删除掉。 Watcher 在服务端也是一次性的 3 调用 process 方法触发 Watcher ZooK
17、eeper 会把当前请求对应的 ServerCnxn 作为一个 Watcher 存储,因此调用 process 方法,事实上就是 ServerCnxn 对应的 process 方法。客户端回调 Watcher 1 反序列化 字节流转换成 WatcherEvent 对象 2 处理 chrootPath
18、0; 如果客户端设置了 chrootPath 属性,那么需要对服务器传过来的完整节点路径进行 chrootPath 处理,生成客户端的一个相对节点路径。 例如客户端 cPath路径 /Test/test1 那么针对服务端传过来的相应包含的节点路径为/Test/test1/1_19, 经过chrootPath 处理后 会变成一个相对路径:/ 1_19. 3 还原 WatchedEvent
19、0; WatcherEvent 转换成 WatchedEvent. 4 回调 Watcher。 最后将 WatcherEvent 对象交给 EventThread 线程,在下一个轮询周期中进行 Watcher 回调。EventThread 处理时间通知。&
20、#160; SendThread 接收到服务端的通知事件后,会通过调用 EventThread.queueEvent 方法将事件传给 EventThread 线程。queueEvent 方法首先会根据该通知事件,从 ZKWatchManager 中取出所有相关的 Watcher 客户端识别出 事件类型 EventType 后,会从相应的 Watcher 存储 (即3个注册方法)中去除对应的 Watcher。获取到相关的所有 Watcher 后,会将其放入 waitingEvents 这个队列去。
21、 注意 此处调用的是 remove 接口。 客户端的 Watcher 同样也是一次性的。即一旦被触发,该Watcher 就失效了。 3个注册方法: dataWatches、existWatcher 或 childWatcher 中的一个或多个 waitingEvents 是一个待处理 Watcher 的队列,EventThread 的 run 方法会不断对该队列进行处理Watcher 特性总结: 一次性 &
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 监测监控工考试试题问答题及答案
- 初中地理2024-2025春季学期七年级地理下册 日本(第1课时)教学设计(湘教版)
- 坑人的考试试题及答案
- 电工科目二三考试试题及答案
- 社工证书考试试题及答案
- 2025-2030中国盐酸左氧氟沙星片行业市场运行分析及竞争格局与投资发展研究报告
- 《学前儿童艺术教育与活动指导》电子教案-11 学前儿童美术教育评价
- 上海市华东政法大学附属中学2021-2022学年高一下学期期中历史 无答案
- 四川省合江县马街中学2023-2024学年高三上学期1月期末英语试题 含解析
- 2023届四川省攀枝花市东区攀枝花市三中高三校二模理综生物试题 含解析
- 蓄水池可行性方案
- 政务服务中心物业服务投标方案
- 小儿循环系统解剖生理特点
- 青岛海尔纳税筹划课程设计
- 小学动词三单练习
- 【葛根素的药理作用及临床应用调研报告3000字】
- 居民自建桩安装告知书回执
- 教师情绪和压力疏导
- 血管活性药物静脉输注护理团体解读
- 首件检查记录表
- 控制计划(中英文标准模板)
评论
0/150
提交评论