Zookeeper-Zookeeper client

當我寫完Zookeeper leader選舉後,準備看看Zookeeper的存儲和處理客戶端請求的時候發現,若是能看看Zookeeper的API是否是在理解後面的過程更好些呢。api

Zookeeper的client是經過Zookeeper類提供的。前面曾經說過,Zookeeper給使用者提供的是一個相似操做系統的文件結構,只不過這個結構是分佈式的。能夠理解爲一個分佈式的文件系統。咱們能夠經過Zookeeper來訪問這個分佈式的文件系統。網絡

Zookeeper的client api給咱們提供如下這些API:併發

1. createapp

在給定的path上建立節點,這個path就像文件系統的路徑,好比/myapp/data/1,在建立節點的時候還能夠指定節點的類型:是永久節點,永久順序節點,臨時節點,臨時順序節點。這個節點類型是很是強大的。永久節點一經建立就永久保留了,就像咱們在文件系統上建立一個普通文件,這個文件的生命週期跟建立它的應用沒有任何關係。而臨時節點呢,當建立這個臨時節點的應用與zookeeper之間的會話過時以後就會被zookeeper自動刪除了。這個特性是實現不少功能的關鍵。好比咱們作集羣感知,咱們的應用啓動的時候將本身的ip地址做爲臨時節點建立在某個節點下面。當咱們的應用由於某些緣由,好比網絡斷掉或者宕機,它與zookeeper的會話就會過時了,過時後這個臨時節點就刪除了。這樣咱們就能夠經過這個特性來感知到咱們的服務的集羣有哪些機器是活者的。那麼順序節點又是什麼呢。通常,若是咱們在指定的path上建立節點,若是這個節點已經被建立了,則會拋出一個NodeExistsException的異常。若是咱們在指定的路徑上建立順序節點,則Zookeeper會自動的在咱們給定的path上加上一個順序編號。這個特性就是實現分佈式鎖的關鍵。假設咱們有幾個節點共享一個資源,咱們這幾個節點都想爭用這個資源,那咱們就都向某個路徑建立臨時順序節點。而後順序最小的那個就得到鎖,而後若是某個節點釋放了鎖,那順序第二小的那個就得到鎖,以此類推,這樣一個分佈式的公平鎖就實現了。分佈式

除此以外,每一個節點上還能夠保存一些數據。操作系統

2. delete 刪除給定節點。刪除節點的時候還能夠給定一個version,只有路徑和version都匹配的時候節點纔會被刪除。有了這個version在分佈式環境種咱們就能夠用樂觀鎖的方式來確保一致性。好比咱們先讀取一下節點,得到了節點的version,而後刪除,若是刪除成功了則說明在這之間沒有人操做過這個節點,不然就是併發衝突了。對象

3. exists 這個節點會返回一個Stat對象,若是給定的path不存在的話則返回null。這個方法有一個關鍵參數,能夠提供一個Watcher對象。Wathcer是Zookeeper強大功能的源泉。Watcher就是一個事件處理器,一個回調。好比這個exists方法,調用後,若是別人對這個path上的節點進行操做,好比建立,刪除或設置數據,這個Wather都會接收到對應的通知。生命週期

4. setData/getData 設置或獲取節點的數據,getData也能夠設置Watcher事件

5. getChildren 獲取子節點,能夠設置Watcherip

6. sync zookeeper是一個集羣,建立節點的時候只要半數以上的節點確認就認爲是建立成功了,可是若是讀取的時候正好讀取到一個落後的節點上,那就有可能讀取到舊的數據,這個時候能夠執行一個sync操做,這個操做能夠確保讀取到最新的數據。

zookeeper的client api基本上介紹完了。zookeeper強大的功能都是經過這些API來實現的,zookeeper經過一個簡單的文件系統數據模型對外提供服務。經過臨時節點,Watcher等手段咱們能夠實現一些在分佈式環境種很難作到的事情。

相關文章
相關標籤/搜索