如何實現靠譜的分佈式鎖?

---劉通曉---


實現分佈式鎖常採用兩種方式,一種是基於redis,一種基於zookeeper

基於Redis 的分佈式鎖

基於redis的分佈式鎖實現原理是使用redis的set nx ,就是當key不存在時才能設置成功,否則返回false,多實例併發去獲取鎖時由於redis的原子性以及set nx的特性,有一個實例能設置成功後,其他實例則不能獲取鎖,這時設置成功的實例拿到了這把鎖,其他的實例自然沒能拿到鎖。

存在問題:redis很容易單點故障,如果使用官方的redlock也存在很大大爭議,而且實現複雜,所以一般基於zookeeper實現。

基於zookeeper的實現

在zookeeper的某一節點下多個實例創建同一個臨時節點,由於zookeeper中同一個節點是唯一的,也就是隻有一個實例能創建成功,創建成功則獲取到鎖,否則不該持有鎖。zookeeper是基於paxios算法的,能保證高可用,強一致性,性能比redis實現稍弱。


如何避免死鎖

redis在設置鎖時提供超時時間,如果客戶端宕機,在超時時間過後鎖自動釋放。

zookeeper是使用臨時節點,一旦客戶端宕機也會自動刪除。


分享到:


相關文章: