当前位置:   article > 正文

通过Zookeeper实现分布式锁示例

通过Zookeeper实现分布式锁示例

下载安装Zookeeper:

下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.6.2/
我下载了最新的apache-zookeeper-3.6.2-bin.tar.gz
通过tar命令进行解压,然后修改conf/zoo_sample.cfg为conf/zoo.cfg,并修改里面的配置。
在这里插入图片描述

datadir为存储zookeeper节点快照的地方,默认是/tmp/zookeeper,你需要自定义一个地址,否则linux会自动清理tmp下的内容。
clientPort:我们可以看到zookeeper会监听2181端口的客户端连接
admin.serverPort:zookeeper默认启动的端口是8080,如果需要自定义启动端口,请指定它

通过Zookeeper实现分布式锁示例:

分布式锁的实现主要注意一下几点:
1、锁要有互斥性,当一个线程获取到锁,另一个线程就会获取锁失败
2、在线程获取到锁之后还未释放锁,当前进程宕机,系统需自动释放锁。

zookeeper是通过创建临时节点实现分布式锁,如果临时节点不存在,就创建节点(获取锁)。如果节点存在,就创建失败(获取锁失败),客户端可以给服务器设置一个监听,当另一个线程释放锁或宕机,则会给当前监听返回一个回调,此时就可以再次尝试获取锁。

启动两个client:clientA和clientB,通过启动bin目录下的 zkCli.sh
在这里插入图片描述

获取锁

clientA尝试创建临时节点/lock: (-e 表示创建的是一个临时节点
在这里插入图片描述
创建成功!表明获取锁成功。

此时clientB也尝试创建临时节点/lock:
在这里插入图片描述
发现节点已存在,表明获取锁失败。

设置监听

此时我们不需要不断地轮询去获取锁,那样是很耗性能的。zookeeper提供了监听机制,通过stat -w [path] 可以在/lock锁上注册一个监听。该命令返回了该节点的信息。
在这里插入图片描述

释放锁

此时,我们模拟clientA释放锁的操作,删除临时节点/lock 或者 直接退出客户端 quit:
在这里插入图片描述
在这里插入图片描述

此时我们查看clientB:
在这里插入图片描述
收到了一个事件监听回调,type为NodeDeleted, path为/lock

收到回调之后,此时clientB再次尝试获取锁,成功。
在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号