ZK 分布式阻塞锁设计思路
节点类型
持久的(persistent)、临时的(ephemeral)、持久有序的(persistent_sequential)和临时有序的(ephemeral_sequential)
保证锁的释放
无论是程序主动释放锁还是异常崩溃导致的过期释放锁。临时 znode 可以满足我们的要求。
在以下两种情况下将会被删除:
- 1.当创建该znode的客户端的会话因超时或主动关闭而中止时。
- 2.当某个客户端(不一定是创建者)主动删除该节点时。
保证锁的公平性
一个有序 znode 节点被分配唯一个单调递增的整数。当创建有序节点时,一个序号会被追加到路径之后。例如,如果一个客户端创建了一个有序 znode 节点,其路径为 /tasks/task-,那么 ZooKeeper 将会分配一个序号,如 1,并将这个数字追加到路径之后,最后该 znode 节点为 /tasks/task-1。有序 znode 通过提供了创建具有唯一名称的 znode 的简单方式。同时也通过这种方式可以直观地查看 znode 的创建顺序。我们可以根据 znode 的创建顺序实现锁的公平性获取。
阻塞
通过 zk watcher 监听到上个获取锁的节点删除事件,其他未获得锁的线程 wait watcher 的通知(notifyAll),得到通知则继续争抢锁。
可重入
通过映射表保存线程获得的锁信息,同一线程再次拿锁,首先判断当前的映射表内是否有该线程的锁信息,如果有则原子+1(AtomicInteger)。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 rockeycui@163.com
文章标题:ZK 分布式阻塞锁设计思路
文章字数:403
本文作者:崔石磊(RockeyCui)
发布时间:2019-08-05, 20:45:18
原始链接:https://cuishilei.com/ZK-分布式阻塞锁设计思路.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。