1. ZK中锁的种类
- 读锁:大家都可以读,要想上读锁的前提:之前的锁没有写锁;
- 写锁:只有得到写锁的才能写。要想上写锁的前提:之前没有任何锁;
2. ZK如何上读锁
- 创建一个临时序号节点,节点的数据是read,表示是读锁
- 获取当前zk中序号比自己小的所有节点
- 判断最小节点是否是读锁
- 如果不是读锁的话,则上锁失败,为最小节点设置监听。阻塞等待,zk的watch机制会当最小节点发生变化时通知当前节点,于是再执行第二步的流程
- 如果是读锁的话,则上锁成功
3. ZK如何上写锁
- 创建一个临时序号节点,节点的数据是write表示是写锁
- 获取zk中所有的子节点
- 判断自己是否是最小的节点
- 如果是,则上写锁成功
- 如果不是,说明前面还有锁,则上锁失败,监听最小的节点,如果最小节点有变化,则回到第二步。
4. 羊群效应
如果用上述的上锁方式,只要有节点发生变化,就会触发其他节点的监听事件,这样的话对zk的压力非常大一一羊群效应。可以调整成链式监听。解决这个问题