基于zookeeper实现分布式锁的原理
Posted 奥特曼liu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于zookeeper实现分布式锁的原理相关的知识,希望对你有一定的参考价值。
基于zookeeper实现分布式锁的原理
顺序节点特性:
使用zookeeper的顺序节点特性,假如我们在/lock目录下创建3个节点,ZK集群会按照发起创建的顺序来创建节点,节点分别为/lock/000000000001、/lock/000000000002、/lock/000000000003,最后一位数是依次递增的,节点名由zk来完成。
临时节点特性:
临时节点由某个客户端创建,当客户端与ZK集群断开连接,则该节点自动被删除。EPHEMERAL_SEQUEBTUAL为临时顺序节点。
根据ZK中节点是否存在,可以作为分布式锁的锁状态,以此来实现一个分布式锁。
加锁流程:
1.客户端1调用create()方法创建名为“/业务ID/lock-"的临时顺序节点。
2.客户端1调用getChildren(“业务ID”)方法来获取所有已经创建的子节点。
3.客户端获取到所有子节点path之后,如果发现自己在步骤1中创建的节点是所有节点中序号最小的,就是看自己创建的序号是否排第一,如果是第一,那么就认为这个客户端1获得了锁,在它前面没有别的客户端拿到锁。
4.如果创建的节点不是所有节点中最小的,那么则监视比自己创建节点的序列号小的最大的节点,进入等待。直到下次监视的子节点变更的时候,在进行子节点的获取,判断是否获取锁。
释放锁流程
等待获取锁的客户端执行完业务流程,直接删除当前的最小的临时顺序节点(L)即可。这样监听L的删除事件的客户端,就会被通知到,尝试进行锁的获取。
总结
优点:
zookeeper天生设计定位就是分布式协调,强一致性。锁的模型健壮、简单易用、适合做分布式锁。如果获取不到锁,只需要添加一个监听器就可以了,不用一直轮询,性能消耗较小。
缺点:
代码通过Watcher机制实现,实现相对复杂。
以上是关于基于zookeeper实现分布式锁的原理的主要内容,如果未能解决你的问题,请参考以下文章