溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

zk client會(huì)話過(guò)程是怎樣的

發(fā)布時(shí)間:2021-06-26 09:43:29 來(lái)源:億速云 閱讀:143 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“zk client會(huì)話過(guò)程是怎樣的”,在日常操作中,相信很多人在zk client會(huì)話過(guò)程是怎樣的問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”zk client會(huì)話過(guò)程是怎樣的”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

client會(huì)話過(guò)程

zk客戶(hù)端的主要核心組件

zk客戶(hù)端會(huì)話過(guò)程

初始化階段

創(chuàng)建階段

響應(yīng)階段

UML圖

zk client會(huì)話過(guò)程是怎樣的

zk客戶(hù)端主要組件

zookeeper 客戶(hù)端入口

ClientWatchManager:客戶(hù)端Watch管理器

HostProvider:客戶(hù)端地址管理器

ClientCnxn:核心線程,包含SendThread和EventThread兩個(gè)線程

SendThread為i/o線程,主要負(fù)責(zé)客戶(hù)端和服務(wù)器之間網(wǎng)絡(luò)io

EventTrhead為事件線程

zk client會(huì)話過(guò)程是怎樣的

初始化階段

主要分為:

1 初始化ZooKeeper對(duì)象

通過(guò)調(diào)用zookeeper的構(gòu)造方法實(shí)例化一個(gè)對(duì)象,初始化過(guò)程中會(huì)創(chuàng)建一個(gè)watcher管理器ClientWatcherManager

2 設(shè)置會(huì)話默認(rèn)watcher

如果構(gòu)造中傳入一個(gè)watcher,就將它作為默認(rèn)watcher保存到ClientWatcherManager

3 構(gòu)建zk服務(wù)地址列表管理器HostProvider

通過(guò)構(gòu)造器傳入的服務(wù)端地址列表,將其保存在服務(wù)器地址列表管理器中HostProvider

4 創(chuàng)建并初始化客戶(hù)端網(wǎng)絡(luò)連接

zookeeper客戶(hù)端創(chuàng)建一個(gè)網(wǎng)絡(luò)連接器ClientCnxn,用來(lái)管理客戶(hù)端和服務(wù)端網(wǎng)絡(luò)交互

創(chuàng)建ClientCnxn過(guò)程中還會(huì)初始化客戶(hù)端兩個(gè)核心隊(duì)列outGoingQueue和pendingQueue

作為客戶(hù)端發(fā)送請(qǐng)求隊(duì)列和服務(wù)端響應(yīng)等待隊(duì)列

5初始化SendThread和EventThread

會(huì)話創(chuàng)建階段

6啟動(dòng)SendThread和EventThread

sendTHread首先會(huì)判斷當(dāng)前客戶(hù)端的狀態(tài),進(jìn)行一系列清理性工作,為客戶(hù)端發(fā)送“會(huì)話創(chuàng)建”請(qǐng)求準(zhǔn)備

7獲取一個(gè)服務(wù)地址

在創(chuàng)建TCP之前,SendThread首先需要獲取一個(gè)ZooKeeper服務(wù)器的目標(biāo)地址,通常就是從HostProvider中隨機(jī)獲取出一個(gè)地址,然后委托給ClientCnxnSocket去創(chuàng)建與Zookeeper服務(wù)器之間的TCP連接

8 創(chuàng)建tcp連接,獲取一個(gè)服務(wù)器地址后,clientCnxnSocket負(fù)責(zé)和服務(wù)器創(chuàng)建一個(gè)TCP長(zhǎng)連接

9構(gòu)建ConnectRequest請(qǐng)求

在TCP連接創(chuàng)建完畢后,就說(shuō)明已經(jīng)和zookeeper服務(wù)器完成了連接呢?其實(shí)不是,上面的步驟只是從網(wǎng)絡(luò)tcp層完成了socket連接,但沒(méi)有完成zookeeper客戶(hù)端和服務(wù)端的連接

SendThread會(huì)負(fù)責(zé)當(dāng)前請(qǐng)求參數(shù),構(gòu)造出一個(gè)ConnectRequest請(qǐng)求,同時(shí)將包裝成網(wǎng)絡(luò)io層的Packet對(duì)象,放入發(fā)送隊(duì)列outgoingQueue中

10 發(fā)送請(qǐng)求

ClientCnxnSocket將從outgoingQueue中取出待發(fā)送的Packet,序列化成bytebuffer,進(jìn)行發(fā)送

響應(yīng)處理階段

11響應(yīng)處理

接收到服務(wù)端響應(yīng)后,首先判斷當(dāng)前客戶(hù)端狀態(tài)是否是“已初始化”,如果沒(méi)有完成初始化,那么認(rèn)為該響應(yīng)一定是會(huì)話創(chuàng)建請(qǐng)求的響應(yīng),交給readConnnectResult方法處理響應(yīng)

12 處理respinse

ClientCnxnSocket會(huì)對(duì)接收到的服務(wù)端響應(yīng)進(jìn)行反序列化,得到ConnectResponse對(duì)象,并從中獲取到zookeeper服務(wù)端分配的會(huì)話sessionId,

13 連接成功

通知SendThread線程,處理會(huì)話參數(shù)設(shè)置,包括時(shí)間設(shè)置等等

另一個(gè)方面,需要通知地址管理器HostProvider當(dāng)前成功連接的服務(wù)器地址

14 生成事件

為了能夠讓上層應(yīng)用感應(yīng)到會(huì)話成功創(chuàng)建,SendThread會(huì)生成一個(gè)事件SyncConnected-None,代表會(huì)話創(chuàng)建成功,并將事件傳遞給EventTread線程

15 查詢(xún)Watcher

EventThread收到事件后,從ClientWatchManager管理器中查詢(xún)出對(duì)應(yīng)的watcher,放入waitingEvents隊(duì)列中

16 處理事件

取出事件對(duì)應(yīng)的watcher列表,調(diào)用process接口,達(dá)到出發(fā)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);
}

到此,關(guān)于“zk client會(huì)話過(guò)程是怎樣的”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

zk
AI