前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Zookeeper实现分布式锁详细步骤,你一定要知道

Zookeeper实现分布式锁详细步骤,你一定要知道

作者头像
架构师修炼
发布2020-07-20 10:26:06
5260
发布2020-07-20 10:26:06
举报
文章被收录于专栏:架构师修炼架构师修炼

前几天分享了分布式锁的三种实现方案(我们是这样一步一步实现分布式锁的),其中对于zookeeper实现方式,有些朋友说想知道实现的总体流程。那么今天我就来将zookeeper的具体实现流程通过一步一图的形式再来说一下,然后大家可以根据前面的代码进行一起理解下,这样应该会更容易搞懂zookeeper的分布式锁。

01

zookeeper节点特征

现在我们都知道zookeeper是基于树形数据结构实现分布式锁,以用来解决我们分布式环境下对于共享资源的数据一致性问题。其中,zookeeper树形结构有四种节点:

  • 持久节点,这是zookeeper的默认节点类型,一直存在。
  • 持久顺序节点,创建的节点,zookeeper会依据时间的顺序对创建的节点进行排序。
  • 临时节点,就是在zookeeper中临时创建的节点,zookeeper客户端与服务端断开或者是故障,就会删除临时节点
  • 临时顺序节点,和持久顺序节点类似,只不过就是临时的。

02

zookeeper实现分布式锁流程

通过上面zookeeper节点的特性,我们可以看出,使用临时顺序节点是可以实现我们的分布式锁的。

1,首先假如第一个客户端来获取共享资源也就是获取锁时,zookeeper客户端会创建持久根节点/locks

2,这个时候,客户端Client1就会查询/locks节点下面所有子节点,然后判断自己的节点是不是排序最小的那个,此时,如果是最小的则会获得锁,就能够对共享资源进行操作。

3,如果,这个时候又来个个客户端Client2也来尝试获取锁,那么它也会在zookeeper的/locks节点下创建一个节点。

4,Client2同样也会查询zookeeper中/locks节点下所有节点,判断自己编号是不是最小的,此时,发现自己并不是最小的,所以获取锁失败,然后就像它的前面一位节点0001注册Watcher事件来监控0001节点是否存在。

5,此时,又来一个客户端Client3来尝试获取锁,就会在/locks下创建自己的节点

6,同样,客户端Client3查询/locks下所有节点,判断自己是不是编号最小的节点,此时,发现自己并不是最小的,就会获取所失败,接着就会像它前面一位0002的节点注册Watcher事件,来监听0002节点是否存在。

所以,我们现在能发现获得锁的是客户端Client1,客户端Client2则监听着Client1的锁啥时候释放,而Client3就监听着Client2的锁释放。

03

zookeeper释放锁流程

客户端获得锁之后,现在我们再来看看是怎么释放锁的:

1,当客户端Client1业务完成之后,或者客户端故障,就会删除节点0001,主动释放锁。

2,0001节点被删除,此时Client2就会立马监听到锁被释放,就会去获取锁。

3,客户端Client2获得锁后,完成了业务操作,就会删掉0002编号节点

4,最后Client3监听到0002被删除了,则自己就会去获取锁和释放锁。

总结,今天我们把zookeeper实现分布式锁的整体流程通过一步一图的形式详细的讲解了一遍,知道了分布式环境下,锁是什么时候获取以及什么时候释放的,这些通过zookeeper的临时顺序节点特性都帮我们进行自动管理好了,不需要我们去自己管理,所以实现起来还是很方便,大家可以去结合前面文章代码再看看(我们是这样一步一步实现分布式锁的),如果大家喜欢或者对大家有帮助就关注我,我会一直分享业界流行技术解决方案,共同学习共同进步。

关于架构师修炼

本号旨在分享一线互联网各种技术架构解决方案,分布式以及高并发等相关专题,同时会将作者的学习总结进行整理并分享。

更多技术专题,敬请期待

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师修炼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档