ZooKeeper 分布式锁实现原理
2024-08-31 20:43:46
原理
进程需要访问共享数据时, 就在"/locks"节点下创建一个sequence类型的子节点, 称为thisPath. 当thisPath在所有子节点中最小时, 说明该进程获得了锁. 进程获得锁之后, 就可以访问共享资源了. 访问完成后, 需要将thisPath删除. 锁由新的最小的子节点获得.
进程如何知道thisPath是所有子节点中最小的呢? 可以在创建的时候, 通过getChildren方法获取子节点列表, 然后在列表中找到排名比thisPath前1位的节点, 称为waitPath, 然后在waitPath上注册监听, 当waitPath被删除后, 进程获得通知, 此时说明该进程获得了锁.
lock操作过程:
1、创建一个永久性节点,作锁的根目录
2、当要获取一个锁时,在锁目录下创建一个临时有序列的节点
3、检查锁目录的子节点是否有序列比它小,若有则监听比它小的上一个节点,当前锁处于等待状态
4、当等待时间超过Zookeeper session的连接时间(sessionTimeout)时,当前session过期,Zookeeper自动删除此session创建的临时节点,等待状态结束,获取锁失败
5、当监听器触发时,等待状态结束,获得锁
unlock操作过程:
将自己id对应的节点删除即可,对应的下一个排队的节点就可以收到Watcher事件,从而被唤醒得到锁后退出;
最新文章
- php正则表达式治疗结巴
- 安卓 io流 写入文件,再读取的基本使用
- Bezier曲线的原理 及 二次Bezier曲线的实现
- Jquery实现页面上所有的checkbox只能选中一个
- 使用pymysql连接MySql数据库
- C#控件大小随窗体大小等比例变化
- SQL查询四舍五入 解决方法
- APUE 1 -- Unix数据结构
- [ExtJS5学习笔记]第十一节 Extjs5MVVM模式下系统登录实例
- Centos6、7下安装Nginx的两种方法
- The concurrent snapshot for publication 'xxx' is not available because it has not been fully generated or the Log Reader Agent is not running to activate it
- python 中numpy中函数hstack用法和作用
- public private protected extends
- MVC4 原版样式
- 补充appium -api
- Android-Android版美图秀秀
- PHP_EOL 写入字符串换行 , php获取毫秒 microtime
- 小程序swiper 快速滑动闪屏
- python文件备份与简单操作
- 微信小程序-04-详解介绍.json 配置文件