為什么dubbo使用ZkClient作為zookeeper的客戶端


本文內容並非原創,使用資料均來自互聯網。

 

 

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

 

關於我, 邯鄲人
對這類話題感興趣?歡迎發送郵件至 donlianli@126.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM