ZK 分布式阻塞锁设计思路

  1. 节点类型
    1. 保证锁的释放
    2. 保证锁的公平性
    3. 阻塞
    4. 可重入

节点类型

持久的(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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏