分布式——锁(Zookeeper实现)

Zookeeper分布式锁的原理

Zookeeper 分布式锁就是利用顺序临时节点和Watch监听机制

初始化:

  1. 在 zk 中创建一个持久节点 ParentLock;

Client1 获取锁:

  1. 在 ParentLock 节点下创建临时顺序节点 Lock1;
  2. Client1 查找 ParentLock 下所有的临时顺序节点并排序;
  3. 判断自己所创建的节点是不是最靠前的一个,如果是则成功获取锁。

Client2 获取锁:

  1. 在 ParentLock 节点下创建临时顺序节点 Lock2;
  2. Client2 查找 ParentLock 下所有的临时顺序节点并排序;
  3. 判断自己所创建的节点是不是最靠前的一个,结果发现不是;
  4. Client2 向排序仅比它靠前的节点 Lock1 注册 Watcher,用于监听 Lock1 节点是否存在,这也就意味着抢锁失败,进入了等待状态。

Client3 获取锁:

  1. 在 ParentLock 节点下创建临时顺序节点 Lock3;
  2. Client3 查找 ParentLock 下所有的临时顺序节点并排序;
  3. 判断自己所创建的节点是不是最靠前的一个,结果发现不是;
  4. Client3 向排序仅比它靠前的节点 Lock2 注册 Watcher,用于监听 Lock2 节点是否存在,这也就意味着抢锁失败,进入了等待状态。

这样一来,Client1 得到了锁,Client2 监听了 Lock1,Client3 监听了 Lock2

Client1 释放锁:

  1. 显示调用删除 Lock1。

如果 Client1 没释放锁之前,崩溃了,怎么办?

  1. Client1 崩溃了则会断开与 Zookeeper 服务端的连接。根据临时节点的特性,相关联的节点 Lock1 会随之自动删除。
  2. 由于 Client2 一直监听着 Lock1 的存在状态,当 Lock1 节点被删除,Client2 会立刻收到通知,这时候 Client2 会再次查询 ParentLock 下面的所有节点,判断自己创建的节点 Lock2 是不是顺序最靠前的一个,如果是,则成功获取锁。
开源实现

Curator Recipes 模块已经有了完善的分布式锁实现。Curator Lock 相关的实现在 recipes.locks 包里,顶级接口都是 InterProcessLock。

Curator Recipes 锁的几种方案,InterProcessLock 接口实现类:

InterProcessMutex:分布式可重入排它锁
InterProcessSemaphoreMutex:分布式排它锁
InterProcessReadWriteLock:分布式读写锁
InterProcessMultiLock:将多个锁作为单个实体管理的容器
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值