Zookeeper应用场景
1. 分布式锁
分布式锁有多种实现方式,比如通过数据库、redis都可实现。作为分布式协同工具ZooKeeper,也有着标准的实现方式。
1.1. 独占锁
在zookeeper中如何实现独占锁,设计思路如下:
- 每个zk客户端往Zookeeper中创建临时节点/lock,因为同级目录下,只能创建一个同名的节点,所以N个客户端只有一个客户端可以成功创建节点
- 成功创建节点的客户端相当于成功获取锁,继续执行相关的业务逻辑
- 其他创建失败的客户端,进行等待,同时创建
Watcher
,监听临时节点/lock - 成功获取锁的客户端在执行完成业务逻辑后,只需要关闭连接,此时临时节点就会被删除,相当于释放锁。其他所有监听该节点的客户端全部开始重新创建临时节点/lock,竞争锁
- 当某个客户成功竞争到锁后,重复上述的逻辑
示例:
1.2. 排他锁
在zookeeper中如何实现排他锁,设计思路如下:
- 每个客户端往/Locks下创建临时有序节点/Locks/Lock_,创建成功后/Locks下面会有每个客户端对应的节点,如/Locks/Lock_000000001
- 客户端取得/Locks下子节点,并进行排序,判断排在最前面的是否为自己,如果自己的锁节点在第一位,代表获取锁成功
- 如果自己的锁节点不在第一位,则监听自己前一位的锁节点。例如,自己锁节点Lock_000000002,那么则监听Lock_000000001
- 当前一位锁节点(Lock_000000001)对应的客户端执行完成,释放了锁,将会触发监听客户端(Lock_000000002)的逻辑
- 监听客户端重新执行第2步逻辑,判断自己是否获得了锁
2. 配置中心案例
3. 生成分布式唯一ID