关于分布式锁的问题,不管是用什么技术,锁的本质是不变的。
如果是排他锁,意味着在同一个时刻只有一个线程或进程拿到锁资源,获得访问权限。
所以基于这个点去推演 Zookeeper 怎么去达到这个目的就行了(如图)
Zookeeper 的存储结构类似于一个具有层次关系的文件系统,每一个节点代表一个 k-v
结构的数据。
这些节点有几个很重要的特性。
同一级节点不能存在重复的数据
提供了有序节点的特性,可以根据创建的先后分配一个有序的编号
这几个特性是实现分布式锁的关键,下面来看看这个问题的回答。
具体流程:
我们可以用到 Zookeeper 里面的有序节点来实现分布式锁,具体的实现过程是(如图):
1. 在 ZooKeeper 上创建一个持久化的节点/exclusive_lock,作为锁的根节点。
2. 每个客户端去竞争锁的时候,直接在根节点下创建一个临时有序节点,节点的名称
为“lock-”前缀加自动生成的序号
3. 接着再判断当前竞争锁的线程创建的节点,在所有子节点中是否是最小的节点,如
果是就表示获得了锁
4. 如果不是,表示没有竞争到锁,那当前客户端需要监听自己在 ZooKeeper 上创建
的节点的前一个节点的删除事件,当节点删除时,再次尝试获取锁
除了这个方案以外,还可以用 Zookeeper 里面同一级节点的唯一性来实现分布式锁,
以上就是我的理解。