Zookeeper

【黑马程序员Zookeeper视频教程,快速入门zookeeper技术】


文章目录

  • Zookeeper
  • 4 Zookeeper JavaAPI 操作
  • 4.8 分布式锁
  • 4.8.1 分布式锁
  • 4.8.2 Zookeeper 分布式锁原理


4 Zookeeper JavaAPI 操作

4.8 分布式锁
4.8.1 分布式锁

在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题。

java 实现分布式锁的问题 java zk分布式锁_java-zookeeper

但当我们的应用是分布式集群工作的情况下,属于多JVM下的工作环境,跨JVM之间已经无法通过多线程的锁解决同步问题。

java 实现分布式锁的问题 java zk分布式锁_zookeeper_02

那么就需要一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题——这就是分布式锁。

常用的实现方式:

java 实现分布式锁的问题 java zk分布式锁_分布式_03

4.8.2 Zookeeper 分布式锁原理

核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点。

[举个栗子]

java 实现分布式锁的问题 java zk分布式锁_java 实现分布式锁的问题_04

现在 有三个客户端,和一个服务器,Server 里面有 根节点/ ,和两个子节点

现在比如说 client1 想要获取锁,就可以在 /lock 节点下再 创建一个子节点,用完锁后 删掉就行了

[流程]

  1. 客户端获取锁时,在lock节点[这个 节点名字无所谓]下创建临时顺序节点。

java 实现分布式锁的问题 java zk分布式锁_java-zookeeper_05

它们 三个 客户端每人都整了一个 ,一一对应

  1. 然后(所有客户端 会)获取lock下面的所有子节点,客户端获取到所有的子节点之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除。
  2. 如果发现自己创建的节点并非lock所有子节点中最小的【图中就是 指2、3 不是】,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个【只找一个】节点,同时对其注册事件监听器,监听删除事件。

java 实现分布式锁的问题 java zk分布式锁_java-zookeeper_06

所以在这里就是 2找1、3 找2 ,并添加监听器【监听删除 事件】

java 实现分布式锁的问题 java zk分布式锁_java 实现分布式锁的问题_07

  1. 如果发现比自己小的那个节点被删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否是lock子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。

【很巧妙】

java 实现分布式锁的问题 java zk分布式锁_java 实现分布式锁的问题_08

在client1 用完锁后,lock/2 对 lock/1 进行的监听就会立马感知到,然后再次判断,OK,它现在是最小的了, 拿到锁

【这就是 Zookeeper 实现分布式 锁的原理】