zk client分析

本文重点在分析zk watcher实现机制!!!
从zkCli.sh可以看出启动类是ZooKeeperMain,一打开此类就能看到zk支持的指令列表。


zk支持的命令列表.png

main方法主要流程:参数解析,维护已发送指令历史。构造ZooKeeper对象,启动发送线程和事件处理线程。主线程用于接收指令。

ZooKeeper最重要的状态是ZKWatchManager对象,ZKWatchManager里面有三个map,节点绝对路径以及对应的watcher集合:
Map<String, Set<Watcher>> dataWatches:监控节点数据变化。
Map<String, Set<Watcher>> existWatches:监控节点存在性变化。
Map<String, Set<Watcher>> childWatches:监控子节点变化。
是不是很神奇。我之前一直以为watcher会序列化之后发送zk server。其实watcher是保存在client端的。
ZKWatchManager构造时会同时构造出ClientCnxn对象,ClientCnxn构造时默认使用ClientCnxnSocketNIO类处理IO。
ClientCnxn最重要的两个状态:
LinkedList<Packet> pendingQueue:已经发送等待响应的请求。
LinkedList<Packet> outgoingQueue:待发送队列。
ClientCnxn构造时会同时构造出两个线程:
SendThread:用于发送请求。
线程启动时,注册socket到selector,然后等待连接完成和read/write就绪。


nio.png

连接完成之后,调用primeConnection,如果支持autoWatchReset,把当前的watcher重新set一遍。只监听读写事件,不再监听connect事件。


发送请求队列里的请求.png

write事件发生时,从请求队列里取一个发送给server,然后加入等待响应队列。
读响应信息.png
读响应信息.png
响应完成.png

根据响应的结果以及watcher的类型,注册watcher到ZKWatchManager。通知发送请求的client,请求处理完成。

处理watcher通知.png

收到通知,加入EventThread的通知队列。如果是watcher事件,同时找到注册的监听此路径此事件的所有watcher。

EventThread:用于处理通知。主要状态是LinkedBlockingQueue<Object> waitingEvents保存收到的通知。


线程主循环.png
处理每个event.png

event一共分两种:watcher事件和callback,收到通知事件时执行watcher和callback。

以get data为例说明zk server对watcher的处理:
GetDataRequest只有两个属性:String path和boolean watch。
FinalRequestProcessor处理get data请求时,如果watch=true,就传递NIOServerCnxn给data tree。NIOServerCnxn本身实现了Watched接口,在需要触发watcher时,把WatchedEvent返回给client。


处理watcher.png

data tree遇到watcher,记录下来哪个client在监控哪个路径


data tree.png

data tree处理set data指令时:


触发监控此节点的watcher集合.png
触发watcher.png
发送WatchedEvent给对应的client.png

create:触发节点的NodeCreated事件和父节点的NodeChildrenChanged事件。
delete:触发节点的NodeDeleted事件和父节点的NodeChildrenChanged事件。
setdata:触发节点的NodeDataChanged事件。
setacl:不触发事件。

本节完。。。。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,539评论 8赞 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,332评论 19赞 139
  • 这两天看完了zk单实例模式的大部分源码,发现分析源码有两个最重要的点:大学时软件工程导论上说的一句话:程序=算法+...
    码农崛起阅读 505评论 0赞 0
  • 通过专业的测评,四个特质类型中,我的S特质分值最高,当然也没有达到高S的程度。 这几天一直在看,在听阿德勒的<自卑...
    Nina张阅读 776评论 2赞 0
  • 今天看了夏天演的一个电影,独自等待。看了这个电影我更是确信了“男女之间没有真正的友谊”,我很羡慕陈文儿有一帮那么好...
    sid_9ff8阅读 291评论 0赞 1

友情链接更多精彩内容