鎖的概述
分佈式鎖
分佈式鎖其實可以理解爲: 控制分佈式系統有序的去對共享資源進行操作,通過互斥來保持一致性 。 舉個不太恰當的例子:假設共享的資源就是一個房子,裏面有各種書,分佈式系統就是要進屋看書的人,分佈式鎖就是保證這個房子只有一個門並且一次只有一個人可以進,而且門只有一把鑰匙。然後許多人要去看書,可以,排隊,第一個人拿着鑰匙把門打開進屋看書並且把門鎖上,然後第二個人沒有鑰匙,那就等着,等第一個出來,然後你在拿着鑰匙進去,然後就是以此類推。
爲什麼要用鎖
螞蟻金服十年架構師教你怎麼從零開始學習分佈式鎖
- 多任務環境中才需要
- 任務都需要對同一共享資源進行寫操作;
- 對資源的訪問是互斥的
爲了保證一個方法在高併發情況下的同一時間只能被同一個線程執行,在傳統單體應用單機部署的情況下,可以使用Java併發處理相關的API(如ReentrantLcok或synchronized)進行互斥控制。但是,隨着業務發展的需要,原單體單機部署的系統被演化成分佈式系統後,由於分佈式系統多線程、多進程並且分佈在不同機器上,這將使原單機部署情況下的併發控制鎖策略失效,爲了解決這個問題就需要一種跨JVM的互斥機制來控制共享資源的訪問,這就是分佈式鎖要解決的問題。
分佈式鎖方案比較
螞蟻金服十年架構師教你怎麼從零開始學習分佈式鎖
模板方法模式
在父類中編排主流程,將步驟實現延遲到子類去實現。
螞蟻金服十年架構師教你怎麼從零開始學習分佈式鎖
- 定義鎖的接口Lock
- 在AbstractLock模板鎖裏面實現getLock方法,實現通用的邏輯。
- 不能確實的步驟,作爲虛擬方法,甩鍋給子類實現。
- 子類只需要聚焦自己的小步驟邏輯,實現tryLock,waitLock,unLock方法
基於Zookpper分佈式鎖
Zookeeper 數據結構
螞蟻金服十年架構師教你怎麼從零開始學習分佈式鎖
- ZooKeeper數據結構類似Linux
- 每一個節點都有值
zookeeper在底層其實只提供了兩個功能
- 管理(存儲,讀取)用戶程序提交的數據;
- 併爲用戶程序提供數據節點監聽服務
zookeeper 節點類型
- **PERSISTENT-持久化目錄節點 **客戶端與zookeeper斷開連接後,該節點依舊存在
- PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點 客戶端與zookeeper斷開連接後,該節點依舊存在,只是 Zookeeper給該節點名稱 進行順序編號
- EPHEMERAL-臨時目錄節點 客戶端與zookeeper斷開連接後,該節點被刪除
- **EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點 **客戶端與zookeeper斷開連接後,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號
watcher機制圖示
螞蟻金服十年架構師教你怎麼從零開始學習分佈式鎖
watcher(觀察者模式)
螞蟻金服十年架構師教你怎麼從零開始學習分佈式鎖
觀察者模式要素:
- 目標 — 店鋪老闆(事件源 )
- 觀察者 — 客戶(事件消費者 )
- 事件 — 電話響了
zookeeper 基於同名節點的分佈式鎖
關注公衆號免費領取資料:分佈式架構、高可擴展、高性能、高並 發、Jvm性能調優、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。