写点什么

zookeeper 实现分布式锁

作者:zarmnosaj
  • 2022-10-18
    四川
  • 本文字数:798 字

    阅读完需:约 1 分钟

zookeeper 实现公平锁

zookeeper 实现分布式锁的方式是依托于 zookeeper 本身提供的功能:临时有序节点实现,大概思路:


  1. 分布式客户端要加分布式锁时,向 zookeeper 中指定目录下添加一个临时有序节点,添加完成后,获取指定目录下的所有节点,判断当前创建的节点序号是否是所有节点中序号最小的值,如果是的话,则持有锁,如果不是的话,则进行自旋/阻塞等待,并向 zookeeper 注册一个监听时间,监听最小序号节点的变化

  2. 此时假设已有客户端持有锁,另一个客户端同第一步,连接 zookeeper 后先行创建一个临时有序节点,创建指定的目录和第一步中指定的目录相同,创建完成后执行相同的操作,检测是否是序号最小值,判断是否持有锁或者阻塞,并且注册监听事件

  3. 当持有锁的客户端执行完操作后,删除当前客户端创建的临时有序节点,此时由于节点被删除,监听此节点变化的其他客户端,会收到响应事件,此时再做出响应,重新获取指定目录下的所有节点,再次进行最小值判断,是则持有锁


此实现方式的思想很简单,但是需要注意的点有几个:


  1. 对于同一个业务而言,需要加锁的目录要提前指定,例如:/lock/business1

  2. 在客户端获取锁失败后,需要注册监听事件,例如此时是节点为 N00001 的客户端持有锁,监听事件就是 N00001 的节点状态变化

  3. 当客户端发生异常,连接断开后,临时有序节点就会被删除

zookeeper 实现非公平锁

zookeeper 实现非公平锁的思路和公平锁的思路大致一样,不一样的是每个客户端创建额节点非临时有序节点,而是创建临时节点,每个客户端对于相同的业务而言,创建的都是相同目录的同名节点,创建成功并且是自己创建的,才能够获取锁,非自己创建的节点,则一样会注册监听事件,并阻塞等待。

总结

两种方式都是利用的 zookeeper 节点的特性,并且 zookeeper 的高可用性,可以很好的保证业务的稳定性,故而 zookeeper 是实现分布式锁的很好方式,并且目前已有线程的 zookeeper 框架(curator),内部实现了上述逻辑,使用时可以方便的调用方法即可。

发布于: 刚刚阅读数: 3
用户头像

zarmnosaj

关注

靡不有初,鲜克有终 2020-02-06 加入

成都后端混子

评论

发布
暂无评论
zookeeper实现分布式锁_10月月更_zarmnosaj_InfoQ写作社区