使用Zookeeper實現(xiàn)分布式鎖(二)

常用的鎖思想

1. 樂觀鎖與悲觀鎖

悲觀鎖:就是在并發(fā)環(huán)境下很悲觀,每次拿數(shù)據(jù)都會認為別人要修改數(shù)據(jù),所以每次拿數(shù)據(jù)的時候都會上鎖,這樣有人拿數(shù)據(jù)的時候,其他人就不能進行增刪改查的操作.很多關(guān)系型數(shù)據(jù)庫中用了這種鎖機制.比如行鎖,表鎖.

樂觀鎖:就是并發(fā)情況下很樂觀,每次拿數(shù)據(jù)的時候認為別人不會去修改,所以不會上鎖,而是采用一個version字段作為版本控制,如果別人修改時version與當前數(shù)據(jù)的version不一致的時候,就進行事物回滾.ElasticSearch就是采用的這種方式.但是這種方式會導(dǎo)致數(shù)據(jù)臟讀.

2. 死鎖與活鎖

死鎖:比如一個人進入一個廁所,并上死鎖,外面的人想要進去,但是門已經(jīng)上鎖進不去,也看不到這個廁所里面的內(nèi)容,這就是死鎖.表示一個人拿到了一個共享數(shù)據(jù)(例如一張表),其他人無法對這張表進行增刪改查的操作,除非拿到了這把鎖.

活鎖:比如一個人進入一個廁所,上了活鎖,這樣外面的人可以進來,看廁所里面的內(nèi)容,抽煙也好,但是坑位被占了,不能使用廁所.這就是活鎖,表示一個人拿到一個共享數(shù)據(jù)(例如一張數(shù)據(jù)表),其他人可以進行查詢的操作,但是不能進行增刪改的操作.

分布式環(huán)境下數(shù)據(jù)不一致的場景

現(xiàn)在有一個商城,在網(wǎng)上出售一個產(chǎn)品名為wazi的商品,采用分布式的方式,購買商品的主要業(yè)務(wù)流程如下:

2.png

現(xiàn)在模擬這個訂單服務(wù)部署到兩臺機器上,兩臺機器的進程同時訪問product表,庫存中有產(chǎn)品名為wazi的產(chǎn)品余量只有10雙,但是小A和小B同一時間各下單8雙,我們看看會有什么結(jié)果:

3.png

同時訪問結(jié)果如下:

4.png

由于兩個進程的線程同時進入購買wazi的訂單業(yè)務(wù),在獲取wazi的數(shù)量時都查出來是10雙,于是在后面一起完成了扣除庫存的操作,導(dǎo)致庫存數(shù)量為負數(shù).

那么對于這種會對共享數(shù)據(jù)進行增刪改的操作的業(yè)務(wù),我們需要使用分布式鎖的方式來保證高并發(fā)下的數(shù)據(jù)的一致性問題.

那么我們?nèi)绻褂梅植际芥i需要注意哪些問題?

分布式鎖需要注意的問題

  1. 完成訂單的業(yè)務(wù)后,該鎖是會釋放掉的.如果不能釋放掉,后面的用戶就無法下訂單了.(需要釋放鎖的操作)
  2. 如果用戶關(guān)閉瀏覽器,該鎖會自動釋放掉.(Zookeeper中的臨時節(jié)點,客戶端與服務(wù)端失去連接后,會自動刪除)
  3. 前面的鎖釋放后,后面的用戶要能夠知道鎖已經(jīng)被釋放,并獲得一把鎖(Zookeeper的監(jiān)聽機制)

分布式鎖實現(xiàn)的流程

本例使用的鎖是悲觀活鎖.當一個人拿到了一個共享數(shù)據(jù)的鎖后,其他人可以進行查詢操作,但是不能進行增刪改的操作.

分布式鎖的實現(xiàn)流程如下:

1.png

實現(xiàn)主要的過程是:

  1. 用戶進入訂單購買業(yè)務(wù),首先獲取一把鎖(在Zookeeper中創(chuàng)建一個臨時的znode,其他用戶獲取所也要創(chuàng)建,如果創(chuàng)建失敗,視為獲取鎖失敗,并阻塞當前線程)
  2. 用戶訂單購買的業(yè)務(wù)走完后,主動釋放鎖(在Zookeeper中刪除這個znode)
  3. ZK客戶端監(jiān)聽到對應(yīng)的znode被刪除后,主動喚醒后面的線程主動獲取鎖(CountDownLatch + Zookeeper的Watch機制)

使用Apache Curator實現(xiàn)分布式鎖的主要代碼:

創(chuàng)建一個類DistributedLock,這個類有釋放鎖,創(chuàng)建鎖和監(jiān)聽特定Znode節(jié)點的方法.

  1. 初始化Curator客戶端:
5.png
  1. 獲取分布式鎖
6.png
  1. 釋放分布式鎖
7.png
  1. 在訂單購買業(yè)務(wù)中添加分布式鎖和釋放分布式鎖
9.png

測試

當加上分布式鎖之后,我們在使用相同場景進行測試,

現(xiàn)在模擬這個訂單服務(wù)部署到兩臺機器上,兩臺機器的進程同時訪問product表,庫存中有產(chǎn)品名為wazi的產(chǎn)品余量只有10雙,但是小A和小B同一時間各下單8雙,我們看看會有什么結(jié)果:

購買前:

10.png

并發(fā)訪問后:

11.png

從日志中可以看出,當?shù)谝粋€人進入到訂單購買程序后,后面的用戶則進行了線程等待的狀態(tài),直到前面的用戶購買wazi成功了之后,后面的用戶才進入到訂單購買業(yè)務(wù)中來,最終一開始的人購買成功,后面的用戶購買失敗.

源碼位置

  1. github地址: https://github.com/lilike/chawuzhi.git
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赖条,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子耕皮,更是在濱河造成了極大的恐慌任柜,老刑警劉巖谜洽,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锨天,居然都是意外死亡囱淋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門樊拓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纠亚,“玉大人,你說我怎么就攤上這事筋夏〉侔” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵条篷,是天一觀的道長骗随。 經(jīng)常有香客問我,道長拥娄,這世上最難降的妖魔是什么蚊锹? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮稚瘾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姚炕。我一直安慰自己摊欠,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布柱宦。 她就那樣靜靜地躺著些椒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掸刊。 梳的紋絲不亂的頭發(fā)上免糕,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音,去河邊找鬼石窑。 笑死牌芋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的松逊。 我是一名探鬼主播躺屁,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼经宏!你這毒婦竟也來了犀暑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤烁兰,失蹤者是張志新(化名)和其女友劉穎耐亏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沪斟,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡广辰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了币喧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轨域。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杀餐,靈堂內(nèi)的尸體忽然破棺而出干发,到底是詐尸還是另有隱情,我是刑警寧澤史翘,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布枉长,位于F島的核電站,受9級特大地震影響琼讽,放射性物質(zhì)發(fā)生泄漏必峰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一钻蹬、第九天 我趴在偏房一處隱蔽的房頂上張望吼蚁。 院中可真熱鬧,春花似錦问欠、人聲如沸肝匆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旗国。三九已至,卻和暖如春注整,著一層夾襖步出監(jiān)牢的瞬間能曾,已是汗流浹背度硝。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寿冕,地道東北人蕊程。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蚂斤,于是被迫代替她去往敵國和親存捺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容