博客 / 詳情

返回

什麼是分佈式鎖?他解決了什麼樣的問題?

相信對於朋友們來説,鎖這個東西已經非常熟悉了,在説分佈式鎖之前,我們來聊聊單體應用時候的本地鎖,這個鎖很多小夥伴都會用

✔本地鎖

我們在開發單體應用的時候,為了保證多個線程併發訪問公共資源的時候,期望在同一個時間只能有一個線程去訪問資源,且在這個線程訪問資源結束之後,其他的線程才可以訪問這塊資源

這個時候會使用到鎖機制,一般根據不同的場景會使用到互斥鎖,讀寫鎖,自旋鎖等等🧐🧐

我們還知道使用鎖是會影響效率的

  • 例如如果互斥鎖如果拿不到,那麼會死等,這很浪費資源

<!---->

  • 自旋鎖如果拿不到,則會在原地自旋,一會來問一下,一會又來問一下,效率會受影響

因此還會想辦法去實現原子操作,不需要加鎖的情況下,保證多個線程同步

這些方式都是屬於本地鎖,屬於在同一個進程內可以使用的鎖,目的是能夠控制多線程 併發 訪問資源

可隨着時代的發展,單體應用逐漸演變成微服務架構的時候,發現使用進程裏面的本地鎖已經不適用了,沒有辦法滿足我們的需求了,因此為了解決多進程併發問題,引入了分佈式鎖

為什麼説沒法滿足我們需求呢?

👀舉例時刻

例1

我們有一個全局變量 sum = 0,此時的應用程序中有兩個線程,分別循環 50 次,每一次循環都是對 sum 進行 +1 的操作,我們知道,這種情況,我們需要使用本地鎖例如互斥鎖對 sum 加鎖就可以實現,程序運行完畢後, 輸出的 sum 為 100 ,這個沒有毛病

例2

那麼如果此時場景換成有有兩個應用程序,分別需要去操作第三方資源中的 sum,還是分別操作 50 次,每操作一次即對 sum 進行 +1 操作

那麼這個時候,我們在每個應用中進行加鎖還有意義嗎?

並沒有意義因為此處的 第三方資源,並不單獨屬於任何一個應用進程

就像例1 中, sum 全局變量的資源,並不單獨屬於某一個線程一樣,因此,對於例2,就需要使用分佈式鎖了

🧐什麼是分佈式鎖?

那麼具體分佈式鎖到底是個啥玩意兒?🧐🧐

他自然他也是鎖,只不過是用於控制多進程之間 併發

他是可以跨微服務,跨 虛擬機 的一種鎖機制,上述的本地鎖就完全做不到

那麼還是上述的例 2,我們就這樣使用分佈式鎖來進行處理

可以看到,使用分佈式鎖,和使用本地鎖,其實思想都是一樣的,都是為了控制程序的 併發 訪問資源

都是屬於君子鎖,作為君子訪問資源之前,先去看看能不能拿到鎖,不能壞了規矩,要是壞了這個規矩,那麼程序運行就會出問題

只不過本地鎖是對應控制同一個進程內的多個線程併發

分佈式鎖是對於多個進程 併發

✔分佈式鎖有哪些特點呢?

  1. 互斥

既然是説,最基本的互斥功能,必須得有,不能忘本😉

  1. 鎖有超時機制,可以防止死鎖

對於分佈式鎖來説,為了避免異常未被釋放,會對所加入一個超時機制

例如進程 A 加鎖,但是自己忘記釋放鎖,或者是因為進程 A 因為異常掛掉,最終導致沒有釋放鎖,這個時候,鎖到了超時時間,自動就會釋放

  1. 可重入

一個進程加了鎖,這個進程仍然是可以再次獲取這個鎖的,例如對分佈式鎖不斷的續期,不斷的設置過期時間

可是這裏如果是對於本地鎖,一個線程加了鎖,如果再次加鎖,那麼就死鎖了

  1. 可以高性能的取鎖和加鎖

<!---->

  1. 高可用

從上述我們可以看到引入的分佈式鎖,實際上不是進程內部的資源,可以理解為他是一個第三方的資源,是一箇中間件

自然使用這些中間件中來實現所的話,一般會使用集羣,集羣自然會去實現自己的高可用機制,如果某些節點出現了異常,自身提供出來的機制,外部程序仍然可以使用

此處提到的中間件一般都有這些:

  • Redis

<!---->

  • Etcd

<!---->

  • Mysql

<!---->

  • Zookeeper

每一個組件去實現分佈式鎖的原理和機制是不一樣的,但是達到的目的是一樣的, 都是為了控制多進程併發。

  1. 分佈式鎖需要是非阻塞的

某個進程如果獲取分佈式鎖,發現拿不到,則會返回 false , 這個進程就會去處理自己拿不到鎖的邏輯,進程不會因為沒有拿到鎖而阻塞

🔥總結

那麼看到這裏,能否回答標題的問題呢?

  • 什麼是分佈式鎖?

他是可以跨微服務,跨 虛擬機 的一種鎖機制

  • 分佈式鎖解決了什麼問題?

他解決了在分佈式系統中,訪問共享資源的問題

感謝閲讀,歡迎交流,點個贊,關注一波 再走吧

歡迎點贊,關注,收藏

朋友們,你的支持和鼓勵,是我堅持分享,提高質量的動力

好了,本次就到這裏

技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。

我是阿兵雲原生,歡迎點贊關注收藏,下次見~

文中提到的技術點,感興趣的可以查看這些文章:

  • 我是如何用 redis 分佈式鎖來解決線上歷史業務問題的

<!---->

  • C 語言的 互斥鎖、自旋鎖、原子操作
user avatar xuxiaocong_5e947e5ce588a 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.