上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.4.4 ZooKeeper的分布式锁
可以利用Zookeeper不能重复创建一个节点的特性来实现一个分布式锁,这看起来和Redis实现分布式锁很像,但也是有差异的。因为ZooKeeper中分布式锁的本质是一个临时节点。利用ZooKeeper的分布式特性,可以实现一个“秒杀”的场景。图1.12展示了基于ZooKeeper的“秒杀”系统。
图1.12 基于ZooKeeper的“秒杀”系统
在这个系统中,当客户端应用程序要访问共享的资源并执行“秒杀”时,首先请求ZooKeeper集群得到相应的锁;得到锁的客户端应用才能进行第二步操作,访问共享资源,从而执行“秒杀”。如果客户端没有在第一步得到锁的信息,当前线程就会被阻塞,直到成功请求到锁的信息。由于在目前的架构中,在ZooKeeper集群中只定义了一把锁,在同一个时刻,只有一个客户端可以成功请求到锁,其他客户端就需要等待。相当于在我们当前的秒杀系统中,同一个时刻只支持一个客户端的“秒杀”。当前客户端执行完“秒杀”后,需要将锁的信息释放,并还给ZooKeeper集群,以便后续的客户端能够继续请求锁的信息。
下面的代码完整地展示了这个过程。