当前位置: 首页 / 技术分享 / 正文
ZooKeeper实现分布式锁

2023-01-06

节点    child 分布式

  1. 分布式锁的介绍

  在Java的多线程部分,我们知道如果在一个jvm进程中,多个线程之间同时访问一个资源,此时会有多线程的安全问题。为了解决这个线程安全的问题,我们可以使用“锁”来实现。但是,多个jvm进程之间如果同时访问一个资源呢?此时在Java部分学习到的“锁”已经不能解决这个问题了,我们就需要“分布式锁”来实现这样的效果了。

  维基百科对分布式锁的定义:

  分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。

  2. 分布式锁的分类

  在不同的业务场景下,分布式锁也有不同的使用方式,常见的分类有两种: 阻塞锁 和 非阻塞锁。

  阻塞锁:

  当有多个jvm进程同时访问一个共享的资源的时候,已经抢到分布式锁的jvm进程执行自己的业务逻辑,没有抢到分布式锁的jvm进程进入阻塞状态等待。获取到分布式锁的jvm进程在处理完自己的业务逻辑之后,会将锁进行释放。

  执行自己的业务逻辑争抢分布式锁事物开始抢到了锁没有抢到锁释放锁事务结束

分布式锁-同步

  非阻塞锁:

  当有多个jvm进程同时访问一个共享的资源的时候,已经抢到分布式锁的jvm进程执行自己的业务逻辑,没有抢到分布式锁的jvm进程不会等待,直接结束,不执行任何的业务逻辑。

  争抢分布式锁执行自己的业务逻辑事物开始抢到了锁释放锁事务结束没有抢到锁

分布式锁-非阻塞

  3. 分布式锁的原理

  使用ZooKeeper实现分布式锁,其实就是在Zookeeper上进行节点的创建。多个程序同时需要操作一个共享的资源时,可以先在ZooKeeper进行节点的注册,注册成功的表示抢到了锁,注册失败的表示没有获取到锁。

  3.1. 使用节点实现

  所有的程序向ZooKeeper中注册同一个指定名字的节点,首先将节点创建成功的程序持有锁,可以操作共享资源。后来的程序在进行节点创建的时候,发现锁已经存在了,于是无法重复注册。

  3.2. 使用子节点实现

  所有的程序向ZooKeeper中的指定节点下注册子节点(需要使用短暂、有序节点),以节点的序号为优先级,序号小的更早注册,序号大的晚注册。于是,序号小的节点获取到锁,其他的程序依次向前监听节点。

  以/root节点,5个程序为例:

  A程序注册节点/root/child0001

  此时子节点: { child0001 }

  自己就是序号最小的节点,可以获取锁,执行自己的逻辑操作

  B程序注册节点/root/child0002

  此时的子节点: { child0001, child0002 }

  B发现自己不是最小的节点,说明有人捷足先登了,于是监听自己前面的child0001节点

  C程序注册节点/root/child0003

  此时的子节点: { child0001, child0002, child0003 }

  C发现自己不是最小的节点,说明有人捷足先登了,于是监听自己前面的child0002节点

  此时A程序执行结束了,由于是短暂类型的节点,因此child0001节点会被删除

  此时的子节点: { child0002, child0003 }

  B程序由于监听了child0001,因此可以得知这个节点已经被删除了,被唤醒之后发现自己就是最小的节点,获取到锁,执行逻辑

  D程序注册节点/root/child0004

  此时的子节点: { child0002, child0003, child0004 }

  D发现自己不是最小的节点,说明有人捷足先登了,于是监听自己前面的child0003节点

  此时B程序执行结束了,由于是短暂类型的节点,因此child0002节点会被删除

  此时的子节点: { child0003, child0004 }

  C程序由于监听了child0002,因此可以得知这个节点已经被删除了,被唤醒之后发现自己就是最小的节点,获取到锁,执行逻辑

  E程序注册节点/root/child0005

  此时的子节点: { child0003, child0004, child0005 }

  E发现自己不是最小的节点,说明有人捷足先登了,于是监听自己前面的child0004节点

  ...

分享: 更多

上一篇:毕设项目-教辅机构信息化平台

下一篇:

好程序员公众号

  • · 剖析行业发展趋势
  • · 汇聚企业项目源码

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2021-04-12(深圳)

    开班盛况

    开班时间:2021-05-17(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2021-03-22(杭州)

    开班盛况

    开班时间:2021-04-26(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-05-10(北京)

    开班盛况

    开班时间:2021-02-22(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2019-07-22(北京)

    开班盛况
在线咨询
试听
入学教程
立即报名

Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号