ZK实现分布式锁过程
这里我以三个不同的客户端client1、client2、client3来演示ZK实现分布式锁的过程。
1、首先,在ZK创建一个持久节点ParentLock。当第一个客户端想要获得锁时,需要在ParentLock这个节点下面创建一个临时顺序的节点(临时节点1),client1查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点(临时节点1)是不是顺序最靠前的一个。如果是则成功获得锁。执行同步代码块。
2、这个时候,如果再有一个客户端client2(可以理解成不同的进程)前来获取锁,则ParentLock下再创建一个临时顺序节点(临时节点2)。client2查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点(临时节点2)是不是顺序最靠前的一个,发现不是最小,于是,client2向前排序仅比它靠前的节点注册Watcher,用来监听—临时节点1是否存在。这意味着client2抢锁失败。
3、这个时候,又有一个客户端client3前来获取锁,则ParentLock下再创建一个临时顺序节点(临时节点3)。client3查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点(临时节点3)是不是顺序最靠前的一个,发现不是最小,于是,client3向前排序仅比它靠前的节点注册Watcher,用来监听—临时节点2是否存在。这意味着client3抢锁失败。
4、客户端client1执行完同步代码块,断开与zookeeper连接,对应的临时节点1也会被删除,解锁成功。此时client2监听到临时节点1不存在,于是拿到锁。执行同步代码块。
5、客户端client2执行完同步代码块,断开与zookeeper连接,对应的临时节点2也会被删除,解锁成功。此时client3监听到临时节点2不存在,于是拿到锁。执行同步代码块。
6、客户端client3执行完同步代码块,断开与zookeeper连接,对应的临时节点3也会被删除,解锁成功。