分布式或微服務架構中的分布式鎖應用


1. 分布式鎖特征

  在很多分布式或微服務架構產品應用中,有些場景需要加鎖處理,要求分布式鎖具備如下特性:

1、要求每個事物都有各自一把鎖。

2、鎖互斥,不管任何時候,只有一個客戶端能持有同一個鎖。

3、鎖具有自動釋放特征(超時后會自動釋放),確保不會死鎖,最終客戶端一定會得到鎖,就算一個持有鎖的客戶端宕掉。

4、鎖的時效設置。避免單點故障造成死鎖,影響其他客戶端獲取鎖。但是也要保證一旦一個客戶端持鎖,在客戶端可用時不會被其他客戶端解鎖。

5、加鎖的事務或者操作盡量粒度小,減少其他客戶端申請鎖的等待時間,提高處理效率和並發性。

6、客戶端在不再需要鎖或者任務執行完成之后需要主動釋放鎖,這樣其他客戶端就不用等到超時時間再去獲取這個鎖。

7、當一個客戶端嘗試獲取鎖時,如果這個鎖被其他客戶端占用,則立即返回,不做任何業務處理,此目的在於確保同一時刻只有一個客戶端在執行特定網元告警同步操作即可。

8、提供分布式鎖的中間件,需要具有高可靠、容災等特性,確保分布式鎖穩定性。

2. 分布式鎖選型

  分布式鎖以往大部分的解決方案是基於數據庫來實現的,這種方式業務實現比較復雜,比如需要開發人員自行實現鎖超時釋放機制,避免死鎖問題。那么如何找到一款能夠滿足各種應用場景的分布式鎖組件呢?

2.1 ZooKeeper分布式鎖

  ZooKeeper是一個分布式應用程序協調服務,為分布式應用提供一致性服務的組件。ZooKeeper節點結構是一個和文件系統類似的小型的樹狀的目錄結構,同時Zookeeper機制規定:同一個目錄下只能有一個唯一的文件名。例如:在ZooKeeper的根目錄下,由兩個客戶端同時創建一個名為/locks/ne_node,則只有一個客戶端可以創建成功。因此,可以通過ZooKeeper節點為每個待告警同步的網元來創建一個鎖,例如/locks/10.63.204.101就可以定義為一個鎖。ZooKeeper分布式鎖架構示意圖如下:

blob.png 

  另外,ZooKeeper有一種臨時類型的節點,臨時節點由某個客戶端創建,當客戶端因為宕機,與ZooKeeper集群斷開連接時,則該臨時節點會被自動刪除,從而避免了死鎖問題。

客戶端在獲取到鎖之后,開始執行互斥業務邏輯,執行完成后,顯示刪除臨時節點,即可釋放鎖。
 

2.2 Redis分布式鎖

  Redisson在基於NIO的Netty框架上,充分的利用了Redis鍵值數據庫提供的一系列優勢,在Java實用工具包中常用接口的基礎上,為使用者提供了一系列具有分布式特性的常用工具類。Redisson提供了分布式鎖特性,開發者可直接利用開發相關業務。

Redis分布式鎖架構示意圖如下:

blob.png

2.3 分布式鎖比對

 

可重入鎖

持鎖斷開連接后釋放鎖

鎖持久化

優缺點

ZK

支持

支持,臨時節點當連接中斷會刪除鎖

支持

安全性較高,支持鎖持久化存儲,但效率稍低

Redis

支持

支持,過期時間

不支持

安全性較低,不支持鎖持久化存儲,但效率較高

 

3 分布式鎖總結

  除了上面提到的ZooKeeper和Redis外,還有很多技術可以實現分布式鎖。在思考是否采用分布式鎖以及采用哪種實現方案的時候,還是要基於業務,技術方案一定是基於業務基礎,服務於業務,並且衡量過投入產出比的。所以如果有成熟的解決方案,在業務可承受規模肯定是不要重復造輪子,當然還要經過嚴謹的選型和測試。開發者在實際開發中,可權衡利弊,選擇一種最合適業務場景的分布式鎖來實現相關業務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM