原理
- ZooKeeper通过临时节点实现加锁,解锁,重入等操作。
- 临时节点续期
- ZooKeeper的节点是通过session心跳来续期的,比如客户端1创建了一个节点, 那么客户端1会和ZooKeeper服务器创建一个Session,通过这个Session的心跳来维持连接。如果ZooKeeper服务器长时间没收到这个Session的心跳,就认为这个Session过期了,也会把对应的节点删除。简单来说就是:当客户端宕机后,临时节点会随之消亡。****
- 锁类型:公平锁,顺序抢占。来一个请求新建一个节点名称:node_01,node_02,node_03,01抢到锁后,02等待,01释放后,02抢锁,以此类推。
- 到期处理:删除临时节点
代码
- 上锁的入口是 acquire
1 | java复制代码public boolean acquire(long time, TimeUnit unit) throws Exception { |
- 再来看看这个LockData里面是什么东西
1 | arduino复制代码private static class LockData { |
- 互斥逻辑
- 查找到所有临时顺序节点,然后按照编号从小到大排序
- 判断当前客户端是不是 children 里的第一个,不是的话就代表不能加锁,那就计算出上一个节点编号,然后开启一个 Watcher 监听这个节点(刚计算出来的上一个节点)
- wait() 。
1 | java复制代码private boolean internalLockLoop(long startMillis, Long millisToWait, String ourPath) throws Exception { |
- 解锁逻辑
1 | csharp复制代码public void release() throws Exception { |
整体流程
本文转载自: 掘金