自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

 前言

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

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

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

1環(huán)境配置

本機三個節(jié)點

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

  1. <dependency> 
  2.     <groupId>org.apache.curator</groupId> 
  3.     <artifactId>curator-recipes</artifactId> 
  4.     <version>5.1.0</version> 
  5. </dependency> 

 

2加鎖示例

詳細信息可參考官方文檔[1]。

加鎖前

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

加鎖中

在 /locks/lock_01 路徑上加鎖。

加鎖之后:

  • 創(chuàng)建了一個 /locks/lock_01 的持久節(jié)點,節(jié)點下有一個子節(jié)點 _c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000
  • 節(jié)點 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 是臨時節(jié)點
  • 節(jié)點 /locks/lock_01/_c_cc4fc045-5a1e-4378-b3c7-8a8d3fb9a37c-lock-0000000000 的數(shù)據(jù)是機器 IP 地址

3加鎖源碼

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

入口

InterProcessMutex#internalLock

開始先從 threadData 中獲取當前線程,這里肯定是沒有的,所以進入 attemptLock 方法。

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

加鎖

LockInternals#attemptLock

核心部分就是這兩行:

  • createsTheLock 創(chuàng)建臨時順序節(jié)點
  • internalLockLoop 判斷是否創(chuàng)建成功

創(chuàng)建臨時順序節(jié)點

StandardLockInternalsDriver#createsTheLock

可以看出節(jié)點的 mode 是 CreateMode.EPHEMERAL_SEQUENTIAL,表示這是一個臨時順序節(jié)點!

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

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

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

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

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

創(chuàng)建臨時節(jié)點,如果路徑存在,會創(chuàng)建成功,如果路徑不存在會創(chuàng)建失敗;

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

4總結(jié)

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

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

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

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

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

 

責(zé)任編輯:武曉燕 來源: 程序員小航
相關(guān)推薦

2021-07-10 10:02:30

ZooKeeperCurator并發(fā)

2021-06-27 21:24:55

RedissonJava數(shù)據(jù)

2021-07-09 06:48:31

ZooKeeperCurator源碼

2021-07-16 07:57:34

ZooKeeperCurator源碼

2020-06-15 08:15:47

分布式鎖系統(tǒng)

2022-01-14 08:35:58

Curator分布式鎖Zookeeper

2017-10-24 11:28:23

Zookeeper分布式鎖架構(gòu)

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2021-07-06 08:37:29

Redisson分布式

2025-04-23 08:50:00

SpringBootCurator分布式鎖

2019-07-16 09:22:10

RedisZookeeper分布式鎖

2020-11-16 12:55:41

Redis分布式鎖Zookeeper

2021-02-28 07:49:28

Zookeeper分布式

2021-07-02 08:51:09

Redisson分布式鎖公平鎖

2021-06-30 14:56:12

Redisson分布式公平鎖

2024-01-30 08:41:33

線程執(zhí)行Redis分布式鎖

2022-10-27 10:44:14

分布式Zookeeper

2022-07-25 06:44:19

ZooKeeper分布式鎖

2021-07-01 09:42:08

Redisson分布式

2018-11-27 16:17:13

分布式Tomcat
點贊
收藏

51CTO技術(shù)棧公眾號