Zookeeper+Curator 分布式锁
本来想着基于zk临时节点,实现一下分布式锁,结果发现有curator框架。PS:原声API真的难用,连递归创建path都没有?
配置curator maven的时候,md配置了好几个小时,最后发现集中定义依赖版本号 我本来都是写数字的,结果到了zookeeper.version ,我竟然写了 <zookeeper.version>zookeeper-3.4.7</zookeeper.version> 把英文也写上去了 可能是从maven-repository copy过来的 很郁闷。
curator提供的可重入分布式锁看起来也没什么可封装的,因为它和ReentrantLock确实很。在需要的地方,new一个,再调用对象的方法就好了。
这个锁就是 InterProcessMutex 类,其构造方法需要我们传入当前CuratorFramework对象,还有要锁定的节点。对了 这个节点是临时节点,再客户端断开连接后,锁不会一直存在,但也不会立即就失去锁,因为ZK需要根据缺省的时间判断你是真的断开了还是某种网络原因。
首先说明它是一把可重入锁。注意在当前线程的for循环中,他们都是用的是同一把锁,同把锁才可重入。
public void fun() {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-curator.xml");
CuratorFramework curatorFramework = (CuratorFramework) context.getBean("curatorFramework");
InterProcessMutex lock = new InterProcessMutex(curatorFramework, "/test/ws");
for (int i = 0; i < 10; i++) {
try {
lock.acquire();
System.out.println("yes");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
//lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
其次模拟分布式环境,在十个线程中各获取锁(锁相同的path),并执行1s的任务,可以发现,多线程被锁同步。
public void fun() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-curator.xml");
CuratorFramework curatorFramework = (CuratorFramework) context.getBean("curatorFramework");
InterProcessMutex lock = new InterProcessMutex(curatorFramework, "/test/ws");
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
lock.acquire();
System.out.println("yes");
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
System.in.read();
}
acquire支持传递等待超时时间,返回值是boolean类型。代表超时时间内是否成功获取到锁。
public void fun() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-curator.xml");
CuratorFramework curatorFramework = (CuratorFramework) context.getBean("curatorFramework");
System.out.println(curatorFramework);
InterProcessMutex lock = new InterProcessMutex(curatorFramework, "/test/ws");
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
if (lock.acquire(1000, TimeUnit.MILLISECONDS)) {
System.out.println("yes");
Thread.sleep(1000);
} else {
System.out.println("no");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
System.in.read();
}
最后附上spring配置:
<!-- 重连配置 -->
<bean id="retryPolicy" class="org.apache.curator.retry.ExponentialBackoffRetry">
<constructor-arg index="0" value="1000"/>
<constructor-arg index="1" value="3"/>
</bean> <bean id="curatorFramework" class="org.apache.curator.framework.CuratorFrameworkFactory" factory-method="newClient"
init-method="start">
<constructor-arg index="0" value="server:port,server:port,server:port"/>
<constructor-arg index="1" ref="retryPolicy"/>
</bean>
Zookeeper+Curator 分布式锁的更多相关文章
- zookeeper的分布式锁
实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...
- 基于Zookeeper的分布式锁
实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...
- curator 分布式锁InterProcessMutex
写这篇文章的目的主要是为了记录下自己在zookeeper 锁上踩过的坑,以及踩坑之后自己的一点认识; 从zk分布式锁原理说起,原理很简单,大家也应该都知道,简单的说就是zookeeper实现分布式锁是 ...
- Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心
一.Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性. 包括跨进程.跨机器.跨网络导致共享资源不一致的问题. 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当 ...
- 10分钟看懂!基于Zookeeper的分布式锁
实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...
- java就业指南 zookeeper分布式系统 zookeeper实现分布式锁 有用
目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个 分布式系统都无法同时满足一致性(Consistency).可用性 ...
- 【连载】redis库存操作,分布式锁的四种实现方式[一]--基于zookeeper实现分布式锁
一.背景 在电商系统中,库存的概念一定是有的,例如配一些商品的库存,做商品秒杀活动等,而由于库存操作频繁且要求原子性操作,所以绝大多数电商系统都用Redis来实现库存的加减,最近公司项目做架构升级,以 ...
- SpringBoot电商项目实战 — Zookeeper的分布式锁实现
上一篇演示了基于Redis的Redisson分布式锁实现,那今天我要再来说说基于Zookeeper的分布式现实. Zookeeper分布式锁实现 要用Zookeeper实现分布式锁,我就不得不说说zo ...
- 分布式锁(3) ----- 基于zookeeper的分布式锁
分布式锁系列文章 分布式锁(1) ----- 介绍和基于数据库的分布式锁 分布式锁(2) ----- 基于redis的分布式锁 分布式锁(3) ----- 基于zookeeper的分布式锁 代码:ht ...
随机推荐
- aop 例外通知就是记录业务方法出现错误 并保存到日志里面的功能
aop 例外通知就是记录业务方法出现错误 并保存到日志里面的功能
- ZOJ1100 Mondriaan's Dream
题目链接:QAQ 大致题意:有一个m行n列的矩阵,用1*2的骨牌(可横放或竖放)完全覆盖,骨牌不能重叠,有多少种不同的覆盖的方法? Solution: \(n,m\le11\),肯定是不能暴力的,又类 ...
- 【题解】 bzoj1260: [CQOI2007]涂色paint (区间dp)
bzoj1260,懒得复制,戳我戳我 Solution: 这种题目我不会做qwq,太菜了 区间打牌(dp) 用f[l][r]表示从l到r最少需要染几次色. 状态转移方程: 1.\(f[l][r]=mi ...
- 【BZOJ1294】[SCOI2009]围豆豆(动态规划,状压)
[BZOJ1294][SCOI2009]围豆豆(动态规划,状压) 题面 BZOJ 洛谷 题解 首先考虑如何判断一个点是否在一个多边形内(不一定是凸的),我们从这个点开始,朝着一个方向画一条射线,看看它 ...
- HGOI20180904(NOIP2018模拟sxn出题)
sol 输入n和H表示n个人,选H个人gcd最大抓住排列,是x[1,n]的正整数,是连续的整数,假设现在最大的公因数是k其中k一定是在[1,n]那么在排列中最多出现的个数为w那么kw是最大的含有因数k ...
- Mountainous landscape
Description 现在在平面上给你一条折线 \(P_1P_2 \cdots P_n\) . \(x\) 坐标是严格单调递增的.对于每一段折线 \(P_iP_{i+1}\) ,请你找一个最小的 \ ...
- 洛谷 P2146 [NOI2015]软件包管理器 解题报告
P2146 [NOI2015]软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...
- 【codevs2205】等差数列
题目大意:给定一个长度为 N 的序列,求这个序列中等差数列的个数. 题解:根据题意应该是一道序列计数 dp.设 \(dp[i][j]\) 表示以第 i 项结尾,公差为 j 的等差数列的个数,则状态转移 ...
- DataGridView更新数据到数据库
WinFrom程序绑定了一个DataGridView控件,我需要添加一个button按钮来更改状态,还需要把更新之后的状态更新到数据库,如下图所示的这样: 首先先来拖控件,把界面做出来,自己拖一个Da ...
- CCNA学习与实验指南——第2章 网络互联和参考模型
大三下学期的这个时间段,不知道是不是社会就业的恐惧与自身前途的迷茫所带来的压力,身边的同学一个个的整天奔赴考研室学的好不努力,空荡荡的宿舍只剩我一人孑然聊聊甚是索然无味,亦或许是即将毕业的压力等接踵而 ...