Zookeeper 提供的了分布式数据的公布/订阅功能,通过 Watch 机制来实现这样的分布式的通知功能。

Zookeeper 同意client向server注冊一个Watch监听。当服务端的一些指定的事件触发了这个Watch 。就会向指定的client发送一个事件通知来实现分布式通知。
整个Watch的注冊和通知过程如图:
Zookeeper的 Watcher 机制主要包含client现成、client WatchManager、Zookeeperserver三部分,详细流程是:client 向Zookeeper注冊的同一时候。把Watcher对象存储在client的WatchManager中,当Zookeeperserver端触发Watcher事件后,会向client发送通知。client线程从WatchManager中取出相应的Watcher对象运行回掉逻辑。
client注冊Watcher
可用在创建一个client实例时,向构造方法中传入一个默认的Watcher对象,也能够在调用 getData() , getChildren() , exist() 三个接口向 Zookeeper server注冊Watcher。不管使用哪种方式注冊。原理都是一致的。 这里已 getData接口说明:
public byte[] getData(final String path, Watcher watcher , Stat stat) 
在向 getData 接口注冊 Watcher 后。client首先会对当前client请求request 进行标记。将其置为“使用 Watcher监听”,同一时候会封装一个 Watcher 的注冊对象 WatcherRegistration 对象。用于临时保存数据节点路径和Watcher的相应关系。详细逻辑代码:
public Stat getData(final String path, Watcher watcher , Stat stat){
..........
WatcherRegistration wrt = null ;
if(watcher !=null){
wrt = new DataWatchRegistration(watcher,path);
}
......
request.setWatche(watcher!=null);//------注意此处兴许会用到
ReplyHeader r = cnxn.submitRequest(h,request,response,wrt);
在Zookeeper中,Packet 能够被看做是一个最小的通信协议单元。用于client和server端之间进行网络传输,不论什么一个须要传输的对象都要被包装成Packet对象进行传输。由于 ClientCnxn 中的 WatcherRegistration 又会被封装到 Packet 中去,然后放入发送队列中等待client发送。
Packet queuePacket(RequestHeader h , ReplyHeader r , Record reqest , Record response, AsyncCallback cb ,String clientPath , String serverPath , Object ctx , WatcherRegistration wrt){
.......
synchronized(outgoingqueue){
packet = new Packet(h,r,request,response,wrt) ;
.........
outgoingqueue.add(packet);
}
....
}
随后,Zookeeper client会向服务端发送这个请求,同一时候等待服务端的返回。完毕请求发送后,会由client SendThread 线程的 readResponse 方法接受来自服务端的响应。finishPacket 方法会从 Packet 中取出相应的 Watcher 并注冊到ZkManager中去,代码逻辑:
private void finishPacket(Packet p){
if(p.watcherRegistration != null){
p.watcherRegistration.register(p.replyHeader.getErr());
}
.......
}
如今把 Watcher 对象从 WatchRegistration 对象中取出来:
protected Map<String,HashSet<Watcher>> getWatchers(int rc){
return watchManager.dataWatches ;
}
public void register(int rc){
if(shouldAddWatch(rc)){
Map<String,HashSet<Watcher>> watches = getWatchers(rc) ;
synchronized(watches){
Set<Watcher> watchers = watches.get(clientPath) ;
if(watchers ==null){
watchers  =new HashSet<Watcher>();
watches.put(clientPath,watchers);
}
watchers.add(watcher);
.........
}
在上面的register 方法中会吧临时存放的 watcher 对象转交给 ZKWatcherManager , 并终于保存到dataWatchers 中 ,dataWatchers , ZKWatcherManager 都是 Map<String,Set<Watcher>> 类型的数据结构,用于把数据节点的路径和Watcher对象一一映射后保存起来。
在上面的流程中,WatcherRegistration 在底层的网络序列化究竟层的字节数组中。

Watcher 实现机制之client注冊相关推荐

  1. Android应用程序注冊广播接收器(registerReceiver)的过程分析

    前面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/公布机制,因此,使用这样的消息驱动模型的第一步便是订阅消息:而对Android应用程序来说,订阅消息事实上就是注冊广播接收器, ...

  2. zookeeper 中 Watcher 通知机制的一点理解

    首先,ZooKeeper 提供了分布式数据的发布/订阅功能. 这让我想到一种模式,观察者模式(发布订阅模式):一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某一个主题 ...

  3. 音频编辑大师 3.3 注冊名 注冊码

    username:cae3_user000 注冊码:beslbFVpFEhxvxA0F23xW7heAeWoWjuWhvBIMN0Je1o= 我试过了,绝对能够用. 转载于:https://www.c ...

  4. 手把手教你怎样免费注冊国际顶级域名

    手把手教你怎样申请国际顶级域名(新奇的,快到快强,过时无效不负责) 申请域名地址:https://www.domaindiscover.com/ 第一步:敲入 https://www.domaindi ...

  5. Myeclipse7.5 下载 安装 注冊 注冊码 100%成功

    myeclipse7.5启动画面 1.下载Myeclipse官方原版 官方原版:或者 http://downloads.myeclipseide.com/downloads/products/ewor ...

  6. myeclipse6.0下载及注冊码

    myeclipse6.0 下载地址. 官方下载地址: http://www.myeclipseide.com/module-htmlpages-display-pid-4.html 本地快速下载地址: ...

  7. SecureCRT 6.7.1 注冊机 和谐 破解 补丁 方法

    之前一直在用SecureCRT 6.5.3 版本号,和谐补丁也好找,甚至中文版本号也可找到(眼下仅仅找到了SecureCRT.6.2.0) 可是换为 6.7.1 后就怎么也注冊不了了.. 没办法试了各 ...

  8. Database Vault注冊

    默认情况下,在安装好Database Vault组件的Oracle HOme下创建的数据库是没有注冊Database Vault的.1)停EM.监听.数据库 2)启用Database Vault 在使 ...

  9. Android插件化开发之解决OpenAtlas组件在宿主的注冊问题

    Android插件化开发之解决OpenAtlas组件在宿主的注冊问题 OpenAtlas有一个问题,就是四大组件必须在Manifest文件里进行注冊,那么就必定带来一个问题,插件中的组件都要反复在宿主 ...

最新文章

  1. 拖尾因子大怎么调整_乳房松弛下垂怎么改善?怎么快速调整乳房松弛下垂?
  2. qt geomery的单位是什么_斜管沉淀池的原理是什么?
  3. 聊聊Service(一)
  4. C++操作SQLite简明教程
  5. PyCharm安装和配置教程
  6. 文本编辑器_markdown编辑器与富文本编辑器优缺点比较
  7. python万年历实验报告_Python实现的简单万年历例子分享
  8. Git之同一台电脑如何连接多个远程仓库
  9. Linux下套接字详解(四)----简单的TCP套接字应用(迭代型)
  10. UVALive 3211 Now or Later (2-SAT)
  11. AssetBundle解析工具——AssetStudio
  12. matlab08a调节字体大小,MATLAB低通滤波器的设计代码
  13. oozie timezone时区配置
  14. VMware Converter Standalone结合TrueImage 迁移HyperV虚机
  15. Struts2 Error filterStart异常的解决方法总结
  16. unity中旋转的总结
  17. Word公式居中,公式编号右对齐
  18. HDU4544 湫湫系列故事――消灭兔子
  19. php中table是什么意思,table标签是什么意思
  20. TPS5430DDAR高输出电流PWM转换器

热门文章

  1. ubuntu14.04连接网络 No valid active connections found!
  2. BCI比赛数据集简介-BCI competition IV 2b
  3. 学java时的一些笔记(1)
  4. iOS应用开发入门(3)——点击button控制textview
  5. 猛男把400+条猫咪叫声做成数据集,可识别猫咪的3种不同状态丨开源
  6. DeeCamp2021启动,李开复张亚勤吴恩达等大咖喊你报名啦
  7. AI在茫茫人海中,看到只有你被Deepfake了丨阿里安全出品
  8. “金主爸爸快回来交学费吧!”疫情让中国留学生难以返校,国外高校面临资金短缺...
  9. 谷歌大罢工组织者离职:自曝不得不走,“遭遇秋后算账”
  10. redis 一主二从