zookeeper(二): Curator vs zkClient


zookeeper Curator zkClient 客戶端對比

瘋狂創客圈 Java 分布式聊天室【 億級流量】實戰系列之 -23【 博客園 總入口


@

寫在前面

​ 大家好,我是作者尼恩。目前和幾個小伙伴一起,組織了一個高並發的實戰社群【瘋狂創客圈】。正在開始高並發、億級流程的 IM 聊天程序 學習和實戰

​ 前面,已經完成一個高性能的 Java 聊天程序的四件大事:

接下來,需要進入到分布式開發的環節了。 分布式的中間件,瘋狂創客圈的小伙伴們,一致的選擇了zookeeper,不僅僅是由於其在大數據領域,太有名了。更重要的是,很多的著名框架,都使用了zk。

​ 本篇介紹和對比zookeeper的兩個客戶端。

1.1. zookeeper應用開發

Zookeeper應用開發,需要使用Zookeeper的java 客戶端API ,去連接和操作Zookeeper 集群。

可以供選擇的java 客戶端API 有:Zookeeper 官方的 java客戶端API,第三方的java客戶端API。

Zookeeper官方的 客戶端API提供了基本的操作,比如,創建會話、創建節點、讀取節點、更新數據、刪除節點和檢查節點是否存在等。但對於開發人員來說,Zookeeper提供的基本操縱還是有一些不足之處。

Zookeeper API不足之處如下:

(1)Zookeeper的Watcher是一次性的,每次觸發之后都需要重新進行注冊;

(2)Session超時之后沒有實現重連機制;

(3)異常處理繁瑣,Zookeeper提供了很多異常,對於開發人員來說可能根本不知道該如何處理這些異常信息;

(4)只提供了簡單的byte[]數組的接口,沒有提供針對對象級別的序列化;

(5)創建節點時如果節點存在拋出異常,需要自行檢查節點是否存在;

(6)刪除節點無法實現級聯刪除;

第三方開源客戶端主要有zkClient和Curator。

1.1.1. ZkClient簡介

ZkClient是一個開源客戶端,在Zookeeper原生API接口的基礎上進行了包裝,更便於開發人員使用。zkClient客戶端,在一些著名的互聯網開源項目中,得到了應用,比如:阿里的分布式dubbo框架,對它進行了集成使用。

zkClient解決了Zookeeper原生API接口的很多問題。比如,zkClient提供了更加簡潔的api,實現了session會話超時重連、Watcher反復注冊等問題。雖然ZkClient對原生API進行了封裝,但也有它自身的不足之處。

具體如下:

(1)zkClient社區不活躍,文檔不夠完善,幾乎沒有參考文檔;

(2)異常處理簡化(拋出RuntimeException);

(3)重試機制比較難用;

(4)沒有提供各種使用場景的參考實現;

1.1.2. Curator簡介

Curator是Netflix公司開源的一套Zookeeper客戶端框架,和ZkClient一樣,解決了非常底層的細節開發工作,包括連接重連、反復注冊Watcher和NodeExistsException異常等。Curator是Apache基金會的頂級項目之一,Curator具有更加完善的文檔,另外還提供了一套易用性和可讀性更強的Fluent風格的客戶端API框架。

不止上面這些,Curator中還提供了Zookeeper各種應用場景(Recipe,如共享鎖服務、Master選舉機制和分布式計算器等)的抽象封裝。

另外,Curator供了一套非常優雅的鏈式調用api,對比ZkClient客戶端 Api的使用,發現 Curator的api 優雅太多。

使用ZkClient客戶端,創建節點的代碼為:

   ```
     ZkClient client = new ZkClient("192.168.1.105:2181",

                10000, 10000, new SerializableSerializer());

        System.out.println("conneted ok!");

        String zkPath = "/test/node-1";

        Stat stat = new Stat();

        User u = client.readData(zkPath, stat);
   ```

使用Curator客戶端,創建節點的代碼如下:

 ```
   CuratorFramework client =  CuratorFrameworkFactory.newClient(

                connectionString, retryPolicy);

        String zkPath = "/test/node-1";

        client.create().withMode(mode).forPath(zkPath);
 ```

總之,由於Curator客戶端確實非常優秀,Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”,對Curator給予了高度評價。

因此,對於Zookeeper的客戶端,我們這里只學習和研究Curator的使用。而且,在實際的開發場景中,使用Curator客戶端,就足可以應付日常的Zookeeper集群操作需求。

瘋狂創客圈社群的億級流量IM實戰項目,也使用Curator客戶端來操作Zookeeper集群。

寫在最后

​ 下一篇:開啟zk的客戶端開發。


瘋狂創客圈 億級流量 高並發IM 實戰 系列

  • Java (Netty) 聊天程序【 億級流量】實戰 開源項目實戰



免責聲明!

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



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