标签:变化 session 地方 缺点 创建 建立 无法 节点 node
Zookeeper是一种提供配置管理、分布式协同以及命名的中心化服务。
zk的模型是这样的:zk包含一系列的节点,叫做znode,就好像文件系统一样每个znode表示一个目录,然后znode有一些特性:
基于以上的一些zk的特性,我们很容易得出使用zk实现分布式锁的落地方案:
使用zk的临时节点和有序节点,每个线程获取锁就是在zk创建一个临时有序的节点,比如在/lock/目录下。
创建节点成功后,获取/lock目录下的所有临时节点,再判断当前线程创建的节点是否是所有的节点的序号最小的节点
如果当前线程创建的节点是所有节点序号最小的节点,则认为获取锁成功。
如果当前线程创建的节点不是所有节点序号最小的节点,则对节点序号的前一个节点添加一个事件监听。
比如当前线程获取到的节点序号为 /lock/003 ,然后所有的节点列表为[/lock/001,/lock/002,/lock/003] ,则对 /lock/002 这个节点添加一个事件监听器。
如果锁释放了,会唤醒下一个序号的节点,然后重新执行第3步,判断是否自己的节点序号是最小。
比如 /lock/001 释放了, /lock/002 监听到时间,此时节点集合为 [/lock/002,/lock/003] ,则 /lock/002 为最小序号节点,获取到锁。Curator是一个zookeeper的开源客户端,也提供了分布式锁的实现。
来看看锁的一些特性Zookeeper是否满足:
总结:
标签:变化 session 地方 缺点 创建 建立 无法 节点 node
原文地址:https://www.cnblogs.com/dalianpai/p/14425608.html