【58沈劍架構系列】一分鐘實現分佈式鎖

1、緣起node

分佈式環境下,多臺機器上多個進程對一個數據進行操做,若是不作互斥,就有可能出現「餘額扣成負數」,或者「商品超賣」的狀況,如何實現簡易分佈式鎖,對分佈式環境下的臨界資源作互斥,是今天將要討論的話題。redis

2、互斥原理緩存

原理:多個訪問方對同一個資源進行操做,須要進行互斥,一般是利用一個這些訪問方同時可以訪問到的lock來實施互斥的。微信

例子1:同一個進程內,多個線程的互斥,典型的場景是生產者消費者對同一個queue進行操做時的互斥架構

方案:設定一個全部線程可以訪問到的lock實施互斥分佈式

步驟:ui

(1)多個線程同時搶鎖操作系統

(2)只一個線程搶到,未搶到的阻塞,或下次再來搶線程

(3)搶到鎖的線程操做臨界資源blog

(4)操做完臨界資源後釋放鎖

例子2:同一個操做系統上,多個進程的互斥,典型的場景是手機上多個APP對同一個文件進行寫入互斥

方案:設定一個全部進程可以訪問到的lock實施互斥(例如文件inode,OS幫咱們作了)

步驟:

(1)多個進程同時搶鎖

(2)只一個進程搶到,未搶到的阻塞,或下次再來搶

(3)搶到鎖的進程操做臨界資源

(4)操做完臨界資源後釋放鎖

3、分佈式環境下多進程互斥

分佈式環境下,多臺機器上多個進程對一個數據進行操做的互斥,例如同一個uid=123要避免同時進行扣款。

根據上面的原理,先找一個多臺機器多個進程能夠同時訪問到的一個lock,例如redis。

步驟:

(1)多臺機器上多個進程對這個鎖進行爭搶,例如在緩存上同時進行set key=123操做

(2)只有一個進程會搶到這個鎖,即只有一個進程對緩存set key=123可以成功,不成功的進程下次再來搶

(3)搶到鎖的進程對餘額進行扣減

(4)扣減完成以後釋放鎖,即對緩存delete key=123

分佈式環境下的互斥,搞定。

 

【文章轉載自微信公衆號「架構師之路」】

相關文章
相關標籤/搜索