前几天分享了分布式锁的三种实现方案(我们是这样一步一步实现分布式锁的),其中对于zookeeper实现方式,有些朋友说想知道实现的总体流程。那么今天我就来将zookeeper的具体实现流程通过一步一图的形式再来说一下,然后大家可以根据前面的代码进行一起理解下,这样应该会更容易搞懂zookeeper的分布式锁。
01
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的临时顺序节点特性都帮我们进行自动管理好了,不需要我们去自己管理,所以实现起来还是很方便,大家可以去结合前面文章代码再看看(我们是这样一步一步实现分布式锁的),如果大家喜欢或者对大家有帮助就关注我,我会一直分享业界流行技术解决方案,共同学习共同进步。
关于架构师修炼
本号旨在分享一线互联网各种技术架构解决方案,分布式以及高并发等相关专题,同时会将作者的学习总结进行整理并分享。
更多技术专题,敬请期待