摘要:一次僅允許一個行程使用的資源稱為臨界資源,
本文分享自華為云社區《分布式系統中如何實作臨界資源的互斥訪問》,作者:華為云PaaS服務小智,
網路時代,購物、社交等之前只能在線下進行的活動,如今都可以在網路上完成,為了促進消費,電商網、網路店鋪經常推出商品限定數量內的“秒殺”,“搶購”活動,類似的臨界資源訪問還有我們生活中常見的微信多人搶紅包,這種臨界資源,多人訪問的情況,如何保證避免一個資源被多人(一人以上)互斥訪問呢?
臨界資源
多道程式系統中存在許多行程,它們共享各種資源,然而有很多資源一次只能供一個行程使用,一次僅允許一個行程使用的資源稱為臨界資源,
上面我們提到的在搶購中對商品提交訂單,微信中打開多人紅包都屬于這種臨界資源的訪問,一次只允許一個行程使用,
臨界資源互斥訪問
分布式互斥是隨著分布式系統的出現而出現的,并隨著分布式系統理論發展而發展,在分布式系統中,很多行程能夠在微觀上并行執行,但由于共享資源的有限性,以及全域資料要求的一致性,一些臨界資源的訪問需要以互斥的方式實作同步,
Java原生鎖
在傳統單機部署的情況下,可以使用Java并發處理相關的API(如ReentrantLock或synchronized)進行互斥控制,這種Java提供的原生鎖機制可以保證在同一個Java虛擬機行程內的多個執行緒同步執行,避免出現無序現象,
但在互聯網場景,特別是搶購活動中,隨著整個系統的并發訪問飆升,需要多臺機器并發運行,以應對用戶井噴式訪問,假設此時多個用戶的請求同時到來,但落在了不同的機器上,雖然這兩個請求是可以同時執行,但是因為兩個機器運行在兩個不同的Java虛擬機里面,他們加的鎖只對屬于自己Java虛擬機里面的執行緒有效,對于其他Java虛擬機的執行緒是無效的,因此,Java提供的原生鎖機制在多機部署場景下失效了,這是因為兩臺機器加的鎖不是同一個鎖(兩個鎖在不同的Java虛擬機里面),這樣便會出現庫存超賣的現象,
分布式鎖
基于存在的現狀,我們只要保證多臺機器加的鎖是同一個鎖,用加鎖的方式對某種資源進行順序訪問控制,這就需要分布式鎖登場了,
分布式鎖是一種解決分布式臨界資源并發讀寫的一種技術,對分布式應用加鎖,能夠避免出現庫存超賣及無序訪問等現象,
分布式鎖的思路是:在整個系統提供一個全域、唯一的獲取鎖的“東西”,然后每個系統在需要加鎖時,都去問這個“東西”拿到一把鎖,這樣不同的系統拿到的就可以認為是同一把鎖,
當前分布式加鎖主要有三種方式:(磁盤)資料庫、快取資料庫、Zookeeper,
用 Redis 實作分布式鎖
使用Redis型別的快取實體實作分布式加鎖,有幾大優勢:
? 加鎖操作簡單,使用SET、GET、DEL等幾條簡單命令即可實作鎖的獲取和釋放,
? 性能優越,快取資料的讀寫優于磁盤資料庫與Zookeeper,
如下圖中所示,使用redis的set方法即可實作對臨界資源加鎖,點擊此獲取全量代碼 ,
使用redis的del方法即可實作鎖的釋放,
相對于傳統redis,如今各大云廠商也都推出了redis云服務,以即開即用、安全可靠、彈性擴容、便捷管理等特點受到軟體開發企業和開發者的歡迎,
參考資料
李美安. 普適分布式互斥演算法及應用[D]. 電子科技大學, 2006.
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/509343.html
標籤:其他
