15.6 ZooKeeper锁服务

在ZooKeeper中,完全分布的锁是全局同步的。也就是说,在同一时刻,不会有两个不同的客户端认为他们持有了相同的锁。这一节我们将向大家介绍在ZooKeeper中的各种锁机制是如何实现的。

15.6.1 ZooKeeper中的锁机制

ZooKeeper将按照如下方式实现加锁的操作:

1)ZooKeeper调用create()方法来创建一个路径格式为“locknode/lock-”的节点,此节点类型为sequence(连续)和ephemeral(临时)。也就是说,创建的节点为临时节点,并且所有的节点连续编号,即为“lock-i”的格式。

2)在创建的锁节点上调用getChildren()方法,以获取锁目录下的最小编号节点,并且不设置watch。

3)步骤2中获取的节点恰好是步骤1中客户端创建的节点,那么此客户端会获得该种类型的锁,然后退出操作。

4)客户端在锁目录上调用exists()方法,并且设置watch来监视锁目录下序号相对自己次小的连续临时节点的状态。

5)如果监视节点状态发生变化,则跳转到步骤2,继续进行后续的操作,直到退出锁竞争。

ZooKeeper的解锁操作非常简单,客户端只需要将加锁操作步骤1中创建的临时节点删除即可。

注意 1)一个客户端解锁之后,将只可能有一个客户端获得锁,因此每一个临时的连续节点对应着一个客户端,并且节点之间没有重叠;2)在ZooKeeper的锁机制中没有轮询和超时。ZooKeeper中锁机制流程图如图15-8所示。

15.6 ZooKeeper锁服务 - 图1

图 15-8 ZooKeeper锁机制流程图