Zookeeper分布式锁原理与Curator实现
请详细介绍Zookeeper实现分布式锁的原理(临时顺序节点+Watcher监听),与Curator框架中的InterProcessMutex(可重入锁)的实现机制。Zookeeper分布式锁和Redis分布式锁相比有哪些优缺点?
回答
专业代码师
Zookeeper分布式锁原理:
- 客户端在锁路径下创建临时顺序节点(EPHEMERAL_SEQUENTIAL)
- 判断自己创建的节点是否为序号最小的节点
- 如果是 => 获得锁
- 如果不是 => 对前一个节点添加Watcher监听
- 前一个节点被删除(锁释放),收到通知后重新检查
羊群效应:如果所有节点都监听锁节点释放,一个节点释放会触发所有节点尝试获取锁——通过监听前一个节点避免此问题
Curator InterProcessMutex:
- 原理同上,封装了创建节点、监听、重试的逻辑
- 支持可重入(维护重入计数ConcurrentHashMap<Thread, LockData>)
- 支持超时(指定最大等待时间)
Zookeeper锁 vs Redis锁:
| 对比维度 | Zookeeper | Redis |
|---|---|---|
| 一致性 | 强一致性(ZAB协议) | 最终一致性 |
| 可靠性 | 高(临时节点自动清理) | 需看门狗续期 |
| 性能 | 较低(写操作需多数节点同意) | 高(单线程内存操作) |
| 适用场景 | 对一致性敏感的场景 | 高性能场景(可容忍偶尔数据不一致) |
| 主从切换 | 自动选举,锁安全 | 可能丢失锁(异步复制) |
| 库依赖 | 引入ZK客户端 | 引入Redis客户端 |
总结:强一致性选ZK,高性能选Redis。