ZooKeeper的分布式锁的实现
-
客户端连接到ZooKeeper,在锁目录下创建临时顺序节点。第一个客户端创建第一个临时顺序节点,第二个客户端创建第二个临时顺序节点,以此类推。
-
客户端创建临时顺序节点时,获取锁目录下的子节点列表,如果自己创建的节点是列表中序号最小的子节点,则获得锁。否则,监听在自己之前一位的子节点的删除消息,等待获得前一节点删除变更的通知,以此获得锁。
ZooKeeper保证读取目录子节点列表和设置监听器的操作具有原子性,保证不会出现对子节点列表读取失效,而导致事件丢失。如果非原子性,假设在设置监听器之前,和读取列表之后,前一个子节点被删除,那么这个子节点的线程将不会再被通知。 -
当客户端获得锁后,执行自己的业务逻辑代码。完成业务逻辑,断开连接,对应的临时顺序节点被删除,下一个线程继续获得锁。
关于ZooKeeper的基础,参考Zookeeper实践
分布式锁的比较,参考分布式锁的多种实现方式
网友评论