ZooKeeper实现分布式锁
zookeeper中可以实现两种锁:
- 读锁(共享锁):可以一起读,但是与写锁互斥。
- 写锁(互斥锁):与读锁和写锁都互斥。
实现读锁
- 创建⼀个临时序号节点,节点的数据是read,表示是读锁
- 获取当前zookeeper中序号比自己小的所有节点。若这些节点有写锁,则加锁不成功。
实现写锁
- 创建⼀个临时序号节点,节点的数据是write,表示是写锁
- 获取zookeeper中所有的子节点
- 判断自己是否是最小的节点:
- 如果是,则上锁成功
- 如果不是,说明前面还有锁,上锁失败,为最小节点设置监听。阻塞等待,watch机制会当最小节点发生变化时通知当前节点,再执行第二步
羊群效应
羊群效应:如果采用上述的上锁方式,只要有节点发生变化,就会触发其他节点的监听事件,这样对于zookeeper的压力非常大。
可以调整成链式监听:
watch机制
watch就是注册在某个znode上的触发器,znode发生改变(创建、删除、更新)时,就会触发znode上的对应事件,请求watch的客户端会收到通知。