Zookeeper紹二(分散式鎖介)
阿新 • • 發佈:2020-10-28
一、為什麼會有分散式鎖?
在多執行緒環境下,由於上下文的切換,資料可能出現不一致的情況或者資料被汙染,我們需要保證資料安全,所以想到了加鎖。
所謂的加鎖機制呢,就是當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問,直到該執行緒讀取完,其他執行緒才可使用。
我們為了減少DB的壓力,把庫存預熱到了KV,現在KV的庫存是1。
- 服務A去Redis查詢到庫存發現是1,那說明我能搶到這個商品對不對,那我就準備減一了,但是還沒減。
- 同時服務B也去拿發現也是1,那我也搶到了呀,那我也減。
- C同理。
- 等所有的服務都判斷完了,你發現誒,怎麼變成-2了,超賣了呀,這下完了。
正常執行緒程序同步的機制有哪些?
- 互斥:互斥的機制,保證同一時間只有一個執行緒可以操作共享資源 synchronized,Lock等。
- 臨界值:讓多執行緒序列話去訪問資源
- 事件通知:通過事件的通知去保證大家都有序訪問共享資源
- 訊號量:多個任務同時訪問,同時限制數量,比如發令槍CDL,Semaphore等
分散式鎖實現主要以Zookeeper(以下簡稱zk)、Redis、MySQL這三種為主。
Zookeeper分散式鎖
他主要的應用場景有以下幾個:
- 服務註冊與訂閱(共用節點)
- 分散式通知(監聽znode)
- 服務命名(znode特性)
- 資料訂閱、釋出(watcher)
- 分散式鎖(臨時節點)
ZK:他是個資料庫,檔案儲存系統,並且有監聽通知機制(觀察者模式)
節點
zk的節點型別有4大類
-
持久化節點(zk斷開節點還在)
-
持久化順序編號目錄節點
-
臨時目錄節點(客戶端斷開後節點就刪除了)
-
臨時目錄編號目錄節點
節點的建立:
create /test laogong // 建立永久節點
create-e/testlaogong//建立臨時節點
create-s/test//建立順序節點
create-e-s/test//建立臨時順序節點
臨時節點 退出zk後臨時節點消失。。
實現原理:
描述:
利用zk的臨時順序節點 取最小節點 獲取鎖 不是最小節點不獲取 餘下的利用監聽機制 各自監聽自己的前一個節點 前一個節點存在就阻塞 不存在就獲取鎖 當獲取鎖的節點釋放鎖後 刪除自己的臨時順序節點 如果服務宕機也不影響 刪除 後續節點也可以獲取鎖 不會一直阻塞程式碼: