第三章、使用ZooKeeper進行開發
ZooKeeper提供了Java語言和C語言的API套 件,這兩個套件擁有相同的基礎結構和特性。
一、開始使用ZooKeeper的API
首先介紹 一下如何使用ZooKeeper的API進行開發,展示如何創建會話,實現監視點 (watcher)。我們還是從主-從模式例子開始進行編碼。
1、設置ZooKeeper的CLASSPATH
我們需要設置正確的classpath,以便運行或編譯ZooKeeper的Java代碼。
ZooKeeper發行包中bin目錄下的zkEnv.sh腳本會爲我們設置該環境變 量。我們需要使用以下方式來編碼:
(在Windows上,使用call命令調用,而不是使用zkEnv.cmd腳本。)
2、建立ZooKeeper會話(通過句柄handle)
ZooKeeper的API圍繞ZooKeeper的句柄(handle)而構建,每個API調用都需要傳遞這個句柄。這個句柄代表與ZooKeeper之間的一個會話。
句柄(handle)指的是使用唯一的整數值即一個四字節長的數值來標識應用程序中的不同對象和同類中的不同的實例。但是句柄(handle)不是指針,程序不能通過句柄來直接閱讀文件中的信息。
在圖 3-1中,與ZooKeeper服務器已經建立的一個會話如果斷開,這個會話就會 遷移到另一臺ZooKeeper服務器上。只要會話還存活着,這個句柄就仍然有效,ZooKeeper客戶端庫會持續保持這個活躍連接,以保證與ZooKeeper服務器之間的會話存活。如果句柄關閉,ZooKeeper客戶端庫會告知 ZooKeeper服務器終止這個會話。如果ZooKeeper發現客戶端已經死掉,就 會使這個會話無效。如果客戶端之後嘗試重新連接到ZooKeeper服務器,使 用之前無效會話對應的那個句柄進行連接,那麼ZooKeeper服務器會通知客 戶端庫,這個會話已失效,使用這個句柄進行的任何操作都會返回錯誤。
創建ZooKeeper句柄的構造函數如下:
其中:
- connectString
包含主機名和ZooKeeper服務器的端口。 - sessionTimeout
以毫秒爲單位,表示ZooKeeper等待客戶端通信的最長時間,之後會聲明會話已死亡。目前我們使用15000,即15秒。需 要注意,這個值比較高,但對於我們後續的實驗會非常有用。ZooKeeper會話一般設置超時時間爲5~10秒。 - watcher
用於接收會話事件的一個對象,這個對象需要我們自己創建。因爲 Wacher定義爲接口,所以我們需要自己實現一個類,然後初始化這個類的 實例並傳入ZooKeeper的構造函數中。客戶端使用Watcher接口來監控與 ZooKeeper之間會話的健康情況。與ZooKeeper服務器之間建立或失去連接時就會產生事件。它們同樣還能用於監控ZooKeeper數據的變化。最終,如 果與ZooKeeper的會話過期,也會通過Watcher接又傳遞事件來通知客戶端 的應用。