zookeeper - 读数据(6)

概述

    在写完zookeeper的写数据过程的文章之后,需要继续写一篇读数据过程的文章,这篇文章就是因此而来的。我们直接通过getData作为一个例子来说明这个过程,其他的exist/getChildren之类的方法类似。

    下面通过一个demo例子进行说明,基本上我们就可以看出来getData的api用法,我们就以这个作为例子开始进入数据读取过程的分析。几个核心的知识点包括核心回调(processResult)、watcher(process)等,当然创建Zookeeper的时候最后一个this其实就是一个watcher对象。

zookeeper-client源码

    在zookeeper获取server端数据的整个过程中,其实还是分两步走,组装数据+发送报文,发送报文的操作由sendThread完成实现的,其他的需要注意的就是packet当中包含了watcher和callback。

《zookeeper - 读数据(6)》 client-1

说明:

    直接看出来zookeeper的getData的api,注意实现了Watcher接口和DataCallback接口。

《zookeeper - 读数据(6)》 client-2

说明:

    这里我们可以看到有个watchManager.defaultWatch=watcher的赋值,这里其实就是绑定了我们新建zookeeper对象的时候传进来的watcher。

《zookeeper - 读数据(6)》 client-3

说明:

    组装报文并通过queuePacket放置到sendThread的发送队列当中。

《zookeeper - 读数据(6)》 client-4

说明:

    将packet添加到outgoingQueue当中,由sendThread完成报文发送。

zookeeper-server源码

    zookeeper的server端在处理getData的请求的时候,这里整个处理流程依然是按照:PrepRequestProcessor,SyncRequestProcessor和FinalRequestProcessor依次进行处理。

    在整个过程中,除了关注获取数据的流程,还需要关注getData添加了watcher的过程,也就说针对具体的path我们增加了watcher,其实这个watcher本质上是server端和client端建立的连接的socket,也就是说我们通过维护了path和watcher的映射关系,这样子每次特定的path发生了数据的变更,然后通过socket连接通知client进行事件处理。

    整个过程watcher机制的过程应该比较冗长,后面再具体写文章来阐述。

《zookeeper - 读数据(6)》 server-1

说明:

    获取client发送的数据,从这个入口开始关注。

《zookeeper - 读数据(6)》 server-2

说明:

    继续跟进readRequest过程。

《zookeeper - 读数据(6)》 server-3

说明:

    提交任务到PrepRequestProcessor当中并进行处理。

《zookeeper - 读数据(6)》 server-4

说明:

    PrepRequestProcessor开始进行处理。

《zookeeper - 读数据(6)》 server-5

说明:

    跟进由SyncRequestProcessor进行处理。

《zookeeper - 读数据(6)》 server-6

说明:

    跟进FinalRequestProcessor进行处理。

《zookeeper - 读数据(6)》 server-7

说明:

    开始进行getData的真正处理逻辑,这里面除了获取数据还保存了watcher。

《zookeeper - 读数据(6)》 server-8

说明:

    增加了watcher的机制。

zookeeper-DataTree结构

《zookeeper - 读数据(6)》 DataTree

说明:

    在zookeeper中的server端以DataTree保存数据结构,DataTree中包含nodes的k/v集合(其中key为node的path,value为DataNode对象),dataWatches是保存所有data节点的watches,childWatches是保存所有子节点的watches。

    DataNode包含的就是节点的对象,包含数据data、acl、stat、children子节点。

    WatchManager保存的是对应的回调watches。

参考文章

    Zookeeper源码分析之三Exists请求和处理

    原文作者:晴天哥_374
    原文地址: https://www.jianshu.com/p/4103f3b2f165
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞