1. 程式人生 > 實用技巧 >Zookeeper紹二(分散式鎖介)

Zookeeper紹二(分散式鎖介)

一、為什麼會有分散式鎖?

在多執行緒環境下,由於上下文的切換,資料可能出現不一致的情況或者資料被汙染,我們需要保證資料安全,所以想到了加鎖。

所謂的加鎖機制呢,就是當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問,直到該執行緒讀取完,其他執行緒才可使用。

我們為了減少DB的壓力,把庫存預熱到了KV,現在KV的庫存是1。

  1. 服務A去Redis查詢到庫存發現是1,那說明我能搶到這個商品對不對,那我就準備減一了,但是還沒減。
  2. 同時服務B也去拿發現也是1,那我也搶到了呀,那我也減。
  3. C同理。
  4. 等所有的服務都判斷完了,你發現誒,怎麼變成-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的臨時順序節點 取最小節點 獲取鎖 不是最小節點不獲取 餘下的利用監聽機制 各自監聽自己的前一個節點 前一個節點存在就阻塞 不存在就獲取鎖 當獲取鎖的節點釋放鎖後 刪除自己的臨時順序節點 如果服務宕機也不影響 刪除 後續節點也可以獲取鎖 不會一直阻塞

程式碼: