国产另类ts人妖一区二区_欧美肥老太做爰视频_快穿高h肉_国产欧美综合在线

當(dāng)前位置: 首頁 / 技術(shù)干貨 / 正文
ZooKeeper實(shí)現(xiàn)分布式鎖

2023-01-06

節(jié)點(diǎn)    child 分布式

  1. 分布式鎖的介紹

  在Java的多線程部分,我們知道如果在一個(gè)jvm進(jìn)程中,多個(gè)線程之間同時(shí)訪問一個(gè)資源,此時(shí)會(huì)有多線程的安全問題。為了解決這個(gè)線程安全的問題,我們可以使用“鎖”來實(shí)現(xiàn)。但是,多個(gè)jvm進(jìn)程之間如果同時(shí)訪問一個(gè)資源呢?此時(shí)在Java部分學(xué)習(xí)到的“鎖”已經(jīng)不能解決這個(gè)問題了,我們就需要“分布式鎖”來實(shí)現(xiàn)這樣的效果了。

  維基百科對(duì)分布式鎖的定義:

  分布式鎖,是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。在分布式系統(tǒng)中,常常需要協(xié)調(diào)他們的動(dòng)作。如果不同的系統(tǒng)或是同一個(gè)系統(tǒng)的不同主機(jī)之間共享了一個(gè)或一組資源,那么訪問這些資源的時(shí)候,往往需要互斥來防止彼此干擾來保證一致性,在這種情況下,便需要使用到分布式鎖。

  2. 分布式鎖的分類

  在不同的業(yè)務(wù)場景下,分布式鎖也有不同的使用方式,常見的分類有兩種: 阻塞鎖 和 非阻塞鎖。

  阻塞鎖:

  當(dāng)有多個(gè)jvm進(jìn)程同時(shí)訪問一個(gè)共享的資源的時(shí)候,已經(jīng)搶到分布式鎖的jvm進(jìn)程執(zhí)行自己的業(yè)務(wù)邏輯,沒有搶到分布式鎖的jvm進(jìn)程進(jìn)入阻塞狀態(tài)等待。獲取到分布式鎖的jvm進(jìn)程在處理完自己的業(yè)務(wù)邏輯之后,會(huì)將鎖進(jìn)行釋放。

  執(zhí)行自己的業(yè)務(wù)邏輯爭搶分布式鎖事物開始搶到了鎖沒有搶到鎖釋放鎖事務(wù)結(jié)束

分布式鎖-同步

  非阻塞鎖:

  當(dāng)有多個(gè)jvm進(jìn)程同時(shí)訪問一個(gè)共享的資源的時(shí)候,已經(jīng)搶到分布式鎖的jvm進(jìn)程執(zhí)行自己的業(yè)務(wù)邏輯,沒有搶到分布式鎖的jvm進(jìn)程不會(huì)等待,直接結(jié)束,不執(zhí)行任何的業(yè)務(wù)邏輯。

  爭搶分布式鎖執(zhí)行自己的業(yè)務(wù)邏輯事物開始搶到了鎖釋放鎖事務(wù)結(jié)束沒有搶到鎖

分布式鎖-非阻塞

  3. 分布式鎖的原理

  使用ZooKeeper實(shí)現(xiàn)分布式鎖,其實(shí)就是在Zookeeper上進(jìn)行節(jié)點(diǎn)的創(chuàng)建。多個(gè)程序同時(shí)需要操作一個(gè)共享的資源時(shí),可以先在ZooKeeper進(jìn)行節(jié)點(diǎn)的注冊,注冊成功的表示搶到了鎖,注冊失敗的表示沒有獲取到鎖。

  3.1. 使用節(jié)點(diǎn)實(shí)現(xiàn)

  所有的程序向ZooKeeper中注冊同一個(gè)指定名字的節(jié)點(diǎn),首先將節(jié)點(diǎn)創(chuàng)建成功的程序持有鎖,可以操作共享資源。后來的程序在進(jìn)行節(jié)點(diǎn)創(chuàng)建的時(shí)候,發(fā)現(xiàn)鎖已經(jīng)存在了,于是無法重復(fù)注冊。

  3.2. 使用子節(jié)點(diǎn)實(shí)現(xiàn)

  所有的程序向ZooKeeper中的指定節(jié)點(diǎn)下注冊子節(jié)點(diǎn)(需要使用短暫、有序節(jié)點(diǎn)),以節(jié)點(diǎn)的序號(hào)為優(yōu)先級(jí),序號(hào)小的更早注冊,序號(hào)大的晚注冊。于是,序號(hào)小的節(jié)點(diǎn)獲取到鎖,其他的程序依次向前監(jiān)聽節(jié)點(diǎn)。

  以/root節(jié)點(diǎn),5個(gè)程序?yàn)槔?

  A程序注冊節(jié)點(diǎn)/root/child0001

  此時(shí)子節(jié)點(diǎn): { child0001 }

  自己就是序號(hào)最小的節(jié)點(diǎn),可以獲取鎖,執(zhí)行自己的邏輯操作

  B程序注冊節(jié)點(diǎn)/root/child0002

  此時(shí)的子節(jié)點(diǎn): { child0001, child0002 }

  B發(fā)現(xiàn)自己不是最小的節(jié)點(diǎn),說明有人捷足先登了,于是監(jiān)聽自己前面的child0001節(jié)點(diǎn)

  C程序注冊節(jié)點(diǎn)/root/child0003

  此時(shí)的子節(jié)點(diǎn): { child0001, child0002, child0003 }

  C發(fā)現(xiàn)自己不是最小的節(jié)點(diǎn),說明有人捷足先登了,于是監(jiān)聽自己前面的child0002節(jié)點(diǎn)

  此時(shí)A程序執(zhí)行結(jié)束了,由于是短暫類型的節(jié)點(diǎn),因此child0001節(jié)點(diǎn)會(huì)被刪除

  此時(shí)的子節(jié)點(diǎn): { child0002, child0003 }

  B程序由于監(jiān)聽了child0001,因此可以得知這個(gè)節(jié)點(diǎn)已經(jīng)被刪除了,被喚醒之后發(fā)現(xiàn)自己就是最小的節(jié)點(diǎn),獲取到鎖,執(zhí)行邏輯

  D程序注冊節(jié)點(diǎn)/root/child0004

  此時(shí)的子節(jié)點(diǎn): { child0002, child0003, child0004 }

  D發(fā)現(xiàn)自己不是最小的節(jié)點(diǎn),說明有人捷足先登了,于是監(jiān)聽自己前面的child0003節(jié)點(diǎn)

  此時(shí)B程序執(zhí)行結(jié)束了,由于是短暫類型的節(jié)點(diǎn),因此child0002節(jié)點(diǎn)會(huì)被刪除

  此時(shí)的子節(jié)點(diǎn): { child0003, child0004 }

  C程序由于監(jiān)聽了child0002,因此可以得知這個(gè)節(jié)點(diǎn)已經(jīng)被刪除了,被喚醒之后發(fā)現(xiàn)自己就是最小的節(jié)點(diǎn),獲取到鎖,執(zhí)行邏輯

  E程序注冊節(jié)點(diǎn)/root/child0005

  此時(shí)的子節(jié)點(diǎn): { child0003, child0004, child0005 }

  E發(fā)現(xiàn)自己不是最小的節(jié)點(diǎn),說明有人捷足先登了,于是監(jiān)聽自己前面的child0004節(jié)點(diǎn)

  ...

好程序員公眾號(hào)

  • · 剖析行業(yè)發(fā)展趨勢
  • · 匯聚企業(yè)項(xiàng)目源碼

好程序員開班動(dòng)態(tài)

More+
  • HTML5大前端 <高端班>

    開班時(shí)間:2021-04-12(深圳)

    開班盛況

    開班時(shí)間:2021-05-17(北京)

    開班盛況
  • 大數(shù)據(jù)+人工智能 <高端班>

    開班時(shí)間:2021-03-22(杭州)

    開班盛況

    開班時(shí)間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發(fā) <高端班>

    開班時(shí)間:2021-05-10(北京)

    開班盛況

    開班時(shí)間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數(shù)據(jù)分析 <高端班>

    開班時(shí)間:2021-07-12(北京)

    預(yù)約報(bào)名

    開班時(shí)間:2020-09-21(上海)

    開班盛況
  • 云計(jì)算開發(fā) <高端班>

    開班時(shí)間:2021-07-12(北京)

    預(yù)約報(bào)名

    開班時(shí)間:2019-07-22(北京)

    開班盛況
IT培訓(xùn)IT培訓(xùn)
在線咨詢
IT培訓(xùn)IT培訓(xùn)
試聽
IT培訓(xùn)IT培訓(xùn)
入學(xué)教程
IT培訓(xùn)IT培訓(xùn)
立即報(bào)名
IT培訓(xùn)

Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號(hào)-5 京公網(wǎng)安備 11010802035720號(hào)