Zookeeper客戶端

Zookeeper客戶端

一,Zookeeper客戶端的主要組件

 

Zookeeper客戶端主要由以下幾個核心部分組成:

 

1,Zookeeper實例:客戶端入口。

通過調用Zookeeper構造方法生成客戶端實例。

 

2,ClientWatchManager:客戶端Watcher管理器。

 

3,HostProvider:客戶端地址列表管理器。

 

4,ClientCnxn:客戶端核心線程。內部又包含2個線程,SendThread和EventThread。SendThread是一個IO線程,主要負責Zookeeper客戶端與服務端的網絡通信。EventThread是一個事件線程,主要負責對服務端事件進行處理。

 

 

二,Zookeeper客戶端的啓動流程

 

 

首先看一下Zookeeper構造方法

Zookeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly)

 

初始化階段

 

1,設置默認Watcher。

如果在Zookeeper的構造方法中傳入一個Watcher對象的話,Zookeeper會將這個對象保存在ZKWatcherManager的defaultWatcher中,作爲整個客戶端會話期間的默認watcher。

 

2,設置Zookeeper服務器地址列表。

對於傳入的服務器地址,客戶端會將其保存在服務器地址列表管理器HostProvider中。

 

3,創建ClientCnxn。

Zookeeper客戶端首先會創建一個網絡連接器ClientCnxn,用來管理客戶端與服務端的網絡通信。

 

4,初始化SendThread和EventThread。

SendThread是一個IO線程,主要負責Zookeeper客戶端與服務端的網絡通信。EventThread是一個事件線程,主要負責對服務端事件進行處理。

 

會話創建階段

 

5,啓動SendThread和EventThread。

SendThread首先會判斷當前客戶端的狀態,進行一系列清理工作,爲客戶端發送會話創建請求做準備。

 

6,獲取一個服務器地址。

在開始創建TCP連接之前,SendThread首先需要獲取一個Zookeeper服務器的地址,這通常是從HostProvider中隨機獲取一個地址,然後委託給ClientCnxnSocket去創建與Zookeeper服務端的TCP連接。

 

7,創建TCP連接。

獲取到服務器地址後,ClientCnxnSocket負責和服務端創建一個TCP長連接。

 

8,構造ConnectRequest請求。

SendThread根據當前客戶端的實際設置,構造一個ConnectRequest請求,該請求代表了客戶端試圖與服務端創建一個會話。同時,Zookeeper客戶端還會進一步將該請求包裝成網絡IO層的Packet對象,放入請求發送隊列outgoingQueue中。

 

9,發送請求。

ClientCnxnSocket從outgoingQueue取出一個待發送的Packet對象,將其序列化成ByteBuffer後,向服務端進行發送。

 

 

響應處理階段

 

10,接收服務端響應

ClientCnxnSocket接收到服務端的響應後,會先判斷當前的客戶端狀態是否是已初始化狀態。如果尚未完成初始化,那麼就認爲該響應一定是會話創建請求的響應,直接交給readConnectResult方法來處理該響應。

 

11,處理response

ClientCnxnSocket會對接收到的服務端響應進行反序列化,得到ConnectResponse對象,並從中獲取到Zookeeper服務端分配的會話sessionId。

 

12,連接成功。

連接成功後,一方面需要通知SendThread線程,進一步對客戶端進行會話參數的設置,包括readTimeout和connectTimeout等,並更新客戶端狀態。另一方面,需要通知地址管理器HostProvider當前成功連接的服務器地址。

 

13,生成事件,SyncConnected-None。

爲了能夠讓上層應用感知到會話的成功創建,SendThread會生成一個事件SyncConnected-None,代表客戶端與服務端創建會話成功。並將該事件傳遞給EventThread。

 

14,查詢watcher

EventThread收到事件後,會從ClientWatchManager管理器查詢出對應的watcher,針對SyncConnected-None事件,找出步驟2中存儲的默認的watcher,然後放到EventThread的waitingEvents隊列中。

 

15,處理事件。

EventThread不斷從waitingEvents隊列中取出待處理的watcher,然後直接調用該對象的process接口方法,以達到觸發watcher的目的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章