实现思路
- 利用
create
进行独占抢锁,抢到锁的会返回成功 - 利用临时节点保证会话断开(抢到锁的进程崩溃)后能够自动删除节点
- 利用监听机制实现锁释放后可以快速抢到锁
- 利用临时顺序节点,实现公平锁,每个节点只要监听前面一个节点就可以
- 只有排在最前面的节点才可以抢到锁
-
如果中间有节点放弃了锁,则后面的自动向前监听
- Zookeeper 实现的是公平锁,有”先来后到”,实际上是实现了分布式网络队列
与 redlock 对比
redlock 算法属于类 CAS 自旋锁,存在轮询问题。
-
在多台 Client 访问多台 Redis 实例时,有两种情况可能出问题:
- 在并发情况下,可能多个 Client 获得一部分锁,之后反复随机重试,多次通信浪费时间
- 在过半数实例锁认证成功情况下,其中两台在主从同步之前就挂掉,会导致锁被新的请求拿到,同时拿到锁导致严重问题
-
与 Redis 的 redlock 相比,Zookeeper 锁的并发性能差一些(硬盘写入、分布式节点确认),但是 Zookeeper 集群稳定性更好,不需要类 CAS 轮询
-
到底选哪种锁需要Tradeoff(权衡利弊)
- 如果对锁的一致性要求高,那么就用
Zookeeper
- 如果对锁的速度要求高,那么可以用
高配单机Redis+redlock
- 如果介于两者之间,可以用
多实例Redis+redlock
- 如果对锁的一致性要求高,那么就用