zookeeper实现分布式锁的原理
- 所有抢占资源的客户端,分别在zookeeper的同一个节点(e.g: /lock)下,创建一个自己的,临时且有序(-es)的节点
- 所有客户端均读取该节点(/lock)下的所有子节点,并判断自己创建的子节点是否是序号最小的
- 如果自己序号是最小的,则认为自己抢到了锁,直接执行自己的IO操作,然后删除掉自己创建的那个子节点,即释放锁
- 如果自己的序号不是最小的,则认为自己没有抢到锁,此时客户端在所有的子节点中,找到比自己子节点序号小的一个节点,向该节点的delete事件注册一个监听器
- 当delete监听器触发的时候,客户端再次确认一下自己的子节点序号是否是最小的,如果是最小的,则执行第3步,否则继续执行第4步