zookeeper分布式锁理解

分布式锁的意思是,我们知道,一个应用请求服务集群,往往是多线程请求的,甚至是多个应用,每个应用多条线程同时请求的,那么当我们有某个需求,不希望多并发执行,只希望一条一条线程,一个一个请求排队执行,比如应用程序修改zookeeper的某个节点,而这个节点是一个集群的配置,那么我只希望一条线程去统一修改配置,而不希望并发去修改配置;再如,我希望hadoop集群同一时间只执行一个mapReduce包,整个服务器资源都能全力执行这个任务;这些时候,我们往往想到的是队列,将你的任务放到队列里面,让队列挨个执行,但是你要知道,队列是非阻塞的,而我们现在需要的是“应用程序→请求集群服务→反馈给客户端”,这是有流程的,队列是,你将任务扔到队列里面,队列不会给每个线程即时反馈的,而我虽然需要排队执行,让任务不受其他线程干扰,但是我又需要完成任务后即时得到反馈,它其实是让线程处于一个阻塞的过程,如果是单点应用程序,我们可以给方法加锁(用synchronized),但是现在这是分布式应用程序,程序分布在不同进程中的,而进程是没办法干预进程的,所以这叫分布式锁,给分布式的线程加锁。

         了解了概念之后,我们说说原理,当应用程序启动后,每个应用程序的每条线程接收到请求都在zookeeper的某个父znode上下写上一个临时性的子znode,然后每个线程都监听在它的前一个znode,就相当于排队上厕所,这些子znode就相当于排队的人,我看轮到我上厕所没,肯定盯着我前一个人,如果前一个人上完厕所,走了,我前面没人了,那就轮到我了,这里注意,前一个人走了,不一定表示就轮到了,可能是他临时有事离开了,如果我的前面依然还有人,这时我应该再盯着我现在前面的一个人,直到我前面一个人消失了,并且前面再没有人了,就轮到我了,所以现在每个线程都监听在它的前一个子znode上,直到子znode消失了,证明它对应的线程执行完了,那么zookeeper会通知下一个子znode对应的线程。原理就是这样,当不同进程的不同线程都在zookeeper中写顺序的子znode,同时监听在它的前一个子znode上,然后等在那里,当zookeeper通知某线程,他的前一个znode已经消失了,那么线程继续跑,检查前面还有没有子znode了,如果没有,证明轮到自己执行了。这就是分布式锁的原理,实际上应该叫分布式线程锁,非分布式的线程锁(单进程的线程锁)我们用synchronized让线程阻塞,如果是分布式的线程锁,我们不能使用队列,因为队列是非阻塞的,而我们需要阻塞的时候,就需要理解上面的原理。

你可能感兴趣的:(zookeeper)