分佈式鎖實現方式介紹和Zookeeper實現原理

 

分佈式鎖實現的幾種方式

    基於數據庫實現分佈式鎖(表、數據庫排他鎖)html

    基於緩存(redis,memcached,tair)java

    基於Zookeeper實現分佈式鎖redis

關注點:算法

    單點問題?(集羣)數據庫

    失效時間?(鎖的釋放 VS 失效)緩存

    非阻塞?(while自旋 || wacther通知)分佈式

    非可重入?(記錄當前得到鎖的機器的主機信息和線程信息;三種方式都是)memcached

根據不一樣的應用場景正確選擇:源碼分析

————————————————————性能

從理解的難易程度角度(從低到高)

數據庫 > 緩存 > Zookeeper

————————————————————

從實現的複雜性角度(從低到高)

Zookeeper >= 緩存 > 數據庫

————————————————————

從性能角度(從高到低)

緩存 > Zookeeper >= 數據庫

————————————————————

從可靠性角度(從高到低)

Zookeeper > 緩存 > 數據庫

————————————————————

ZK分佈式鎖的實現

ZK分佈式鎖以前有提過,有簡單互斥鎖、互斥鎖、讀寫鎖;互斥鎖是在簡單互斥鎖的基礎上進行了優化,防止羊羣效應問題,直接根據事件通知下一子節點來得到鎖;

調整後的分佈式鎖算法流程以下:(優化爲「等待前一個子節點刪除通知」)

    1.客戶端鏈接zookeeper,並在/lock下建立臨時的且有序的子節點,第一個客戶端對應的子節點爲/lock/lock-0000000000,第二個爲/lock/lock-0000000001,以此類推。

    2.客戶端獲取/lock下的子節點列表,判斷本身建立的子節點是否爲當前子節點列表中序號最小的子節點,若是是則認爲得到鎖,不然監聽恰好在本身以前一位的子節點刪除消息,得到子節點變動通知後重復此步驟直至得到鎖;

    3.執行業務代碼;

    4.完成業務流程後,刪除對應的子節點釋放鎖。

 

分佈式鎖的幾種實現方式:http://www.hollischuang.com/archives/1716

基於Zookeeper的分佈式鎖(源碼分析):

http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html

相關文章
相關標籤/搜索