zookeeper典型应用场景

分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要通过一些互斥手段来防止彼此之间的干扰,以保证一致性,在这种情况下,就需要使用分布式锁了。

在平时的实际项目中开发中,我们往往很少会在意分布式锁,而是依赖于关系型数据库固有的排他性来实现不同进程之间的互斥,但大型分布式系统的性能瓶颈往往集中在数据库操作上。

排他锁

又称为写锁或者独占锁,是一种基本的所类型。如果事务T1对数据对象O1加上了排他锁,那么在整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能再对这个数据对象进行任何类型的操作--直到T1释放了其他锁。

从上面讲解的排他锁的基本概念中,我们可以看到,排他锁的核心是如何保证当前有且仅有一个事务获得锁,并且锁被释放后,所有正在等待锁的事务都能被通知到,下面我们来看一下这个列子

通常的java开发中,有两种常见的方式可以用来定义锁,分别是synchronized机制和JDK5提供的ReentrantLock。

在Zookeeper中,是通过zookeeper上的数据节点来表示一个锁,如lock节点就可以被定义为一个锁

如下图所示:

zookeeper典型应用场景_第1张图片

在需要或许排他锁时,所有的客户端都会试图通过调用create()接口,在/exclusive_lock节点下创建临时子节点/exclusive_lock/lock。zookeeper会保证在所有的客户端中,最终只有一个客户端能够创建成功,那么就可以该客户端获取了锁,同时,所有没有获取到锁的客户端就需要到/exclusive_lock节点上注册一个子节点变更的Watcher监听,以便实时监听到lock节点的变更情况。

释放锁

当获得锁的客户端宕机或者正常执行完业务逻辑后,客户端就会主动将自己创建的临时节点删除。

当移除了lock节点,zookeeper都会通知所有再/exclusive_lock节点上注册了子节点变更watcher监听的客户端。这些客户端在收到通知后,再次重新发起获取锁的请求,即重复过程;

 

你可能感兴趣的:(zookeeper典型应用场景)