当前位置:   article > 正文

14.0 Zookeeper环球锁实现原理

14.0 Zookeeper环球锁实现原理

全局锁是控制全局系统之间同步访问共享资源的一种方式。

下面介绍zookeeper如何实现全民锁,讲解他锁和共享锁两类全民锁。

排他锁

排他锁(Exclusive Locks),又被称为写锁或独占锁,如果事务T1对数据对象O1加上排他锁,那么整个加锁期间,只允许事务T1对O1进行和读取更新操作,其他事务都不能进行读或写。

定义锁:

/exclusive_lock/lock

实现方式:

利用zookeeper的同级节点的唯一性特性,在需要获取排他锁时,所有的客户端尝试通过调用create()接口,在/exclusive_lock节点下创建临时子节点/exclusive_lock/lock,最终只有一个客户端能力创建成功,那么此客户端就获得了一轮锁。同时,所有没有获取到锁的客户端可以在/exclusive_lock节点上注册一个子节点变更的watcher监听事件,以便重新争取获得锁。

共享锁

共享锁(Shared Locks),约定读锁。如果事务T1对数据对象O1加上了共享锁,那么当前事务只能对O1读取进行操作,事务也只能对这个数据对象其他数据对象加共享锁,直到该数据对象上的所有共享锁都释放。

定义锁:

/shared_lock/[hostname]-请求类型W/R-序号

实现方式:

1、客户端调用create方法创建类似定义锁定方式的临时顺序节点。

2、客户端调用 getChildren 接口来获取所有已创建的子节点列表。

3、判断是否获得锁,对于读请求如果所有比自己小子节点都是读请求或者没有比自己序号小子节点,表明已经成功获取共享锁,同时开始执行度逻辑。对于写请求,如果自己不是序号最小的子节点,那么就进入等待。

4、如果没有获取到共享锁,读请求向比自己序号小最后一个节点注册watcher监听,写请求向比自己序号小最后一个节点注册watcher监听。

实际开发过程中,可以通过curator工具包封装的API帮助我们实现全球锁。

  1. <dependency>
  2. <groupId>org.apache.curator</groupId>
  3. <artifactId>curator-recipes</artifactId>
  4. <version>x.x.x</version>
  5. </dependency>

策展人的几种锁方案:

  • 1、InterProcessMutex:多重可重入排锁
  • 2、InterProcessSemaphoreMutex:遍布它锁
  • 3、InterProcessReadWriteLock:全局读写锁

下面的例子模拟50个线程使用重入排它锁InterProcessMutex同时争抢锁:

  1. public class InterprocessLock {
  2.     public static void main(String[] args)  {
  3.         CuratorFramework zkClient = getZkClient();
  4.         String lockPath = "/lock";
  5.         InterProcessMutex lock = new InterProcessMutex(zkClient, lockPath);
  6.         //模拟50个线程抢锁
  7.         for (int i = 0; i < 50; i++) {
  8.             new Thread(new TestThread(i, lock)).start();
  9.         }
  10.     }
  11.     static class TestThread implements Runnable {
  12.         private Integer threadFlag;
  13.         private InterProcessMutex lock;
  14.         public TestThread(Integer threadFlag, InterProcessMutex lock) {
  15.             this.threadFlag = threadFlag;
  16.             this.lock = lock;
  17.         }
  18.         @Override
  19.         public void run() {
  20.             try {
  21.                 lock.acquire();
  22.                 System.out.println("第"+threadFlag+"线程获取到了锁");
  23.                 //等到1秒后释放锁
  24.                 Thread.sleep(1000);
  25.             } catch (Exception e) {
  26.                 e.printStackTrace();
  27.             }finally {
  28.                 try {
  29.                     lock.release();
  30.                 } catch (Exception e) {
  31.                     e.printStackTrace();
  32.                 }
  33.             }
  34.         }
  35.     }
  36.     private static CuratorFramework getZkClient() {
  37.         String zkServerAddress = "192.168.3.39:2181";
  38.         ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3, 5000);
  39.         CuratorFramework zkClient = CuratorFrameworkFactory.builder()
  40.                 .connectString(zkServerAddress)
  41.                 .sessionTimeoutMs(5000)
  42.                 .connectionTimeoutMs(5000)
  43.                 .retryPolicy(retryPolicy)
  44.                 .build();
  45.         zkClient.start();
  46.         return zkClient;
  47.     }
  48. }

控制台每间隔一个工作站输出一条记录:

希望你也学会了,更多编程源码模板请来二当家的素材网:https://www.erdangjiade.com

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/78220
推荐阅读
  • vhost:每个RabbitMQ都能创建很多vhost,我们称之为虚拟主机,每个虚拟主机其实都是mini版的RabbitMQ,它拥有自己的队列,交换器和绑定,拥有自己的权限机制,主要是为了隔离,vhost不仅消除了为基础架构中的每一层运行一... [详细]

  • 传统的单体框架,已经不满足目前公司战略规划要求,近几年“微服务“这个字眼,出现的越来越频繁,虽然有过一年多微服务项目经验,也很难把微服务解释清楚,到底何为微服务?哈哈哈,好正经的开头,MartinFowler曾在其blog上发表了”Micr... [详细]

  • 所需准备工作,创建三台虚拟机环境并安装好java开发工具包JDK,可以使用VM或者vagrant+virtualbox搭建centos/ubuntu环境,本案例基于宿主机windows10系统同时使用vagrant+virtualbox搭建... [详细]

  • 本章节介绍一下zookeeper的节点特性和简单使用场景,正是由于这些节点特性的存在使zookeeper开发出不同的场景应用。9.0Zookeeper节点特性本章节介绍一下zookeeper的节点特性和简单使用场景,正是由于这些节点特性的存... [详细]

  • zookeeper支持某些特定的四字命令与其交互,用户获取zookeeper服务的当前状态及相关信息,用户在客户端可以通过telenet或者nc(netcat)向zookeeper提交相应的命令。8.0Zookeeper四字命令教程详解zo... [详细]

  • 本教程使用的IDE为IntelliJIDEA,创建一个maven工程,命名为zookeeper-demo,并且引入如下依赖,可以自行在maven中央仓库选择合适的版本,介绍原生API和Curator两种方式。4.0ZookeeperJava... [详细]

  • ZooKeeper是Apache软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper的架构通过冗余服务实现高可用性。Zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服务... [详细]

  • 修改zoo.cfg配置文件,将dataDir=/tmp/zookeeper修改成zookeeper安装目录所在的data文件夹,再添加一条添加数据日志的配置(需要根据自己的安装路径修改)。选择一稳定版本,本教程使用的release版本为3.... [详细]

  • 即使正确实现了这些服务,当应用程序部署时,这些服务的不同实现也会导致管理上的复杂性。由于实现这些服务的难度很大,应用程序通常会在这方面偷工减料,这使得它们在发生变更。每次实现这些服务时,都需要做大量的工作来修复不可避免的错误和竞态条件。所有... [详细]

  • 其中客户端注册watcher有三种方式,调用客户端API可以分别通过getData、exists、getChildren实现,利用前面章节创建的maven工程,新建WatcherDemo类,以exists方法举例说明其原理。11.0Zook... [详细]

  • ZooKeeper使用详解一、概述Zookeeper:一个分布式协调服务为分布式应用ZooKeeper是一个分布式、开源的协调服务为分布式应用。它暴露了一组简单的原始集合,分布式应用能构建在此之上来实现更高级的服务,比如:同步、维护配置、以... [详细]

  • Zookeeper中,主要依赖ZAB协议来实现分布式数据一致性。12.0Zookeeper数据同步流程在Zookeeper中,主要依赖ZAB协议来实现分布式数据一致性。ZAB协议分为两部分:消息广播崩溃恢复消息广播Zookeeper使用单... [详细]

相关标签
  

闽ICP备14008679号