日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
ZooKeeper分布式鎖Curator源碼之一:可重入鎖

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

作者:程序員小航 2021-07-08 09:21:17

大數(shù)據(jù)

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

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、嘉祥網(wǎng)絡(luò)推廣、微信小程序開(kāi)發(fā)、嘉祥網(wǎng)絡(luò)營(yíng)銷、嘉祥企業(yè)策劃、嘉祥品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供嘉祥建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com

 前言

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

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

考慮到如果文章篇幅較長(zhǎng),不太適合閱讀,所以對(duì)文章做了適當(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

  
 
 
 
  1.  
  2.     org.apache.curator 
  3.     curator-recipes 
  4.     5.1.0 
  5.  

 

2加鎖示例

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

加鎖前

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

加鎖中

在 /locks/lock_01 路徑上加鎖。

加鎖之后:

  • 創(chuàng)建了一個(gè) /locks/lock_01 的持久節(jié)點(diǎn),節(jié)點(diǎn)下有一個(gè)子節(jié)點(diǎn) _c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000
  • 節(jié)點(diǎn) /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 是臨時(shí)節(jié)點(diǎn)
  • 節(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

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

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

加鎖

LockInternals#attemptLock

核心部分就是這兩行:

  • createsTheLock 創(chuàng)建臨時(shí)順序節(jié)點(diǎn)
  • 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)整路徑之類的。會(huì)生成一個(gè) UUID 拼接到 /locks/lock_01 中,變成 /locks/lock_01/_c_UUID-lock-。

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

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

創(chuàng)建臨時(shí)節(jié)點(diǎn),如果路徑存在,會(huì)創(chuàng)建成功,如果路徑不存在會(huì)創(chuàng)建失敗;

創(chuàng)建失敗后,先創(chuàng)建路徑,再創(chuàng)建節(jié)點(diǎn)。

4總結(jié)

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

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

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

  • 基于 ZooKeeper 的分布式鎖,是使用的臨時(shí)順序節(jié)點(diǎn),父節(jié)點(diǎn)是持久節(jié)點(diǎn);
  • 創(chuàng)建臨時(shí)節(jié)點(diǎn)時(shí),父節(jié)點(diǎn)不存在,會(huì)先創(chuàng)建父節(jié)點(diǎn)(路徑);
  • 鎖的組成結(jié)構(gòu)為:對(duì) /locks/lock_01 加鎖,實(shí)際鎖住的是 /locks/lock_01/_c_UUID-lock-序號(hào),舉例為 /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

本文轉(zhuǎn)載自微信公眾號(hào)「程序員小航」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序員小航公眾號(hào)。


文章題目:ZooKeeper分布式鎖Curator源碼之一:可重入鎖
標(biāo)題網(wǎng)址:http://www.5511xx.com/article/ccocosi.html