精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官問用Zookeeper怎么實現分布式鎖,你知道嗎???

開發 前端
因為每次在創建鎖和釋放鎖的過程中,都要動態創建、銷毀瞬時節點來實現鎖功能。大家知道,ZK中創建和刪除節點只能通過Leader?服務器來執行,然后Leader服務器還需要將數據同不到所有的Follower機器上,這樣頻繁的網絡通信,性能的短板是非常突出的。

?概述

提到鎖,想必大家可能最先想到的是Java JUC中的synchronized?關鍵字或者可重入鎖ReentrantLock。它能夠保證我們的代碼在同一個時刻只有一個線程執行,保證數據的一致性和完整性。但是它僅限于單體項目,也就是說它們只能保證單個JVM應用內線程的順序執行。

如果你部署了多個節點,也就是分布式場景下如何保證不同節點在同一時刻只有一個線程執行呢?場景的業務場景比如秒殺、搶優惠券等,這就引入了我們的分布式鎖,本文我們主要講解利用Zookeeper的特性如何來實現我們的分布式鎖。

Zookeeper分布式鎖實現原理

利用Zookeeper的臨時順序節點和監聽機制兩大特性,可以幫助我們實現分布式鎖。

圖片

  1. 首先得有一個持久節點/locks, 路徑服務于某個使用場景,如果有多個使用場景建議路徑不同。
  2. 請求進來時首先在/locks創建臨時有序節點,所有會看到在/locks下面有seq-000000000, seq-00000001 等等節點。
  3. 然后判斷當前創建得節點是不是/locks路徑下面最小的節點,如果是,獲取鎖,不是,阻塞線程,同時設置監聽器,監聽前一個節點。
  4. 獲取到鎖以后,開始處理業務邏輯,最后delete當前節點,表示釋放鎖。
  5. 后一個節點就會收到通知,喚起線程,重復上面的判斷。

大家有沒有想過為什么要設置對前一個節點的監聽?

主要為了避免羊群效應。所謂羊群效應就是一個節點掛掉,所有節點都去監聽,然后做出反應,這樣會給服務器帶來巨大壓力,所以有了臨時順序節點,當一個節點掛掉,只有它后面的那一個節點才做出反應。

原生Zookeeper客戶端實現分布式鎖

通過原生zookeeper api方式的實現,可以加強我們對zk實現分布式鎖原理的理解。

public class DistributedLock {

private String connectString = "10.100.1.176:2281";

private int sessionTimeout = 2000;

private ZooKeeper zk;

private String rootNode = "lock";

private String subNode = "seq-";

private String waitPath;

// 當前client創建的子節點
private String currentNode;

private CountDownLatch countDownLatch = new CountDownLatch(1);

private CountDownLatch waitDownLatch = new CountDownLatch(1);

public DistributedLock() throws IOException, InterruptedException, KeeperException {
zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 如果連接建立時,喚醒 wait 在該 latch 上的線程
if(event.getState() == Event.KeeperState.SyncConnected) {
countDownLatch.countDown();
}

// 發生了 waitPath 的刪除事件
if(event.getType() == Event.EventType.NodeDeleted && event.getPath().equals(waitPath)) {
waitDownLatch.countDown();
}
}
});

// 等待連接建立,因為連接建立時異步過程
countDownLatch.await();
// 獲取根節點
Stat stat = zk.exists("/" + rootNode, false);
// 如果根節點不存在,則創建根節點
if(stat == null) {
System.out.println("創建根節點");
zk.create("/" + rootNode, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
}

public void zkLock() {
try {
// 在根節點創建臨時順序節點
currentNode = zk.create("/" + rootNode + "/" + subNode, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

// 獲取子節點
List<String> childrenNodes = zk.getChildren("/" + rootNode, false);
// 如果只有一個子節點,說明是當前節點,直接獲得鎖
if(childrenNodes.size() == 1) {
return;
} else {
//對根節點下的所有臨時順序節點進行從小到大排序
Collections.sort(childrenNodes);
//當前節點名稱
String thisNode = currentNode.substring(("/" + rootNode + "/").length());
//獲取當前節點的位置
int index = childrenNodes.indexOf(thisNode);
if (index == -1) {
System.out.println("數據異常");
} else if (index == 0) {
// index == 0, 說明 thisNode 在列表中最小, 當前client 獲得鎖
return;
} else {
// 獲得排名比 currentNode 前 1 位的節點
this.waitPath = "/" + rootNode + "/" + childrenNodes.get(index - 1);
// 在 waitPath節點上注冊監聽器, 當 waitPath 被刪除時,zookeeper 會回調監聽器的 process 方法
zk.getData(waitPath, true, new Stat());
//進入等待鎖狀態
waitDownLatch.await();
}
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public void zkUnlock() {
try {
zk.delete(this.currentNode, -1);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
}
}

測試代碼如下:

public class DistributedLockTest {

public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
DistributedLock lock1 = new DistributedLock();
DistributedLock lock2 = new DistributedLock();

new Thread(() -> {
// 獲取鎖對象
try {
lock1.zkLock();
System.out.println("線程 1 獲取鎖");
Thread.sleep(5 * 1000);
System.out.println("線程 1 釋放鎖");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock1.zkUnlock();
}
}).start();

new Thread(() -> {
// 獲取鎖對象
try {
lock2.zkLock();
System.out.println("線程 2 獲取鎖");
Thread.sleep(5 * 1000);

System.out.println("線程 2 釋放鎖");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock2.zkUnlock();
}
}).start();
}
}

測試結果:

線程 2 獲取鎖
線程 2 釋放鎖
線程 1 獲取鎖
線程 1 釋放鎖

獲取鎖和釋放鎖成對出現,說明分布式鎖生效了。

Curator框架實現分布式鎖

在實際的開發鐘,我們會直接使用成熟的框架Curator客戶端,它里面封裝了分布式鎖的實現,避免我們去重復造輪子。

pom.xml添加如下依賴

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

通過InterProcessLock實現分布式鎖

public class CuratorLockTest {

private String connectString = "10.100.1.14:2181";

private String rootNode = "/locks";

public static void main(String[] args) {

new CuratorLockTest().testLock();

}

public void testLock() {
// 分布式鎖1
InterProcessLock lock1 = new InterProcessMutex(getCuratorFramework(), rootNode);
// 分布式鎖2
InterProcessLock lock2 = new InterProcessMutex(getCuratorFramework(), rootNode);
// 第一個線程
new Thread(() -> {
// 獲取鎖對象
try {
lock1.acquire();
System.out.println("線程 1 獲取鎖");
// 測試鎖重入
lock1.acquire();
System.out.println("線程 1 再次獲取鎖");
Thread.sleep(5 * 1000);
lock1.release();
System.out.println("線程 1 釋放鎖");
lock1.release();
System.out.println("線程 1 再次釋放鎖");
} catch (Exception e) {
e.printStackTrace();
}
}).start();

// 第二個線程
new Thread(() -> {
// 獲取鎖對象
try {
lock2.acquire();
System.out.println("線程 2 獲取鎖");
// 測試鎖重入
lock2.acquire();
System.out.println("線程 2 再次獲取鎖");
Thread.sleep(5 * 1000);
lock2.release();
System.out.println("線程 2 釋放鎖");
lock2.release();
System.out.println("線程 2 再次釋放鎖");
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}

public CuratorFramework getCuratorFramework() {
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString(connectString).connectionTimeoutMs(2000)
.sessionTimeoutMs(2000)
.retryPolicy(new ExponentialBackoffRetry(3000, 3)).build();
// 連接
client.start();
System.out.println("zookeeper 初始化完成...");
return client;
}
}

結果展示

線程 1 釋放鎖
線程 1 再次釋放鎖
線程 2 獲取鎖
線程 2 再次獲取鎖
線程 2 釋放鎖
線程 2 再次釋放鎖

有興趣的看下源碼,它是通過wait、notify來實現阻塞。

代碼: https://github.com/alvinlkk/awesome-java-full-demo/tree/master/zookeeper-demo/zookeeper-lock

總結

ZooKeeper?分布式鎖(如InterProcessMutex),能有效的解決分布式鎖問題,但是性能并不高。

因為每次在創建鎖和釋放鎖的過程中,都要動態創建、銷毀瞬時節點來實現鎖功能。大家知道,ZK中創建和刪除節點只能通過Leader?服務器來執行,然后Leader服務器還需要將數據同不到所有的Follower機器上,這樣頻繁的網絡通信,性能的短板是非常突出的。

在高性能,高并發的場景下,不建議使用ZooKeeper?的分布式鎖,可以使用Redis?的分布式鎖。而由于ZooKeeper?的高可用特性,所以在并發量不是太高的場景,推薦使用ZooKeeper的分布式鎖。

責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2023-11-10 08:44:13

分布式鎖分布式系統

2024-09-24 16:30:46

分布式鎖Redis數據中間件

2022-08-11 18:27:50

面試Redis分布式鎖

2025-07-22 01:33:00

分布式Zookeeper

2024-02-22 17:02:09

IDUUID雪花算法

2020-12-15 10:20:24

分布式鎖RedisZookeeper

2021-10-09 11:34:59

MySQL分布式鎖庫存

2025-03-05 00:00:00

RTKRedux開發

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2020-11-16 12:55:41

Redis分布式鎖Zookeeper

2019-07-16 09:22:10

RedisZookeeper分布式鎖

2021-02-28 07:49:28

Zookeeper分布式

2024-09-29 09:12:47

分布式系統性能

2018-02-06 09:06:03

主流分布式存儲系統

2022-11-28 17:01:49

接口分布式鎖

2022-07-06 08:01:05

數據庫分布式

2021-06-03 08:55:54

分布式事務ACID

2022-10-27 10:44:14

分布式Zookeeper

2020-09-27 06:52:22

分布式存儲服務器

2025-07-17 00:05:00

MCPAI 技術Nacos 3.0
點贊
收藏

51CTO技術棧公眾號

欧美日精品一区视频| 国产激情视频在线播放| 三级无遮挡在线观看| 一区二区三区电影大全| 日韩精品中文字幕第1页| 玉米视频成人免费看| 69av成年福利视频| 99日在线视频| 免费成人av电影| 欧美va天堂在线| 91国内精品野花午夜精品| 99在线观看视频| 99热6这里只有精品| 午夜伦理福利在线| 国产成人免费视频 | 国产午夜无码视频在线观看| 9999精品| 欧美高清在线一区| 欧美一区视频在线| 中国极品少妇xxxx| 亚洲卡一卡二| 久久99日本精品| 国产亚洲精品成人av久久ww| 日本精品www| 四虎永久在线精品免费网址| 亚洲视频免费| 日韩一区二区精品葵司在线| 久久免费视频2| 夜夜嗨av禁果av粉嫩avhd| 蜜桃精品wwwmitaows| 五月婷婷久久丁香| 风间由美久久久| 99视频只有精品| 成人在线日韩| 日韩一区在线看| 国产欧美精品一区二区三区-老狼| japanese中文字幕| 户外露出一区二区三区| 久久精品一区二区三区不卡牛牛 | 国产又粗又猛又爽又黄视频| 精品国产乱码久久久久久果冻传媒| 欧美视频一二三| 久久久com| 六月丁香激情综合| 神马电影久久| 欧美tk—视频vk| 国产精品国产对白熟妇| 三级在线观看网站| 九一九一国产精品| 国产精品69av| a在线播放不卡| 91av视频在线观看| 国产亚洲精品女人久久久久久| 亚洲三级av| 亚洲一线二线三线视频| 国产精品一区二区三区免费观看| 日本熟妇色xxxxx日本免费看| 欧美巨大xxxx| 91成人在线观看喷潮| 久久综合色一本| 少妇又紧又色又爽又刺激视频| 欧美电影一二区| 日韩视频一区二区| 肉色超薄丝袜脚交| 黄视频免费在线看| 欧美激情在线看| 91网站在线看| 日韩精品一区三区| 好看不卡的中文字幕| 久久网福利资源网站| 在线观看亚洲免费视频| 亚洲精品一区在线| 日韩午夜在线观看视频| 99久久综合网| 手机在线观看av| 国产精品视频麻豆| 国产高清一区视频| 好吊视频一二三区| 日韩高清欧美激情| 欧美激情按摩在线| jizz中文字幕| jizz性欧美23| 欧美午夜片在线观看| 欧美无砖专区免费| aa视频在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 视频一区二区精品| 天堂网av在线播放| 91亚洲精品久久久蜜桃| 92国产精品视频| 免费的毛片视频| 欧美精品网站| 中文字幕日韩欧美在线视频| 久久久老熟女一区二区三区91| 玖玖精品在线| 黑人巨大精品欧美一区二区三区| 中文视频一区视频二区视频三区| 天天干在线观看| 久久综合久色欧美综合狠狠| 波多野结衣成人在线| 亚洲老妇色熟女老太| 久久爱另类一区二区小说| 亚洲va欧美va国产综合剧情| 亚洲精品国产一区二| 91麻豆国产在线观看| 国产精品一区在线播放| 男人天堂综合| 亚洲视频一区二区在线| 日韩欧美国产二区| 免费看男男www网站入口在线 | 永久免费av无码网站性色av| 羞羞色午夜精品一区二区三区| 亚洲网站在线看| 91香蕉一区二区三区在线观看| 欧美美乳视频| 色婷婷av一区二区三区久久| 日韩一级av毛片| 久久精品免费一区二区三区| 91国产精品视频在线| 中文字幕福利视频| 日韩精品视频网| 亚洲综合色av| 国产一二三在线观看| 久久综合色8888| 欧美少妇一级片| 亚洲欧美韩国| 日韩视频一区二区在线观看| 午夜精产品一区二区在线观看的| 欧美日韩久久| 国产精品久久久亚洲| 中文在线免费观看| 9人人澡人人爽人人精品| 一区二区免费电影| 女女色综合影院| 中文字幕中文字幕一区| 一区二区av| 樱花草涩涩www在线播放| 91精品国产福利| 国内精品国产三级国产aⅴ久| 国产在线一区不卡| 国产亚洲精品va在线观看| 日本系列第一页| 国产精品自拍三区| 国产日韩欧美综合精品| 亚洲av成人无码网天堂| 久久天天做天天爱综合色| 国产一区二区三区播放| 高清电影在线观看免费| 精品久久中文字幕| av丝袜天堂网| 亚洲一区二区三区久久久| 亚洲人午夜精品| 亚洲天堂岛国片| 国产亚洲一级| 国产激情999| 午夜av免费在线观看| 亚洲一区日韩精品中文字幕| 在线观看日韩电影| 欧美成熟毛茸茸复古| av福利在线导航| 欧美一区二区三级| 五月天av网站| 国内精品写真在线观看| 成人美女免费网站视频| 99热这里只有精品在线| 亚洲欧洲日韩在线| 777视频在线| 精品一区二区三区视频在线播放 | 蜜桃精品在线观看| 亚洲www视频| av国产在线观看| 一区二区在线观看免费视频播放| 亚洲男人天堂av在线| 四季av一区二区凹凸精品| 国产精品自拍偷拍视频| 欧洲日本在线| 91精品福利在线一区二区三区 | 久久av中文字幕片| 亚洲视频精品一区| 亚洲人体在线| 欧美理论电影在线播放| 日韩免费视频一区二区视频在线观看| 免费在线视频一区| 亚洲一区在线直播| 精品视频在线播放一区二区三区 | 成人午夜精品福利免费| 亚洲国产日韩在线一区模特| av在线无限看| 久久久久久毛片免费看 | 中文字幕视频观看| 手机在线一区二区三区| 国产在线久久久| 三级在线电影| 在线看一区二区| 强制高潮抽搐sm调教高h| 国产精品18久久久久久vr| 国产高清av在线播放| 欧美xxxx网站| 欧美成人激情视频免费观看| 国产裸体美女永久免费无遮挡| 中文字幕不卡在线播放| 91精品视频国产| 亚洲网站在线| 日本一区二区三区视频在线观看 | 亚洲欧美影院| 欧美一区 二区 三区| 精品国产一区二区在线观看| 麻豆精品国产免费| 不卡大黄网站免费看| 欧美在线观看黄| 偷拍亚洲色图| 91精品国产色综合| 成人在线二区| 一本一本久久a久久精品综合麻豆| 18禁一区二区三区| 综合天天久久| 91久久国产婷婷一区二区| 日韩特级毛片| 国产亚洲美女久久| 亚洲av综合色区无码一二三区 | 久久超级碰视频| 欧美 日韩 亚洲 一区| 6080成人| 欧美整片在线观看| 日韩一区二区三区中文字幕| 8x8x8国产精品| 久久国产高清视频| 久久这里都是精品| 国产精品二区视频| 日韩综合在线视频| 欧美人成在线观看| 久久精品亚洲人成影院 | 国产在线拍揄自揄拍无码视频| 国产一区二区三区在线观看免费| 一本一道久久a久久综合精品 | 激情视频一区二区| 理论片午夜视频在线观看| 久久这里有精品| 国产大学生校花援交在线播放 | 可以在线看黄的网站| 亚洲电影一区| 欧美激情视频一区二区| 99视频在线观看地址| 国产视频在线观看一区二区| 日日夜夜狠狠操| 亚洲国产岛国毛片在线| av无码av天天av天天爽| 免费观看一级特黄欧美大片| 日韩在线一级片| 精品久久综合| 久久99影院| 精品人人人人| 国产 高清 精品 在线 a | 偷拍一区二区三区四区| 欧美激情精品久久| 9i在线看片成人免费| 国产在线观看免费播放| 国产一区日韩二区欧美三区| 四季av一区二区三区| 激情丁香综合| 日本一区二区三不卡| 色综合综合网| 日本视频一区在线观看| 一区三区在线欧| 成人日韩av在线| 欧美爱爱视频| 国产精品久久久久久久久久小说 | 国产哺乳奶水91在线播放| 欧美电影影音先锋| 欧美日韩亚洲国产另类| 久久综合九色综合97婷婷女人| 超碰caoprom| 成人av在线资源| 亚洲の无码国产の无码步美| 久久精品噜噜噜成人av农村| 2018中文字幕第一页| 好吊一区二区三区| 波多野结衣之无限发射| 国产午夜久久| 久久久久免费精品| 免费观看在线综合| 四虎成人在线播放| 国产成人av福利| 福利在线一区二区三区| 日本免费新一区视频| 欧美一级在线看| 久久婷婷一区| 给我免费播放片在线观看| 国产欧美一级| 一级黄色香蕉视频| 激情综合网av| 成人啪啪18免费游戏链接| caoporm超碰国产精品| 国产手机在线观看| 成人黄色大片在线观看| 人妻丰满熟妇av无码久久洗澡 | 丰满人妻一区二区三区免费| 亚洲精品成人久久| 国产高中女学生第一次| 亚洲国产精品va在线看黑人| 亚洲无码精品在线观看| 欧美美女一区二区在线观看| 亚洲爆乳无码一区二区三区| 国产丝袜一区二区| 嫩草香蕉在线91一二三区| 久久久久久亚洲精品| 啪啪免费视频一区| 久久国产精品亚洲| 岛国在线视频网站| 国产精品亚洲综合天堂夜夜| 一区二区在线免费播放| 欧美一级二级三级九九九| 一区二区中文| 大肉大捧一进一出好爽动态图| 99国产精品自拍| 丁香六月激情婷婷| 日韩精品电影在线| 日本中文字幕精品| 国产婷婷色一区二区三区四区| 免费黄色在线视频| 中文字幕日韩精品一区 | 亚洲av无码乱码在线观看性色| 日韩av在线免费播放| 人妻va精品va欧美va| 精品久久久久一区| 91精品国产91久久久久游泳池 | 狠狠色伊人亚洲综合网站l| 久久这里有精品视频| 亚洲成人激情社区| 国产亚洲欧美一区二区三区| 97精品视频在线看| 久久久久人妻精品一区三寸| 国产成人免费网站| 日本二区三区视频| 91久久香蕉国产日韩欧美9色| 刘亦菲毛片一区二区三区| 久久精品国产久精国产一老狼| 成人在线免费看片| 欧美巨乳美女视频| 成人午夜一级| 国产拍精品一二三| 一区二区三区日本久久久 | 4p变态网欧美系列| 日韩成人视屏| 曰韩不卡视频| 日本在线不卡一区| 亚洲AV无码国产成人久久| 亚洲午夜免费福利视频| av中文字幕免费| 综合网日日天干夜夜久久| 色香欲www7777综合网| 精品国产乱码久久久久软件| 伊人久久大香线蕉综合热线| 美女流白浆视频| 亚洲色图一区二区三区| 怡春院在线视频| 一区二区日韩精品| 超碰人人在线| 国产热re99久久6国产精品| 国产九一精品| 精品国产一区二区三区在线| 久久精品久久99精品久久| 亚洲一二三精品| 亚洲精品国产成人久久av盗摄| 一区二区日韩在线观看| 亚洲成人激情在线观看| 日韩精品亚洲人成在线观看| 亚洲一区二区自拍| 欧美精品偷拍| 91精品啪在线观看国产| 亚洲成av人片| 亚洲色图狠狠干| 欧美一级视频一区二区| 亚洲伊人春色| 欧美黄色一级片视频| 久久精品一区二区| 中文在线最新版天堂| 日韩一中文字幕| а√在线天堂官网| 精品久久久久久综合日本| 国产欧美丝祙| 在线观看福利片| 91成人免费电影| 亚洲xxxxxx| 青青在线视频一区二区三区| 欧美**字幕| www.这里只有精品| 亚洲视频精选在线| 空姐吹箫视频大全| 欧美自拍视频在线| 久久视频国产| 91精产国品一二三| 欧美日韩免费区域视频在线观看| 日韩av成人| 国产日韩换脸av一区在线观看| 国产精品毛片一区二区在线看| 国产精品亚洲二区在线观看| 国产精品热久久久久夜色精品三区| 999久久久久| 深夜福利一区二区|