1. 程式人生 > >zookeeper (二):Curator vs zkClient

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) 聊天程式【 億級流量】實戰 開源專案實戰