您好,登錄后才能下訂單哦!
這篇文章主要介紹“zk client會話過程是怎樣的”,在日常操作中,相信很多人在zk client會話過程是怎樣的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”zk client會話過程是怎樣的”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
client會話過程
zk客戶端的主要核心組件
zk客戶端會話過程
初始化階段
創建階段
響應階段
UML圖
zk客戶端主要組件
zookeeper 客戶端入口
ClientWatchManager:客戶端Watch管理器
HostProvider:客戶端地址管理器
ClientCnxn:核心線程,包含SendThread和EventThread兩個線程
SendThread為i/o線程,主要負責客戶端和服務器之間網絡io
EventTrhead為事件線程
初始化階段
主要分為:
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會話過程是怎樣的”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。