Zookeeper实现分布式锁
今天偶然在头条上看见一个基于Zk的分布式锁的推荐,觉得讲的不错,想起来自己在分析分布式锁的时候对于Zookeeper锁的分析没有完善。所以今天来补一篇。
Zookeeper的节点类型
1. 持久节点
节点创建后就会一直存在,直到主动删除,不会因为创建改节点的客户端会话消失而消失。
2.持久顺序节点
持久的,顺序节点,Zk会维护这个时序,记录子节点的创建的先后顺序。
3.临时节点
临时节点的生命周期和客户端会话绑定,如果客户端会话失效(不是连接断开),那么这个节点被自动清除掉,临时节点下面不能创建子节点4.临时顺序节点
临时顺序节点,也是临时节点,不过是带有顺序的,客户端会话消失节点就消失,Zk的分布式锁主要是运用的这个特性。
Zookeeper的分布式锁架构图
Zookeeper的分布式锁流程分析
总体思路可以如下:
1. 获取分布式锁时在Lock节点下创建临时顺序节点,释放锁的时候删除该临时节点。
2. 客户端调用createNode方法在Lock节点下创建临时顺序节点。然后调用getChildren获取所有子节点。
2.1 如果发现当前自己创建的节点的序号是最小的话,就认定该客户端获取到锁。
2.2 如果发现不是最小的节点。说明获取锁失败,此时客户端需要找到比自己小的节点,对其注册事件监听器。
3. 当前获取到锁的客户端删除当前最小节点,那么注册过事件监听器的客户端会收到通知,此时再次判断是否自己的节点是最小的,是的话直接获取到锁,不是的话重复步骤监听比自己小的节点的事件。