普通应用
- 分布式队列:通过ZK的持久化循序结点即可实现。
- 集群选举: 通过ZK的Leader选举功能即可实现。
- 发布订阅: 即ZK的注册监听功能。
分布式配置中心、注册中心
- 创建一个PERSISTENT持久化结点,
create /config/项目名 配置文件的JSON格式 - 客户端监听该结点,
get -w /config/项目名 ,当该结点数据发生变化时,也就意味着配置文件JSON发生了变化,客户端能第一时间感知到。由于监听是一次性的,循环监听即可。
分布式锁
非公平锁
- 请求进来,创建一个临时结点/lock,
create -s /lock , 如果该结点存在,ZK服务端会告知你该结点已经存在,不能重复创建; - 此时监听该结点,
get -w /lock/ 获得锁的请求,处理完后释放锁,即delete /lock/ 当前获取锁的结点,此时,会通知监听该结点的所有连接,在高并发的情况下,相当是一个灾难;
?如上实现方式在并发问题比较严重的情况下,性能会下降的比较厉害,主要原因是:所有的连接都在对同一个节点进行监听,当服务器检测到删除事件时,要通知所有的连接,所有的连接同时收到事件,再次并发竞争,这就是羊群效应。如何避免呢,我们看下面这种方式。
公平锁
- 直接在/lock结点下创建一个临时顺序结点。
- 判断自己是不是/lock结点下最小的结点。如果是最小的,即获得锁。如果不是,对前面一个结点进行监听
get -w /lock/ 前面一个结点 - 获得锁的请求,处理完后释放锁,即
delete /lock/ 当前获取锁的结点,然后它后面的一个结点会收到通知,重复第2步判断。
?
|