如何用Zookeeper來實現分散式鎖?

来源:https://www.cnblogs.com/haizai/archive/2019/05/12/10853632.html
-Advertisement-
Play Games

什麼是Zookeeper臨時順序節點? 例如 : / 動物 植物 貓 倉鼠 荷花 松樹 Zookeeper的數據存儲結構就像一棵樹,這棵樹由節點組成,這種節點叫做Zonde.# Znode分為四種類型 : 1.持久節點(PERSISTENT) 預設的節點類型.創建節點的客戶端與zookeeper斷開 ...


什麼是Zookeeper臨時順序節點?
例如 :
/
動物 植物
貓 倉鼠 荷花 松樹
Zookeeper的數據存儲結構就像一棵樹,這棵樹由節點組成,這種節點叫做Zonde.
# Znode分為四種類型 :
1.持久節點(PERSISTENT)
預設的節點類型.創建節點的客戶端與zookeeper斷開連接後,該節點依舊存在.
2.持久節點順序節點(PERSISTENT_SEQUENTIAL)
所謂順序節點,就是在創建節點時,Zookeeper根據創建的時間順序給該節點名稱進行編號.
例如 :
倉鼠
倉鼠0001 倉鼠0002 倉鼠0003
3.臨時節點(EPHEMERAL)
和持久節點相反,當創建節點的客戶端與zookeeper斷開連接後,臨時節點會被刪除 :
4.臨時順序節點(EPHEMERAL_SEQUENTIAL)
臨時順序節點結合了臨時節點和順序節點的特點 : 在創建節點時,Zookeeper根據創建的時間順序給該節點名稱進行編號 ; 當創建節點的客戶端與zookeeper
斷開連接後,臨時節點會被刪除.
# Zookeeper分散式鎖的原理
Zookeeper分散式鎖恰恰應用了臨時順序節點
## 獲取鎖 :
首先,在Zookeeper當中創建一個持久節點ParentLock.當第一個客戶端想要獲得鎖時,需要在ParentLock這個節點下麵創建一個臨時順序節點Lock1.
之後,Client1查找ParentLock下麵所有的臨時順序節點併排序,判斷自己所創建的節點Lock1是不是順序最靠前的一個.如果是第一個節點,則成功獲得鎖.
這時候,如果再有一個客戶端Client2前來獲取鎖,則在ParentLock下再創建一個臨時順序節點Lock2.
Client2查找ParentLock下麵所有的臨時順序節點併排序,判斷自己所創建的節點Lock2是不是順序最靠前的一個,結果發現節點Lock2並不是最小的.
於是,Client2向排序僅比它靠前的節點Lock2註冊Watcher,用於監聽Lock1節點是否存在.這意味著Client2搶鎖失敗,進入了等待狀態.
這時候,如果又有一個客戶端Client3前來獲取鎖,則在ParentLock下再創建一個臨時順序節點Lock3.
Client3查找ParentLock下麵所有的臨時順序節點併排序,判斷自己所創建的節點Lock3是不是順序最靠前的一個,結果同樣發現節點Lock3並不是最小的.
於是,Client3向排序僅比它靠前的節點Lock2註冊Watcher,用於監聽Lock2節點是否存在.這意味著Client3同樣搶鎖失敗,進入了等待狀態.
這樣一來,Client1得到了鎖,Client2監聽了Lock1,Client3監聽了Lock2.這恰恰形成了一個等待隊列,很像是Java當中的ReentrantLock所依賴的AQS(AbstractQueuedSynchronizer)
## 釋放鎖 :
釋放鎖分為兩種情況 :
1.任務完成,客戶端顯示釋放
當任務完成時,Client1會顯示調用刪除節點Lock1的指令.
2.任務執行過程中,客戶端崩潰
獲得鎖的Client1在任務執行過程中,如果Duang的一聲崩潰則會斷開與Zookeeper服務端的鏈接.根據臨時節點的特性,相關聯的節點Lock1會隨之自動刪除.
由於Client2一直監聽著Lock1的存在狀態,當Lock1節點被刪除,Client2會立刻收到通知.這時候Client2會再次查詢ParentLock下麵的所有節點,確認自己創建
的節點Lock2是不是目前最小的節點.如果是最小,則Client2順利成章獲得鎖.
同理,如果Client2也因為任務完成或者節點崩潰而刪除了節點Lock2,那麼Client3就會接到通知.最終,Client3成功得到了鎖.
Zookeeper和Redis分散式鎖的比較
Zookeeper的
優點 :
1.有封裝好的框架,容易實現.
2.有等待鎖的隊列,大大提升搶鎖效率.
缺點 :
1.添加和刪除節點性能較低.
Redis
優點 : Set和Del指令的性能較高.
缺點 :
1.實現複雜,需要考慮超時,原子性,誤刪等情形.
2.沒有等待鎖的隊列,只能在客戶端自旋等鎖,效率低下.
兩者都可以在客戶端實現可重入邏輯.
在Apache的開源框架Apache Curator中,包含了對Zookeeper分散式鎖的實現,源碼 : https://github.com/apache/curator/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近,在做一些測試題,第一題就是這題,雖然答了出來但感覺不太完美,所以自己查了一些資料把它完善了一下。給大家查看。 行內、塊狀元素區別: (1).塊級元素會獨占一行,其寬度自動填滿其父元素寬度行內元素不會獨占一行,相鄰的行內元素會排列在同一行里,知道一行排不下,才會換行,其寬度隨元素的內容而變化 ( ...
  • 引言 最近做個東西,需將各種語言翻譯成中文,看了各家的翻譯效果,還是谷歌的最好。 但谷歌的未提供免費介面,研究了谷歌的 "翻譯頁面" ,輸入內容後會觸發ajax請求,請求參數中除了輸入內容,還有個加密參數 ,該加密演算法在壓縮的js代碼中,我也在網上找到了網友摘出來的代碼,js格式,一大段,壓縮代碼翻 ...
  • 創建函數的三種方式 1.函數聲明 2.函數表達式 3.函數對象方式 創建對象的三種方式 1.字面量方式 2.工廠模式創建對象 3.利用構造函數創建對象(常用) 對象代碼運行結果 ...
  • ServletConfig:表示servlet的配置信息,一個servlet對象對應一個servletconfig對象 方法: 1.獲取初始化參數 config.getInitParameter() ServletContext:表示servlet的全局配置信息,一個WebApplication只有 ...
  • 使用構造函數的主要問題,就是每個方法都要在實例上重新創建一遍。 探討構造函數內部的方法(或函數)的問題,首先看下兩個實例化後的屬性或方法是否相等。 方法的值相等,因為傳參一致可以把構造函數里的方法(或函數)用 new Function()方法來代替,得到一樣的效果,更加證明,他們最終判斷的是引用地址 ...
  • 表單:用來收集用戶的信息; 1、表單框: <form name=名" method="post/get" action=""></form> 2、文本框: <input type ="text" value="預設值"> 3、密碼框: <input type ="password"/> <input ...
  • 1、雙倍浮動BUG: 描述:塊狀元素設置了float屬性後,又設置了橫向的margin值,在IE6下顯示的margin值要比設置的值大; 解決方案:給float的元素添加 display:inline;將其轉換為內聯元素; 2、表單元素行高不一致: 解決方案: ①、給表單元素添加vertical-a ...
  • 將10086註冊到10087上: 再在10086服務的基礎上複製一個Eureka的服務,埠為10087,將其註冊到10086上: application-name的名稱保持一致,只是一個服務的兩個實例。 兩個都啟動: 10087: 10086: 如果有超過3台以上的集群,url的地址就是如下這種寫 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...