分佈式鎖
圖1
zookeeper實現分佈式鎖的常見方式如圖一所示: 每個客戶端想拿到一個對於/lock下面的鎖就在/lock下面創建一個零時有序節點,創建完成後判斷是不是當前第一個節點,如果是就爲獲得鎖,釋放鎖就把剛創建的節點刪掉,如果創建的鎖不是當前第一個就監聽上一個節點,如果上一個節點被刪除就說明獲得鎖,同樣釋放鎖就刪除當前節點。
如圖1,client1創建/0000000001,因爲是第一個節點,所以client1獲得鎖,client2和client3創建後發現不是第一個節點,所以等待它各自創建的節點的上一個節點刪除,一旦監聽到上一個節點刪除了就說明當前節點爲第一個節點了也就獲得了鎖。
具體代碼實現可以參考:https://github.com/RuiHeHubGit/zookeeper-lock-and-queue
分佈式隊列
zookeeper實現分佈式隊列也依賴有序節點的特性,能保證數據的有序性,拿數據時拿一個數據並刪除,但需要使用分分佈式鎖同步,具體實現參考:https://github.com/RuiHeHubGit/zookeeper-lock-and-queue
注:每個客戶端(每個ip)默認最多和zookeeper建立60個鏈接,可以通過配置maxClientCnxns=n來調整,maxClientCnxns=0代表不限制。