Zookeeper应用场景

1. 分布式锁

分布式锁有多种实现方式,比如通过数据库、redis都可实现。作为分布式协同工具ZooKeeper,也有着标准的实现方式。

1.1. 独占锁

在zookeeper中如何实现独占锁,设计思路如下:

  1. 每个zk客户端往Zookeeper中创建临时节点/lock,因为同级目录下,只能创建一个同名的节点,所以N个客户端只有一个客户端可以成功创建节点
  2. 成功创建节点的客户端相当于成功获取锁,继续执行相关的业务逻辑
  3. 其他创建失败的客户端,进行等待,同时创建Watcher,监听临时节点/lock
  4. 成功获取锁的客户端在执行完成业务逻辑后,只需要关闭连接,此时临时节点就会被删除,相当于释放锁。其他所有监听该节点的客户端全部开始重新创建临时节点/lock,竞争锁
  5. 当某个客户成功竞争到锁后,重复上述的逻辑

示例:

1.2. 排他锁

在zookeeper中如何实现排他锁,设计思路如下:

  1. 每个客户端往/Locks下创建临时有序节点/Locks/Lock_,创建成功后/Locks下面会有每个客户端对应的节点,如/Locks/Lock_000000001
  2. 客户端取得/Locks下子节点,并进行排序,判断排在最前面的是否为自己,如果自己的锁节点在第一位,代表获取锁成功
  3. 如果自己的锁节点不在第一位,则监听自己前一位的锁节点。例如,自己锁节点Lock_000000002,那么则监听Lock_000000001
  4. 当前一位锁节点(Lock_000000001)对应的客户端执行完成,释放了锁,将会触发监听客户端(Lock_000000002)的逻辑
  5. 监听客户端重新执行第2步逻辑,判断自己是否获得了锁

    2. 配置中心案例

    3. 生成分布式唯一ID