zookeeper(二): Curator vs zkClient

zookeeper Curator zkClient 客戶端對比

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


@node

寫在前面

​ 你們好,我是做者尼恩。目前和幾個小夥伴一塊兒,組織了一個高併發的實戰社羣【瘋狂創客圈】。正在開始高併發、億級流程的 IM 聊天程序 學習和實戰面試

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

接下來,須要進入到分佈式開發的環節了。 分佈式的中間件,瘋狂創客圈的小夥伴們,一致的選擇了zookeeper,不單單是因爲其在大數據領域,太有名了。更重要的是,不少的著名框架,都使用了zk。數組

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

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) 聊天程序【 億級流量】實戰 開源項目實戰

  • Netty 源碼、原理、JAVA NIO 原理
  • Java 面試題 一網打盡
  • 瘋狂創客圈 【 博客園 總入口 】

相關文章
相關標籤/搜索