温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

zk client会话过程是怎样的

发布时间:2021-06-26 09:43:29 来源:亿速云 阅读:151 作者:chen 栏目:大数据

这篇文章主要介绍“zk client会话过程是怎样的”,在日常操作中,相信很多人在zk client会话过程是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”zk client会话过程是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

client会话过程

zk客户端的主要核心组件

zk客户端会话过程

初始化阶段

创建阶段

响应阶段

UML图

zk client会话过程是怎样的

zk客户端主要组件

zookeeper 客户端入口

ClientWatchManager:客户端Watch管理器

HostProvider:客户端地址管理器

ClientCnxn:核心线程,包含SendThread和EventThread两个线程

SendThread为i/o线程,主要负责客户端和服务器之间网络io

EventTrhead为事件线程

zk client会话过程是怎样的

初始化阶段

主要分为:

1 初始化ZooKeeper对象

通过调用zookeeper的构造方法实例化一个对象,初始化过程中会创建一个watcher管理器ClientWatcherManager

2 设置会话默认watcher

如果构造中传入一个watcher,就将它作为默认watcher保存到ClientWatcherManager

3 构建zk服务地址列表管理器HostProvider

通过构造器传入的服务端地址列表,将其保存在服务器地址列表管理器中HostProvider

4 创建并初始化客户端网络连接

zookeeper客户端创建一个网络连接器ClientCnxn,用来管理客户端和服务端网络交互

创建ClientCnxn过程中还会初始化客户端两个核心队列outGoingQueue和pendingQueue

作为客户端发送请求队列和服务端响应等待队列

5初始化SendThread和EventThread

会话创建阶段

6启动SendThread和EventThread

sendTHread首先会判断当前客户端的状态,进行一系列清理性工作,为客户端发送“会话创建”请求准备

7获取一个服务地址

在创建TCP之前,SendThread首先需要获取一个ZooKeeper服务器的目标地址,通常就是从HostProvider中随机获取出一个地址,然后委托给ClientCnxnSocket去创建与Zookeeper服务器之间的TCP连接

8 创建tcp连接,获取一个服务器地址后,clientCnxnSocket负责和服务器创建一个TCP长连接

9构建ConnectRequest请求

在TCP连接创建完毕后,就说明已经和zookeeper服务器完成了连接呢?其实不是,上面的步骤只是从网络tcp层完成了socket连接,但没有完成zookeeper客户端和服务端的连接

SendThread会负责当前请求参数,构造出一个ConnectRequest请求,同时将包装成网络io层的Packet对象,放入发送队列outgoingQueue中

10 发送请求

ClientCnxnSocket将从outgoingQueue中取出待发送的Packet,序列化成bytebuffer,进行发送

响应处理阶段

11响应处理

接收到服务端响应后,首先判断当前客户端状态是否是“已初始化”,如果没有完成初始化,那么认为该响应一定是会话创建请求的响应,交给readConnnectResult方法处理响应

12 处理respinse

ClientCnxnSocket会对接收到的服务端响应进行反序列化,得到ConnectResponse对象,并从中获取到zookeeper服务端分配的会话sessionId,

13 连接成功

通知SendThread线程,处理会话参数设置,包括时间设置等等

另一个方面,需要通知地址管理器HostProvider当前成功连接的服务器地址

14 生成事件

为了能够让上层应用感应到会话成功创建,SendThread会生成一个事件SyncConnected-None,代表会话创建成功,并将事件传递给EventTread线程

15 查询Watcher

EventThread收到事件后,从ClientWatchManager管理器中查询出对应的watcher,放入waitingEvents队列中

16 处理事件

取出事件对应的watcher列表,调用process接口,达到出发watcher目的

public ZooKeeper(
    String connectString,
    int sessionTimeout,
    Watcher watcher,
    boolean canBeReadOnly,
    HostProvider aHostProvider,
    ZKClientConfig clientConfig) throws IOException {
    LOG.info("Initiating client connection, connectString=" + connectString
             + " sessionTimeout=" + sessionTimeout
             + " watcher=" + watcher);

    if (clientConfig == null) {
        clientConfig = new ZKClientConfig();
    }
    this.clientConfig = clientConfig;
    watchManager = defaultWatchManager();
    watchManager.defaultWatcher = watcher;
    ConnectStringParser connectStringParser = new ConnectStringParser(connectString);
    hostProvider = aHostProvider;

    cnxn = createConnection(
        connectStringParser.getChrootPath(),
        hostProvider,
        sessionTimeout,
        this,
        watchManager,
        getClientCnxnSocket(),
        canBeReadOnly);
    cnxn.start();
}

// @VisibleForTesting
protected ClientCnxn createConnection(
    String chrootPath,
    HostProvider hostProvider,
    int sessionTimeout,
    ZooKeeper zooKeeper,
    ClientWatchManager watcher,
    ClientCnxnSocket clientCnxnSocket,
    boolean canBeReadOnly) throws IOException {
    return new ClientCnxn(
        chrootPath,
        hostProvider,
        sessionTimeout,
        this,
        watchManager,
        clientCnxnSocket,
        canBeReadOnly);
}

到此,关于“zk client会话过程是怎样的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

zk
AI