本文內容並非原創,使用資料均來自互聯網。
dubbo使用了zkClient而不是使用zookeeper本身的客戶端與zookeeper進行交互,為什么呢?
先看看zookeeper本身自帶的客戶端的問題。
1)ZooKeeper的Watcher是一次性的,用過了需要再注冊;
2) session的超時后沒有自動重連,生產環境中如果網絡出現不穩定情況,那么這種情況出現的更加明顯;
3) 沒有領導選舉機制,集群情況下可能需要實現stand by,一個服務掛了,另一個需要接替的效果;
4) 客戶端只提供了存儲byte數組的接口,而項目中一般都會使用對象。
5)客戶端接口需要處理的異常太多,並且通常,我們也不知道如何處理這些異常。
I0Itec這個zookeeper客戶端基本上解決了上面的所有問題,主要有以下特性:
1) 提供了zookeeper重連的特性------能夠在斷鏈的時候,重新建立連接,無論session失效與否.
2) 持久的event監聽器機制------ZKClient框架將事件重新定義分為了stateChanged、znodeChanged、dataChanged三種情況,用戶可以注冊這三種情況下的監聽器(znodeChanged和dataChanged和路徑有關),而不是注冊Watcher。
3) zookeeper異常處理-------zookeeper中繁多的Exception,以及每個Exception所需要關注的事情各有不同,I0Itec簡單的做了封裝.
4) data序列化------簡單的data序列化.(Serialzer/Deserialzer)
5)有默認的領導選舉機制
請注意使用I0Itect-zkClient暫時有幾個方法仍需要重寫:
1) create方法:創建節點時,如果節點已經存在,仍然拋出NodeExistException,可是我期望它不在拋出此異常.
2) retryUtilConnected: 如果向zookeeper請求數據時(create,delete,setData等),此時鏈接不可用,那么調用者將會被阻塞直到鏈接建立成功;不過我仍然需要一些方法是非阻塞的,如果鏈接不可用,則拋出異常,或者直接返回.
3) create方法: 創建節點時,如果節點的父節點不存在,我期望同時也要創建父節點,而不是拋出異常.
4) data監測: 我需要提供一個額外的功能來補充watch的不足,開啟一個線程,間歇性的去zk server獲取指定的path的data,並緩存起來..歸因與watch可能丟失,以及它不能持續的反應znode數據的每一次變化,所以只能手動去同步獲取.
備注:ZKClient是Datameer開源的一個Zookeeper客戶端實現,開源比較早,參見:https://github.com/sgroschupf/zkclient
參考資料:http://san-yun.iteye.com/blog/1977454