为什么需要分布式锁
首先在传统单机部署的情况下,可以使用Java并发处理相关的ReentrantLcok或Synchronized进行互斥控制,用于解决单机并发共享资源问题。
但是在分布式系统后,由于分布式系统是分布在不同机器上,这将使原单机并发控制锁策略失效。
为了解决这个问题就需要一种跨JVM的互斥机制,来控制共享资源的访问,这就是分布式锁的由来。
Zookeeper分布式锁的优缺点
1.Zookeeper分布式锁的优点
有效的解决单点问题,不可重入问题,非阻塞问题以及锁无法释放的问题,实现起来较为简单。
2.Zookeeper分布式锁的缺点
性能上不如使用Redis分布式锁缓存实现, 需要对ZooKeeper的原理有所了解。
Zookeeper分布式锁原理
Zookeeper 分布式锁是:基于 临时顺序节点 来实现的,实现原理分为如下几大步骤:
- 锁可理解为 Zookeeper 上的一个节点,当需要获取锁时,就在这个锁节点下创建一个临时顺序节点;
- 当存在多个客户端同时来获取锁,就按顺序依次创建多个临时顺序节点,但只有排列序号是第一的那个节点能获取锁成功;
- 其他节点则按顺序分别监听前一个节点的变化,当被监听者释放锁时,监听者就可以马上获得锁;
- 而且用临时顺序节点的另外一个用意是如果某个客户端创建临时顺序节点后,自己意外宕机了也没关系,Zookeeper 感知到某个客户端宕机后会自动删除对应的临时顺序节点,相当于自动释放锁。
比如上图,获取锁分为如下:
1.ClientA 和 ClientB 同时想获取锁,所以都在 locks 节点下创建了一个临时节点 1 和 2;
2.而 1 是当前 locks 节点下排列序号第一的节点,所以 ClientA 获取锁成功;
3.而 ClientB 处于等待状态,这时 Zookeeper 中的 2 节点会监听 1 节点;
4.当 1节点锁释放,也就是节点被删除时,2 就变成了 locks 节点下排列序号第一的节点,这样 ClientB 就获取锁成功了。
Zookeeper分布式锁实现
可以直接使用zookeeper第三方库Curator客户端,Curator提供的InterProcessMutex是分布式锁的实现。
1.导入Maven依赖
2.配置curator
3.布式锁案例
acquire方法用户获取锁,release方法用于释放锁。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》