一、緣起 分散式環境下,多台機器上多個進程對一個數據進行操作,如果不做互斥,就有可能出現“餘額扣成負數”,或者“商品超賣”的情況,如何實現簡易分散式鎖,對分散式環境下的臨界資源做互斥,是今天將要討論的話題。 二、互斥原理 原理:多個訪問方對同一個資源進行操作,需要進行互斥,通常是利用一個這些訪問方同 ...
一、緣起
分散式環境下,多台機器上多個進程對一個數據進行操作,如果不做互斥,就有可能出現“餘額扣成負數”,或者“商品超賣”的情況,如何實現簡易分散式鎖,對分散式環境下的臨界資源做互斥,是今天將要討論的話題。
二、互斥原理
原理:多個訪問方對同一個資源進行操作,需要進行互斥,通常是利用一個這些訪問方同時能夠訪問到的lock來實施互斥的。
例子1:同一個進程內,多個線程的互斥,典型的場景是生產者消費者對同一個queue進行操作時的互斥
方案:設定一個所有線程能夠訪問到的lock實施互斥
步驟:
(1)多個線程同時搶鎖
(2)只一個線程搶到,未搶到的阻塞,或下次再來搶
(3)搶到鎖的線程操作臨界資源
(4)操作完臨界資源後釋放鎖
例子2:同一個操作系統上,多個進程的互斥,典型的場景是手機上多個APP對同一個文件進行寫入互斥
方案:設定一個所有進程能夠訪問到的lock實施互斥(例如文件inode,OS幫我們做了)
步驟:
(1)多個進程同時搶鎖
(2)只一個進程搶到,未搶到的阻塞,或下次再來搶
(3)搶到鎖的進程操作臨界資源
(4)操作完臨界資源後釋放鎖
三、分散式環境下多進程互斥
分散式環境下,多台機器上多個進程對一個數據進行操作的互斥,例如同一個uid=123要避免同時進行扣款。
根據上面的原理,先找一個多台機器多個進程可以同時訪問到的一個lock,例如redis。
步驟:
(1)多台機器上多個進程對這個鎖進行爭搶,例如在緩存上同時進行set key=123操作
(2)只有一個進程會搶到這個鎖,即只有一個進程對緩存set key=123能夠成功,不成功的進程下次再來搶
(3)搶到鎖的進程對餘額進行扣減
(4)扣減完成之後釋放鎖,即對緩存delete key=123
分散式環境下的互斥,搞定。
【文章轉載自微信公眾號“架構師之路”】