Dawn's Blogs

分享技术 记录成长

0%

ZooKeeper学习 (2) 实现分布式锁和watch机制

ZooKeeper实现分布式锁

zookeeper中可以实现两种锁:

  • 读锁(共享锁):可以一起读,但是与写锁互斥。
  • 写锁(互斥锁):与读锁和写锁都互斥。

实现读锁

  • 创建⼀个临时序号节点,节点的数据是read,表示是读锁
  • 获取当前zookeeper中序号比自己小的所有节点。若这些节点有写锁,则加锁不成功。

读锁

实现写锁

  • 创建⼀个临时序号节点,节点的数据是write,表示是写锁
  • 获取zookeeper中所有的子节点
  • 判断自己是否是最小的节点:
    • 如果是,则上锁成功
    • 如果不是,说明前面还有锁,上锁失败,为最小节点设置监听。阻塞等待,watch机制会当最小节点发生变化时通知当前节点,再执行第二步

写锁

羊群效应

羊群效应:如果采用上述的上锁方式,只要有节点发生变化,就会触发其他节点的监听事件,这样对于zookeeper的压力非常大。

可以调整成链式监听:

链式监听

watch机制

watch就是注册在某个znode上的触发器,znode发生改变(创建、删除、更新)时,就会触发znode上的对应事件,请求watch的客户端会收到通知。