<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ZooKeeper 分布式鎖 Curator 源碼 01:可重入鎖

          共 2177字,需瀏覽 5分鐘

           ·

          2021-07-12 06:50

          前言

          一般工作中常用的分布式鎖,就是基于 Redis 和 ZooKeeper,前面已經(jīng)介紹完了 Redisson 鎖相關(guān)的源碼,下面一起看看基于 ZooKeeper 的鎖。也就是 Curator 這個(gè)框架。

          Curator 的鎖也分為很多種,本文分析共享可重入鎖。

          考慮到如果文章篇幅較長,不太適合閱讀,所以對文章做了適當(dāng)?shù)牟鸱帧?/p>

          1

          環(huán)境配置

          本機(jī)三個(gè)節(jié)點(diǎn)

          版本:3.7.0 系統(tǒng):macOS 安裝方式:brew install zookeeper Curator Maven 依賴版本:5.1.0

          <dependency>
              <groupId>org.apache.curator</groupId>
              <artifactId>curator-recipes</artifactId>
              <version>5.1.0</version>
          </dependency>

          2

          加鎖示例

          詳細(xì)信息可參考官方文檔[1]

          加鎖前

          在加鎖之前,ZooKeeper 僅有一個(gè)節(jié)點(diǎn) /zookeeper

          加鎖中

          /locks/lock_01 路徑上加鎖。

          加鎖之后:

          1. 創(chuàng)建了一個(gè) /locks/lock_01 的持久節(jié)點(diǎn),節(jié)點(diǎn)下有一個(gè)子節(jié)點(diǎn) _c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000
          2. 節(jié)點(diǎn) /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 是臨時(shí)節(jié)點(diǎn)
          3. 節(jié)點(diǎn) /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 的數(shù)據(jù)是機(jī)器 IP 地址

          3

          加鎖源碼

          PS:下面代碼截圖中的代碼風(fēng)格就是 Curator 源碼的代碼風(fēng)格。

          入口

          InterProcessMutex#internalLock

          開始先從 threadData 中獲取當(dāng)前線程,這里肯定是沒有的,所以進(jìn)入 attemptLock 方法。

          本方法中還包含了鎖重入的邏輯,后面也會介紹。

          加鎖

          LockInternals#attemptLock

          核心部分就是這兩行:

          1. createsTheLock 創(chuàng)建臨時(shí)順序節(jié)點(diǎn)
          2. internalLockLoop 判斷是否創(chuàng)建成功

          創(chuàng)建臨時(shí)順序節(jié)點(diǎn)

          StandardLockInternalsDriver#createsTheLock

          可以看出節(jié)點(diǎn)的 mode 是 CreateMode.EPHEMERAL_SEQUENTIAL,表示這是一個(gè)臨時(shí)順序節(jié)點(diǎn)

          進(jìn)入 CreateBuilderImpl#forPath(java.lang.String, byte[])

          client.getDefaultData() 就是本機(jī) IP 地址。

          這個(gè) adjustPath 方法看名字就是在調(diào)整路徑之類的。會生成一個(gè) UUID 拼接到 /locks/lock_01 中,變成 /locks/lock_01/_c_UUID-lock-

          因?yàn)閯?chuàng)建的是臨時(shí)順序節(jié)點(diǎn),所以會自動在后面添加順序,最終變?yōu)?/locks/lock_01/_c_UUID-lock-0000000000

          具體創(chuàng)建節(jié)點(diǎn)是在 CreateBuilderImpl#pathInForeground 中。

          1. 創(chuàng)建臨時(shí)節(jié)點(diǎn),如果路徑存在,會創(chuàng)建成功,如果路徑不存在會創(chuàng)建失敗;
          2. 創(chuàng)建失敗后,先創(chuàng)建路徑,再創(chuàng)建節(jié)點(diǎn)。

          4

          總結(jié)

          本篇文章主要介紹了基于 ZooKeeper 的分布式鎖框架 Curator 的使用,以及加鎖流程,源碼分析。

          下面對內(nèi)容做下總結(jié):

          重點(diǎn)需要關(guān)注的是:

          1. 基于 ZooKeeper 的分布式鎖,是使用的臨時(shí)順序節(jié)點(diǎn),父節(jié)點(diǎn)是持久節(jié)點(diǎn);
          2. 創(chuàng)建臨時(shí)節(jié)點(diǎn)時(shí),父節(jié)點(diǎn)不存在,會先創(chuàng)建父節(jié)點(diǎn)(路徑);
          3. 鎖的組成結(jié)構(gòu)為:對 /locks/lock_01 加鎖,實(shí)際鎖住的是 /locks/lock_01/_c_UUID-lock-序號,舉例為 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000


          引用鏈接:

          [1]

          ZooKeeper Shared Reentrant Lock: https://curator.apache.org/curator-recipes/shared-reentrant-lock.html



          - <End /> -




          歷史文章 | 相關(guān)推薦




          瀏覽 51
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一级黄片免费观看 | 国产无码15p | 日韩黄色网络 | 自拍偷拍激情网 | 不卡天堂网|