游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

22张图带你彻底弄懂Zookeeper分布式锁

  这篇文章就来剖析Zookeeper分布式锁的实现框架Curator的源码,看看Curator是如何实现Zookeeper分布式锁的,以及它提供的哪些其它的特性。
  Curator框架是封装对于zk操作的api,其中就包括了对分布式锁的实现,当然Curator框架也包括其它的功能,分布式锁只是Curator的一部分功能。一、ZK分布式锁实现原理
  实现Zookeeper分布式锁,主要是基于Zookeeper的临时顺序节点来实现的。
  当客户端来加锁的时候,会先在加锁的节点下建立一个子节点,这个节点就有一个序号,类似lock000001,创建成功之后会返回给客户端所创建的节点,然后客户端会去获取这个加锁节点下的所有客户端创建的子节点,当然也包括自己创建的子节点。拿到所有节点之后,给这些节点进行排序,然后判断自己创建的节点在这些节点中是否排在第一位,如果是的话,那么就代表当前客户端就算加锁成功了,如果不是的话,那么就代表当前客户端加锁失败。
  加锁失败的节点并不会不停地循环去尝试加锁,而是在自己创建节点的前一个节点上加一个监听器,然后就进行等待。当前面一个节点释放了锁,就会反过来通知等待的客户端,然后客户端就加锁成功了。
  为什么需要在前一个节点加个监听器?
  假设有很多客户端来加锁,然后加锁失败的都对前一个节点加一个监听。那么一旦第一个加锁成功的客户端线程释放了锁,那么被唤醒的就是第二个客户端线程,第二个客户端线程就会加锁成功,执行完任务之后就释放了锁,那么就会唤醒第三个客户端线程,第三个客户端线程加锁成功,执行完任务之后就释放了锁,唤醒第四个客户端线程,以此类推,所以每次释放锁都会唤醒下一个节点,这样每个加锁的线程都会加锁成功,所以监听器的作用是唤醒加锁失败阻塞等待的客户端。二、为什么使用临时顺序节点
  下面介绍一下临时节点、持久化节点、顺序节点的特性。
  1)临时节点
  临时节点,指的是节点创建后,如果创建节点的客户端和Zookeeper服务端的会话失效(例如断开连接),那么节点就会被删除。
  2)持久化节点
  持久化节点指的是节点创建后,即使创建节点的客户端和Zookeeper服务端的会话失效(例如断开连接),节点也不会被删除,只有客户端主动发起删除节点的请求,节点才会被删除。
  3)有序节点
  有序节点,这种节点在创建时会有一个序号,这个序号是自增的。有序节点既可以是有序临时节点,也可以是有序持久化节点。
  从上面节点的特性可以知道,临时节点相比持久节点,最主要的是对会话失效的情况处理不一样,如果使用临时节点的话,如果客户端发生异常的话,没有来得及主动释放锁,就能避免锁无法释放导致死锁的情况。因为一旦客户端异常,那么客户端和服务端之间的会话就会失效,然后临时节点就会被删除,这样就释放了锁;而持久化节点在由于会话失效无法被删除,那么就不会去释放锁,这样就会产生死锁的问题。
  从这里可以看出redis和zk防止死锁的实现是不同的,redis是通过过期时间来防止死锁,而zk是通过临时节点来防止死锁的。
  为什么使用顺序节点?其实为了防止羊群效应。如果没有使用顺序节点,假设很多客户端都会去加锁,那么加锁就会都失败,都会对加锁的节点加个监听器,那么一旦锁释放,那么所有的加锁客户端都会被唤醒来加锁,那么一瞬间就会造成很多加锁的请求,增加服务端的压力。
  所以综上,临时顺序节点是个比较好的选择。三、加锁的逻辑是如何实现的
  前面关于ZK分布式锁实现原理已经说过了,接下来就来看一下代码的实现。
  加锁的使用方法如下,接下来几节会着重讲解这段代码背后的逻辑
  acquire方法的实现
  acquire方法会去调用internalLock方法,传入超时时间1和单位null,也就代表了如果加锁不成功会一直阻塞直至加锁成功,不会超时。
  internalLock方法会先去获取当前线程,然后从threadData中获取当前线程对应的LockData,这里面封装了加锁的信息和次数,是实现可重入锁的关键,当然第一次加锁这里肯定是没有的,会继续下走internals。attemptLock加锁。
  attemptLock方法
  先通过driver的createsTheLock去创建节点。
  从这里看出,创建的节点类型是临时顺序节点,创建成功之后,就会返回当前创建的节点。
  节点创建成功之后,会调用internalLockLoop方法来加锁。
  通过getSortedChildren方法获取排好序的子节点,然后获取当前的节点名称,再通过driver。getsTheLock判断当前的节点有没有加锁成功,返回一个PredicateResults判断的结果,这里面存的就是否加锁成功的信息。
  第一次加锁,那么到这里就加锁成功了。之后就会封装一个LockData对象,放入threadData的map中。
  加锁的流程如下图:
  四、如何实现可重入加锁
  上文加锁的时候提到了,当第一次加锁成功之后,会往threadData放入该加锁的线程对应的LockData。
  LockData主要封装了当前线程、加锁的次数、加锁的节点。
  此时如果第二次来加锁,那么就会从threadData中获取到加锁的信息,然后将加锁次数加1,就代表了加锁成功,然后直接返回。
  所以可重入加锁的实现很简单,就是在客户端中判断有没有加过锁,加过的话就将加锁次数累加1,压根就跟服务端没有交互。
  注意Redisson可重入加锁的实现跟的Curator是不一样的,Redisson的加锁次数是存在Redis的服务端的,而Curator是存在客户端的。
  五、加锁失败之后如何实现阻塞等待加锁
  前面加锁的逻辑主要是说了加锁成功的情况,这里就来说一下加锁失败的情况。
  继续来看internalLockLoop方法。
  前面说过,判断有没有加锁成功,会返回一个PredicateResults,这里面包含了有没有加锁成功的信息,同时如果没有加锁成功,就会返回需要监听的节点,也就是当前创建的节点的前一个节点。
  所以没有加锁成功,就会走else的逻辑,对上一个节点加一个监听器watcher
  然后就会调用wait方法,进行等待。
  当前一个节点被删除了,也就是释放了锁,那么就会回调这个监听器watcher的方法。
  所以,这个watcher的作用就是调用notifyAll方法唤醒调用wait方法的线程,这样线程就会继续尝试加锁,因为是在一个while的循环中。六、如何实现阻塞等待一定时间还未加锁成功就放弃加锁
  可通过下面这个方法来实现实现阻塞等待一定时间还未加锁成功就放弃加锁。booleanacquire(longtime,TimeUnitunit)throwsException复制代码
  这个方法相比不指定等待时间的方法最主要的区别就是加锁失败之后,调用的阻塞的方法不一样。当不指定超时时间就会调用wait()方法,不会传入等待时间,不被唤醒就会一直阻塞;指定超时时间的时候,就会调用wait(longtimeout)指定等待的时间,这样如果等待时间一到,线程就会醒过来,然后再次尝试加锁,一旦加锁失败,就会放弃加锁。
  七、如何主动释放锁和避免其它线程释放锁
  释放锁release方法
  释放锁其实很简单,就是拿出当前线程对应的LockData,如果没有,就说明当前线程没有加过锁,就会抛出异常,所以Curator就是通过这个判断来防止其它线程释放了自己线程加的锁。
  如果加锁了,那么LockData就不会为null,然后将加锁次数递减1,得到newLockCount,代表了剩下的加锁次数。如果newLockCount0,说明锁没释放完,有可重入加锁,然后什么事都不干,直接返回了。如果newLockCount0,就抛异常,但是一般不会出现。剩下的一种情况就是newLockCount0,说明锁已经完完全全释放完了,然后通过internals。releaseLock删除加锁的节点。
  服务端删除节点之后,就会通知监听该节点的客户端,然后客户端就会回调watcher监听器,唤醒阻塞等待的线程,线程被唤醒后再进行一次判断就能加锁成功。
  到这里,就讲完了加锁和释放锁的过程,整个加锁和释放锁的过程就如下图所示。
  八、如何实现公平锁
  其实使用临时顺序节点实现的分布式锁就是公平锁。所谓的公平锁就是加锁的顺序跟成功加锁的顺序是一样的。
  因为节点的顺序就是被唤醒的顺序,所以也就是加锁的顺序,所以天生就是公平锁。九、如何实现读写锁
  读写锁使用如下。
  创建节点的时候,节点的内容中会有一个标记来代表当前节点加的是什么类型的锁。
  当需要加写锁时,需要判断自己创建的节点是否排在第一位,如果是就能加锁成功,所以一旦前面有节点,不论前面加是读锁还是写锁,那么都是加锁失败,实现了读写互斥和写写互斥。当然写锁和读锁都是可以重入加锁的。
  当需要加读锁的时候,会去判断自己创建节点的前面有没有写锁,如果没写锁,那么说明前面加的都是读锁,那么读锁就能加锁成功,读读不互斥,如果前面有写锁,那么就加锁失败(自己加的写锁除外),读写互斥。十、如何实现批量加锁
  批量加锁的意思就是同时加几个锁,只有这些锁都算加成功了,才是真正的加锁成功。
  Redisson也实现了批量加锁的功能,Redisson的实现通过RedissonMultiLock类实现的,RedissonMultiLock会去遍历需要加的锁,然后每个都加成功之后才算加锁成功。Curator是封装了InterProcessMultiLock类来实现的批量加锁的,那么InterProcessMultiLock如何实现的呢?
  使用代码如下。
  InterProcessMultiLock的acquire的方法实现。
  从这里可以看出,InterProcessMultiLock也是遍历传入的锁,然后每个锁都加锁成功了,InterProcessMultiLock才算加锁成功。
  所以从这里可以看出,跟Redisson实现的批量加锁的实现思想上基本是一样的,都是遍历加锁。十一、ZK分布式锁和Redis分布式锁到底该选谁
  这是一个比较常见的面试题。
  redis分布式锁:优点:性能高,能保证AP,保证其高可用,缺点:正如Redisson的那篇文章所言,主要是如果出现主节点宕机,从节点还未来得及同步主节点的加锁信息,可能会导致重复加锁。虽然Redis官网提供了RedLock算法来解决这个问题,Redisson也实现了,但是RedLock算法其实本身是有一定的争议的,有大佬质疑该算法的可靠性;同时因为需要的机器过多,也会浪费资源,所以RedLock也不推荐使用。
  zk分布式锁:优点:zk本身其实就是CP的,能够保证加锁数据的一致性。每个节点的创建都会同时写入leader和follwer节点,半数以上写入成功才返回,如果leader节点挂了之后选举的流程会优先选举zxid(事务Id)最大的节点,就是选数据最全的,又因为半数写入的机制这样就不会导致丢数据缺点:性能没有redis高
  所以通过上面的对比可以看出,redis分布式锁和zk分布式锁的侧重点是不同的,这是redis和zk本身的定位决定的,redis分布式锁侧重高性能,zk分布式锁侧重高可靠性。所以一般项目中redis分布式锁和zk分布式锁的选择,是基于业务来决定的。如果你的业务需要保证加锁的可靠性,不能出错,那么zk分布式锁就比较符合你的要求;如果你的业务对于加锁的可靠性没有那么高的要求,那么redis分布式锁是个不错的选择。

中国科研人员揭示绿瘦蛇体色差异的分子机制绿瘦蛇及不同体色。中科院成都生物研究所供图中新网成都3月16日电(记者贺劭清)记者16日从中科院成都生物研究所获悉,该研究所李家堂研究团队结合透射电镜、组学测序和功能实验……互撕退圈读博生子搞事业,天使之路模特五年后发展各不同维多利亚的秘密这个内衣品牌算不上顶级,但它曾经一年一度举办的大秀却是每年全球时尚界最瞩目的大秀之一。当年一流超模都聚集在此,吉娘娘、利马、米兰达可儿都曾是这里的常客。20……17日猪价大跌,蛋价也同步回落,巧合还是必然,还能涨?鸡蛋日评:蛋价止涨回落期货小幅调整2022年10月17日,全国主产区鸡蛋价格止涨回落,均价5。79元斤,较上周五跌0。12元斤。其中,价格最高地区辽宁均价6。00元斤,价……景嘉微研究报告领军国产GPU,迎信创生态机遇(报告出品方作者:财信证券,邓睿祺)1景嘉微:秉承国防科大精神的国产GPU领军企业1。1秉承国防科大精神,自主知识产权理念扎根其中长沙景嘉微电子有限公司成立于200……裤子选得好,显瘦又时髦!50岁女人试试这几条,实用还好看裤子作为最基础常见的搭配单品之一,可能有很多姐妹们都忽略了它在穿衣搭配中所发挥的重要作用。其实选对裤子不仅可以大大提升整体搭配的质感,还能轻松修饰身形、优化身材比例,显瘦显高效……做提眉比不做老得快?权威眼整形医生给你揭秘提眉真相!昨天有求美者在后台咨询我,说朋友做了提眉后年轻了10几岁都不止,自己也想做,但是又听说做了提眉比不做老得更快,所以一直特别纠结。如果你也在担心做提眉会比不做老得更快,就快……我国科研人员在光伏电池制造领域取得新进展记者11日从南京工业大学了解到,该校科研团队在光伏电池制造领域取得新进展,突破了用丝网印刷技术制备钙钛矿薄膜的关键技术。相关论文近日由国际学术期刊《自然》在线发表。据介绍……多重购机福利用三星GalaxyS21FE5G享潮流生活方式春夏交替时节,趁阳光正好,微风不燥,和好友、家人来一场野餐出行,感受大自然的生机勃勃。在这样的美好时光中,智能手机是必不可少的扮靓单品,也是记录精彩瞬间的便捷装备。三星Gala……美国春晚!第57届超级碗收视率出炉全场平均收视人次高达1。12月14日消息,刚刚结束的第57届超级碗收视率正式出炉。据外媒报道,在堪萨斯城酋长队以38比35战胜费城老鹰队成功捧杯的比赛中,全场平均收视人次高达1。13亿。该数据包含Fox……2023年养老金上调,3000元以下涨500元,5000元以2023年养老金上调,3000元以下涨500元,5000元以上不涨,可行吗2005年以来,我国职工养老金已经连续实现了18年上涨,养老金上涨是退休人员每年都十分期待的事。……新春美文年夜饭来源:【人民日报出版社】一年中最大最隆重的节日莫过于春节了。我们那里一进腊月,女人们就开始忙年了。她们会每天发上一块大面团,花样翻新地蒸年干粮,什么馒头、豆包、糖三角、花……经常吃海鲜有哪些好处和坏处?如今大家都追求完美健康的饮食,都比较多元素化了,没有什么是简单的荤菜以内的了,因此针对海货我们一点也不生疏了,海货我们都较为喜爱的一种食材,不论是如何吃都是感觉它不但口味美味,……
一个人心中有暖,眼里幸福,嘴中扬善人生是一个持续清醒的全过程,大家历经着,发展着,为人处事要活成一束光,点亮自身,温馨他人,将生活打磨抛光成自身喜爱的模样。每一个未曾翩翩起舞的日子,全是对生命的错过,每一天,尽……发到朋友圈,点赞得过百1、无数个瞬间我都在想,你在就好了,结果还是我一个人熬过了所有的瞬间,后来,不用了,谢谢。2、人生不止,寂寞不已。寂寞人生爱无休,寂寞是爱永远的主题。我和我的影子独处,它……阴血亏虚,失眠烦躁?一个妙方,补气养血养心助眠充满活力大家好,我是刘医生。现在很多人都受到失眠的困扰,经常出现入睡困难、多梦、早醒等症状,还总是感觉烦躁,心神不宁的,脸上也没有什么气色。检查之后也没什么问题,这到底是怎么回事呢?……上马10公里精英赛金秋举行报名今天启动视频加载中。。。今天(9月22日)下午,上马组委会宣布,2022闻泰安世上海10公里精英赛,将于11月6日举行。路线全程途经光复西路、大渡河路、云岭东路、长风公园等普陀地……四季交替你最爱长沙哪个季节没有熟悉的人陪伴,你自己游玩长沙,你觉得会享受这个时刻吗?19年从南宁出发去长沙看看很久未见的朋友,延是从上学就认识的朋友了,大学时就各奔东西了,我在天津,她在长沙。……318家国家5A级旅游景区,你去过几家?(湖北省14家)头条创作挑战赛国家AAAAA级旅游景区,即5A级景区,为中华人民共和国旅游景区质量等级划分的景区级别,共分为五级,从高到低依次为AAAAA、AAAA、AAA、AA、A级五……原来这就是天道(请收藏)老子说:天网恢恢,疏而不失。自然万物都要遵循天道的规律,若是逆天而行,必定会受到老天的惩罚,给自己带来祸事。人在做,天在看,世间之事,凡有果,必有因。人与人相……2个31113,中国17小将强势爆发,徐奕夺得2连胜北京时间6月22日消息,2022年国际乒联WTT支线赛奥托塞克站资格赛继续进行。女子单打第二轮,中国17岁小将徐奕状态出色,30横扫挪威选手瑞克斯卡特,取得两连胜。第一轮,徐奕……人到晚年,少说这些事,福气会越来越多人一辈子,用三年学会说话,用一生学会闭嘴。水深不语,人稳不言,少言不仅是修养,更是智慧。人到晚年,少说这些事,你的福气会越来越多。不提及过往的痛苦每个人都有过痛苦的……央视实锤,美国长期监听中国手机大伙好久不见,最近太多重磅发布会了,我们只好连续几天都提早发布。。。华为Mate50正面PKiPhone14,大家会怎么选呢?从总体产品力上看,iPhone14系列……从爆红到解约,从下跪拜师到隐婚生子,黄圣依还能不能翻盘你能相信以下这些评分低的影视剧,出自同一人之手吗?电影《战神再现》,2006年上映,评分4。0。电视剧《广府太极传奇》,2010年播出,评分3。5。电影《舍身……对于交通安全,你了解多少衣、食、住、行,是人们生活中最基本的内容,其中的行,要涉及交通问题。平日里上学、放学,节假日外出、旅游,除了步行以外,还要骑自行车、乘公共汽(电)车,路程更远的,要乘火车、乘船……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网