本文分享自華為雲社群《分布式系統中如何實作臨界資源的互斥通路-雲社群-華為雲》,作者:華為雲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.
點選下方,第一時間了解華為雲新鮮技術~
華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲