分布式锁的这三种实现90%的人都不知道( 三 )
Znode分为四种类型:
1.持久节点 (PERSISTENT)
默认的节点类型 。 创建节点的客户端与zookeeper断开连接后 , 该节点依旧存在。
2.持久节点顺序节点(PERSISTENT_SEQUENTIAL)
所谓顺序节点 , 就是在创建节点时 , Zookeeper根据创建的时间顺序给该节点名称进行编号:
文章插图
3.临时节点(EPHEMERAL)
和持久节点相反 , 当创建节点的客户端与zookeeper断开连接后 , 临时节点会被删除:
文章插图
文章插图
文章插图
4.临时顺序节点(EPHEMERAL_SEQUENTIAL)
顾名思义 , 临时顺序节点结合和临时节点和顺序节点的特点:在创建节点时 , Zookeeper根据创建的时间顺序给该节点名称进行编号;当创建节点的客户端与zookeeper断开连接后 , 临时节点会被删除 。
Zookeeper分布式锁的原理
Zookeeper分布式锁恰恰应用了临时顺序节点 。 具体如何实现呢?让我们来看一看详细步骤:
获取锁
首先 , 在Zookeeper当中创建一个持久节点ParentLock 。 当第一个客户端想要获得锁时 , 需要在ParentLock这个节点下面创建一个临时顺序节点 Lock1 。
文章插图
之后 , Client1查找ParentLock下面所有的临时顺序节点并排序 , 判断自己所创建的节点Lock1是不是顺序最靠前的一个 。 如果是第一个节点 , 则成功获得锁 。
文章插图
这时候 , 如果再有一个客户端 Client2 前来获取锁 , 则在ParentLock下载再创建一个临时顺序节点Lock2 。
文章插图
Client2查找ParentLock下面所有的临时顺序节点并排序 , 判断自己所创建的节点Lock2是不是顺序最靠前的一个 , 结果发现节点Lock2并不是最小的 。
于是 , Client2向排序仅比它靠前的节点Lock1注册Watcher , 用于监听Lock1节点是否存在 。 这意味着Client2抢锁失败 , 进入了等待状态 。
文章插图
这时候 , 如果又有一个客户端Client3前来获取锁 , 则在ParentLock下载再创建一个临时顺序节点Lock3 。
文章插图
Client3查找ParentLock下面所有的临时顺序节点并排序 , 判断自己所创建的节点Lock3是不是顺序最靠前的一个 , 结果同样发现节点Lock3并不是最小的 。
于是 , Client3向排序仅比它靠前的节点Lock2注册Watcher , 用于监听Lock2节点是否存在 。 这意味着Client3同样抢锁失败 , 进入了等待状态 。
文章插图
这样一来 , Client1得到了锁 , Client2监听了Lock1 , Client3监听了Lock2 。 这恰恰形成了一个等待队列 , 很像是Java当中ReentrantLock所依赖的
释放锁
释放锁分为两种情况:
1.任务完成 , 客户端显示释放
当任务完成时 , Client1会显示调用删除节点Lock1的指令 。
推荐阅读
- iQOO 7官方美图赏:三种配色、速度美学设计传承
- 可与ASML实现联机!国产光刻机传来喜讯,张绍忠预言或成真?
- 烟台港“管道智脑系统”上线 在国内率先实现原油储运全息智能排产
- 想实现《曼达洛人》的数字布景吗?索尼模块化屏幕即将开售
- 快递员工也能当“教授”?上海快递工程技术高级职称评审实现突破
- 骁龙888首次实现可变分辨率渲染 创造沉浸式游戏体验
- 柔宇FlexPai 2实现多次重复折叠无折痕,斩获CES 2021创新奖
- 飞步无人车:实现首个混线工况下的自动驾驶集卡编队独立整船作业
- 荣耀、高通相继宣布,雷军迎来大敌?任正非的预言正在实现
- 李炳忠自我打脸,去年realme销量翻番的目标远未实现