zookeeper实现分布式锁

介绍

  分布式锁的作用:在整个系统提供一个全局、唯一的锁,在分布式系统中每个系统在进行相关操作的时候需要获取到该锁,才能执行相应操作

  大致思想为:每个客户端对每个方法加锁时,在zookeeper上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生死锁的问题

实现

  1. 利用Zookeeper可以创建临时有序节点的特性创建一个分布式锁。
  2. 多个系统的多个线程都要在此目录下创建临时有序节点,因为Zookeeper会为我们保证节点的有序性,所以可以利用节点的顺序性来对不同线程的先来后到进行判断。此时,在分布式下应该添加锁的线程就是zk指定目录下序号最小的临时序列节点所代表的线程。
  3. 当每个线程请求对应资源时,都需要现在zk指定目录下创建临时有序节点,然后获取当前目录下最小的节点序号(加锁的线程),判断最小节点是不是当前节点(是不是自己),如果是那么获取锁成功,如果不是获取锁失败。
  4. 获取锁失败的线程获取当前节点上一个临时有序节点,并对此节点进行监听。当该节点删除的时候(执行结束或者掉线,释放锁)这个线程会获取到通知,代表获取到了锁。这里的每一个节点都只是监听它的上一个节点,而不是监听最小的节点。因为临时节点都是有序号的,而且序号不会回退,所以只需要监听比其小1的节点。只要比它小1的节点被删除,则它就可以拿到资源去操作。

分布式锁流程