分佈式服務治理
服務協調
分佈式協調主要用來解決分佈式環境中多個進程之間的同步,讓他們有序的去訪問臨界資源,防止造成髒數據的後果。
分佈式鎖是分佈式協調技術的核心內容。
分佈式鎖的實現方式
-
基於緩存(redis)實現分佈式鎖
-
獲取鎖的時候,使用
setnx
加鎖,並使用expire
命令爲鎖添加一個超時時間,超過該時間自動釋放鎖,鎖的value
值爲一個隨機生成的UUID,釋放鎖的時候進行判斷。 -
獲取鎖的時候,還設置一個獲取的超時時間,若超過這個時間放棄獲取鎖。
-
釋放鎖的時候,通過UUID判斷是不是改鎖,若是改鎖,則執行
delete
進行鎖釋放。setnx:set一個key爲value的字符串,返回1。若key存在,則什麼都不做,返回0。
expire:爲key設置一個超時時間,單位爲second,超過這個時間鎖自動釋放,避免死鎖。
delete:刪除key
-
-
Zookeeper是一個爲分佈式應用提供一致性服務的開源組件,它的內部是一個分層的文件系統目錄樹結構,規定同一個目錄下只能有一個唯一的文件名,基於Zookeeper實現分佈式鎖的步驟如下:
- 創建一個目錄mylock
- 線程A想獲取鎖就在目錄mylock下創建臨時順序節點
- 獲取mylock目錄下的所有子節點,然後獲取比自己小的兄弟節點,如果不存在說明當前順序號最小,獲得鎖
- 線程B獲取多有節點,然後判斷自己是不是最小節點,設置監聽比自己小的節點
- 線程A處理完,刪除自己的節點,線程B監聽到變更事件,判斷自己是不是最小節點,如果是獲得鎖