00:00
好,各位同学,我们继续通过前面从一到七版本程序的演化迭代和改进,我们基于red的哈希结构,用set命令加lur脚本结合设计模式,到这几乎完成了我们的所得高可用独占和可重入性相关的验证,从所得规范,也就是说我们实现或者说继承了我们的洛可接口,这个到这儿写的差不多了,那么从业务上我们需要完成一个自动续期的设计和考虑,好,那么同学们请听我分析,这块就是我们的库存扣减,假如说啊,我们平时干这个业务20秒钟搞定,那么现在同学们请看我们的业务是不是25秒钟,换句话说多给他一点负。
01:00
赋语没问题吧,因为它上面啊有一个洛克,然后呢下面呢有一个俺洛克,平时20秒钟以内,可能这次啊15秒钟,这次呢12秒钟,总之一句话,20秒钟是肯定正常业务能够完成了,而且我们还打了一些富余,我给你25秒钟,正常情况下怎么都够了,但是突然啊,不排除有这种情况,网络拥堵,或者一下子出现一些什么故障,平时20秒钟就能完成的工作,到第20秒钟它没有完成,就没有自己按lock解锁,但是我们为了防止死锁的话,我们这个锁在写按lock的时候,我们是自带的过期时间的,也即正常情况20秒钟完成,我给你25秒的复余,但是到第25秒钟你的扣减库存业务逻辑还没有完成,对不起,我自动消失,你虽然说在里面干的业务逻辑,但是外面你也晓得的。
02:00
是有一大堆线程虎视眈眈的,那么这个时候如果到第25秒钟,你还是没有完成的业务逻辑,这个锁吧嗒自动消失,那么好,是不是又会出现我们之前讲过的张冠李戴,有可能自己的锁没有了,把别人的锁给误操作了,所以我们这儿需要有一种考虑,也即假如说到达了我们规定的过期时间,还没有完成我们的业务逻辑的话,我们需要有一个自动续期,自动续密的功。自动续命的这么一个功能,以及我们的老板时间到了还想爽一下加个中,你懂的,OK,好,那么接下来这个就是我们8.0版程序所要面对的业务要求和功能完善,如何确保red lock过期时间要大于业务执行时间的问题。一句话,Ready分布式锁如何续期?那你可能来个最简单粗暴,直接有效,这还不简单,给你干50秒,哎呀,25秒你都完不成,我再给你翻一倍,我给你干100秒,翻四倍总行了吧,怕就怕,如果到100秒也还没完成呢。
03:10
所以我们这是需要有一个后台的定时任务或者自动扫描的程序来给你扫,假如说啊,你呢,这是30秒钟,我们凑个整吧,啊,假设这儿就是30秒钟,那么到第20秒钟就已经过去十秒了,每十秒钟或者每15秒钟后台程序来间隔扫一下,如果发现你还是没有完成自动的又给你续期,追上去又给你恢复成30秒钟,那么这样是不是一直要等你自己彻彻底底完成的业务以后,你才能够进行对应的删除,所以这个就是我们现在要解决red分布式锁自动续命自动续期的问题,如何加个钟呢?那这个就是我们的业务要求。接下来我们继续给大家分享自动续期相关的设计和代码落地。在讲这个之前,我们大家呢,通过前面分析都会清楚,所谓自动续期也是red分布式锁高可用条件下的一种业务要求和功能完善。那么一旦说到这个,我们大家都清楚,真真正正的分布式系统是绝对绝对难以做到CP3个条件都满足的,考虑到后面也会涉及到这个知识,我们先把它提前做一下第二次的讲解和复习,那么首先啊,弟兄们要清楚ready的集群是AP。
04:32
保证P,这个P是什么?不说了,A是高可用,那么大家都明白啊,对于我们red,注意这是什么集群,Red可以把它理解为分两种情况,一个red单机,那么red单机它是没有办法保证A的,最经典的这个机器突然断电了,怎么可能保证高可用,电都没有了,所以说red单机你可以把它理解为它只能保证那个COK,当然单机的话不清楚的分布式系统不存在那个P,那么这个时候请大家要明白,单机我set k1为一,肯定有一条,那么假设我重启了red。
05:16
RDP和LF能够把硬盘上的数据重写或重新加载回我们的内存,这是一致性是可以得到很好的保障的。但是red如果一旦是单机,它呢,停电了或者淡机了,它是没有办法保证A高可用的。所以我们前面在小白篇零基础篇讲过一个东西叫哨兵和集群,哪怕你三组三从对外暴露是个大的red集群,某一台机器淡了不影响我们的使用,这个集群就叫AP高可用。OK,所以单机和集群red是两种概念,这是第一点。第二个我们用red集群,它是AP,那为什么说不能不可能保证CP呢?因为确实存在master宕机了以后。
06:04
Red的异步复制会造成数据,也就是现在的这把锁,它丢了,我写进了master,但是写完以后master还没有同步给我们的莱瓦,突然死了,这笔账在主节点上面master是有的,但是在从句点那还没来得及写进去,这个时候master还没来得及把刚刚塞进来这条数据传递给从节点,Master就挂了,那这个时候从基上位,但是对不起,从基根本就没有收到过这条数据,那么导致我们的系统出现了数据不一致的情况,所以red集群只能保证AP牺牲了CP。那么反过来,前面杨哥在给大家讲keepper的时候强调过zoo keepper集群啊,因为一般现在你互联网公司啊,不大可能玩单机,像什么用什么keepper,大场或者中场100%是什么集群,否则一定是会遇到我们的单点故障。
07:04
那只有一台机器死了,你怎么保证高可优,所以呢,我们都清楚啊,Rieper是CP,它慢一点,没有这么反应灵敏,但是它能保证数据一致,所有节点都OK了,我们才回复对方不会向red只有一个节点拿到马拿到马上搞定,异步复制了以后成不成后面再说。所以回到这,请大家看,我们大家都清楚啊zoo keepper服务器组的话呢,它分为master slave,或者也就叫leader floor,大家请看一号机,二号机三号机,我们这发请求过去啊,如keepper底层是CP,分期容错加一致,假如一号机我们呢,是给SERVE1去写那个东西啊,对外上面这个框框全是集群,对外暴露,就是个大的节点和keepper集群整体,那么SERVE1同步给SERVE2 serve2同步给各个。Flower,其他的各机对吧?只有整个过程都成功了,也即我们的数据三台机器所有节点都同步了,一号机才能收到,说OK,注册成功,非常保险对吧,非常靠谱,非常稳。但是这个机群是三台机器,如果下一个集群是五台呢?那么这样是不是我们的组keep对标我们的right集群而言稍微有点慢啊?基于此,如果组keep集群发生了故障,当这个leader死了,那么整个组K集群会重新选举老大。那么前面我们讲过帕pax OS,那么也就是我们的前面说过的什么东东,分布式一致性和选举算法,杨哥还给大家介绍了什么z ABB广播,那么就是我们的如keepper奥对吧,然后broadcast OK,原子广播。
09:00
来保证他的算法重新选出这个老大,那么在选举期间,这个client,对不起,我忙着去选新老大,对外不可营业,相当于春节放假,那么有点类似于这个zoo keepper集群,有点不太好用了,所以他只好牺牲了高可用A这个特性,只有选出新老大,交班成功以后,系统恢复注册。所以zoo keepper集群为了保证数据的一致性,这个C牺牲掉了高可用这个A。由于在大型分布系统当中你难以避免这样的故障,所以leader达出故障的可能性是很高的,那么只要你leader达挂了,马上去选举,一选举大家忙着在里面举手表决,开家长会,所以业务会慢一点,容错性不高,所以很多大型系统都不希望选择组keep作为我们的集群这样的节点,OK,好,那么顺便我们来复习复习我们的U瑞卡和ni克,那么切记,尤瑞卡呢,和我们的red一样,集群啊,我们现在说都是集群四大句型,它。
10:00
它呢是AP来有瑞卡呢也证明原理,有瑞卡是AP原理啊,集群的话,它呢保证了高可药物而牺牲了一致哦,那么我们呢,也强调过他的那些保护机制啊什么之类的啊,讲spring cloud的时候也说过,兰注册给serve基serve伊直接就马上告诉你成功了。Client client高client一些,高高兴兴就走了,剩下的就是SERVER1,在第三步同步给SERVER2,但为了保证高可右都是什么异步同步的,OK,那么一样,如red a集群AP有的问题,有瑞卡集群AP也存在啊,就怕什么主同,这样的话就是异步节点造成了这个数据的丢失,那么一样,耐考阿里巴巴的注册中心它的集群也是AP的,我们这儿呢,可以简单复习CP模型,里面有卡是AP nis呢也是AP,对吧?注册中心你尽量保证要高可右,Okie是CP,那么这儿我们呢,简单的强调说明并复习一下,好,那么这个就是我们集群版的CP相关的解释。
11:07
接下来我们就要写一个家中的落R脚本,完成我们的自动续期功能业务说清楚,不再啰嗦,不再赘述,开杠D1,假如说我们现在通过前面所写的lock按落,只要一落天生的建锁成功,这把锁的自然过期时间是30秒钟,OK,好,那么假如说库存20秒钟可以完成,或者20秒以内吧,那么现在我们会怎么办呢?那么后台就需要啊,有一个定时任务扫描程序,我来扫,假如啊,这是30秒,那么我们进行到它的1/3或者1/2,比如说这个业务已经运行了十秒钟,这把锁还存在,就说明它还没有完成,那么倒倒计时到第20秒,也就是说用了十秒钟或者到。
12:07
用了15秒钟以后,加个钟给你续气,又给我续到30秒钟,OK,也即后面将会启动一个后台的扫描程序扫,如果说到第20秒钟,30秒已经用了十秒,用了1/3了,还没完成,马上续个钟,OK,业务说清楚,那接下来写写这个脚本,那么这个脚本要做的事是不是要来判断现在我们这个杨哥这个锁的这个T叫。YY redlo存不存在,存在且还要是对应的UUID和线程ID,如果有也就是它等于一对吧?那么呢,我们呢,给他续个命加个中,如果说他已经被delete被干掉了,那说明这个线程工作已经完成,那么我们什么都不用做,返回为零就OK了。好了,那么弟兄们,我们就来写一下我们的自动续期加个中的如R脚本,那么前面已经写过这么多了,大家呢,应该不陌生了,那杨哥呢,直接如果我们的ready点空对吧?那么现在我们的命令应该是什么呀?H exist好,那么接下来这个是不是就是我们的,比如说杨哥的red look,这个在不在,在的话又有ID,且我们的现场ID如果有的话。
13:46
什么意思啊,就是等于一的话,那么Z我们是不是应该自动续期了,那么在这块。由于我们写过很多了,那么杨哥呢,就一步到位了,这个呢就是K1,这个呢,是不是就是我们那个参数二个1OK好了,那么搁到这怎么办呢?如果确实这个还存在,就是过了一段时间需要调到,就过了一段时间需要调到了这个续命的线程,续命的这个后台任务将会自动的调用这段撸R脚本来给我进行续命,加个中OK,所以在这我们就return ready,调用一个ready叫调用它的一个命令,这个是谁exp那么去期谁呀?这个时候是不是还是我们的K1和我们的第二个参数二个二,明白了吧,那么也就是说我们要给哪个K重新续命?
14:53
多少?好,那接下来我们的else,这个elses return,零,最终弟兄们摁没问题吧,能看懂吧,相当于说这个这个第二个参数是不是我们这儿所说的一句话,开启扫描十秒钟以后,如果还没完成,马上给你加个钟,还是又加到30,那相当于说是什么?过了十秒钟以后,从20又加到30,大概是这么个意思,好,我们测试一下我们自己写的自动续期加个中的脚本,在测试数据下面是否能够成功运行,并通过我们的测试案例来我们新建一把杨哥的readyish锁,这个是UUID,这个是线程编号,这个呢,随便写了个可重入次数啊,三次了,默认新建它是永不过期,现在我设为30 30完了以后我们呢,TTL,马上它可能这就是27秒。
15:53
对吧,我们等一下,然后完了以后呢,我们呢,执行一下我们的撸R脚本,就刚才我们在这儿所编写的,好,那么在这呢,我给它调成一列,好那么搁到这,待会拷贝就行了,然后我们使用我们的这个续期的这个录R脚本,最终来看看我们的时间有没有加成功,好那么同学们尝试一下,第一步我们先为了保证程序,那么red lock删掉,现在呢,说明什么,根本就没有干干净净的啊,第一波是这个expir,那么我们的red lock,假如说这次我给的时间多一点啊,那么就是到40秒,好,那么t TL red lock,弟兄们,36没问题吧,好了,那搁到这,这是我们刚刚写的脚本,全部拷贝回到这儿。
16:53
E来粘贴脚本几个参数啊,一个哪一个是这么一个好,然后又给他这么一个,OK,然后呢,多少秒啊,假设还是到40,大家请看现在是不一,那么我们再执行啊这个TTL大家看现在是不是到36秒,33秒,32秒,30秒好,现在30秒的话,我们执行一下,我们这个再来看提前大家看是不是从30秒到了十秒钟以后,假设我们的扫描程序认为十秒钟扫一次,他还没有结束,马上再给他续期,那么来同学们现在到30了,29 28。
17:37
一续命,这个时候同学们看一眼是不是,你看是不是又从28跳回我们的40了,哎,这个就是我们录R脚本说明什么写的成功,那最终我们是不是要给我们的第8.0版的优化程序跟我们的微服务Java程序整合呀?路R脚本加装程序搞定并测试通过,接下来8.0版进一步完善我们自动续期的功能,要让我们的路R脚本跟我们的微服务整合好,思路清晰,但是这有个功能点,那这个后台程序,这个后台的扫描程序,你准备如何处理呢?你怎么知道它到什么时候应该调用加个中的路R脚本呢?来,同学们带着我们的问题开工继续,那这一段弟兄们注掉。
18:28
相当于是我们的什么7.0版啊,测试可重入性,注掉了以后把我们的代码这段拷贝作为我们8.0版本程序相关的说明,好在这个也就不需要了,那么搁到这儿就是v8.0实现自动续期功能的完善,后台自定义扫描程序,如果规定时间内没有完成业务逻辑会调用家中自动续期的脚本,好那么8.0版主要是完成这么个事儿,那么8.0版的程序洛克安洛克。
19:29
在这儿也就没有什么其他内容了,但是在这儿我们故意的啊,来吧,哎,就秒吧,这呢我就写个一百二暂停120秒钟,故意的主要是演示自动续期的功能,OK好了,那么同学们这是什么意思呢?第一个我们现在呢,通过刚才所分析的是不是30秒钟是它的自然过期时间,我们现在希望呢,后面有一个扫描的定时任务。
20:12
当比如说30除以我们的多少,嗯,1/3吧,除以一,那个1/3到第20秒,就是过去十秒以后,我们马上给你自动续期,又回到30秒好了,那接下来我们在这儿呢,就要实现我们业务逻辑的补充来加锁成功以后啊,相当于这加锁成功以后又会出现了一条分支绕。听懂吗?这个分支就是值加锁成功后,后台有新建扫描程序,它呢来看看是否到过期时间,然后自动续期,有这么一条东西需要同学们来注意,这个也就是我们在这儿,如果我这走到这儿啊,加锁成功了,Return错在这块要新建一个后台扫描程序来监测对应K目前的TTL。
21:37
是否到我们规定的,比如说1/3,或者我们的二分之一来实现续期,明白吧,所以在这呢,你可以新建一个方法,只要我加锁成功了,我立刻落成功,马上红色的,这将会有一个后台的扫描程序,我们这为了讲课方便,我就不再引入我们的叉叉l job啊,什么定时任务那些东懂我们自己写一个好了,那么这儿呢,我们呢,比如说reset expir OK,就干这么一个方法,只要你加速成功了,我马上也就调用这么一个方法,你用reset也行,或者是什么renew,对吧,也OK,好了,没有这个方法,没关系,那接下来我们在这儿就新建这么一个方法。
22:38
好,在这干脆给它拿到最后吧,这是按落对吧?放在这好了,只要你look成功了,就要进行重新更新,后台扫描你的过期时间。那么该怎么做呢?按老规矩。我们呢,String,如R脚本对吧,弟兄们,这个呢,也就是我们在这儿的刚才在write里面测试成功通过的这一大段好了,那么过来,如果这then对吧,Else,然后呢,Return这个零,最后end l子的过来,这同学们,这个我相信大家没有任何问题,就是我们经典的路R脚本好了,那么在这块呢,我们应该怎么做呢?我加锁成功以后,我后台就要自动起一个扫描的定时任务,那么在这儿我们在讲解GUUC的时候,我们是不是说过一东西叫new time,俗称Java的定时器,然后它这儿有个schedule。
23:59
就调度方法有个time task long delay,意思就是说你多久来执行一次,好选到这以后它这个里面来,大家请看李明呢,好了,那么我们这儿我们的自然过期时间,兄弟们是多少呀,30秒钟好搁到这我们呢,这么玩this.exp它的过期时间,那么我们这儿呢,是秒,听懂了吧,那么它底层呢,毫秒,这个时候除以三,30除以三,那么这个时候是不是到十秒,意思就是说底内相当于说每十秒钟我就要检查来判定我是否需要17,好了,那么这个时候我们来你看检查出看它在不在,如果等于一了,我就来执行这段,如果等于零,说明没有了,我返回零,那不用续期,说明人家已经完成。
25:00
把这个key z YY lock,杨哥的那把分布式锁已经删掉了,好,所以搁到这呢,我们呢,直接过来还是前面这大断了啊,那么弟兄们,我们呢,一直行不写了啊,这个已经写过很多遍了,也很简单,他这呢,要么是成功,要么是,所以我们这不用long形两个值,就用布尔行得了,好了,那接下来是不是也还是这些什么,我们的lock nameme you your I value,我们来看一眼啊,然后呢,student.value of过去时间,好,那么同学们那是不是执行一下呀,可是问题是我需要源源不断的执行啊,对吧,假如说一直没有成功,还是没有删除,那么我还要进行第二次,第三次,第四次的续期,所以。我们这儿就要做一下小小的修改和变更,如果他这儿续命成功了,对不起,拉回来还要继续调用我们这个方法,同学们能不能理解这是为什么?听懂了吧,就是说你第一次续期。
26:15
他到第20秒,过了十秒了,对吧,然后呢,续到30,又过了十秒以后还没结束,再续30,所以说呢,永远保证你的业务时间是够的,反正我会不停的给你续期,也就是说只要你还有我需要这样反复的倒了以后调回来,反复的倒了以后调回来,这么说能跟上好了,那么在这块完成以后,基本上相关的写完,我们呢,来看一眼修改为8.0版的程序,我们要把以前的删掉,现在呢,Delete。好了也没有了,完了以后呢,我们的ready distribute lock,那么就是刚才我们写的renew或者reset那个过期时间,那么弟兄们我们在这呢,要放在这要执行对吧,在return之前,然后呢,这个呢,就是我们调度程序也给大家写完了,接下来同学们请看,去掉这个test,那没问题,我们已经去掉了,最终故意放一段测试时间,好,那么同学们那么万事俱备,我们来试一下我们的自动续期是否OK,下面我启动一下我们的微服务,我先暂停一下录屏,同学们程序启动,那接下来啊,回到我们这,大家请看我这是不是故意要暂停120秒钟,我们这个是多长时间,自然过期是不是30秒钟,那么按照我们的程序来算算的话,那么是不是30除以三就是十秒钟,意思就是每十秒钟就要去检查一次,如果没有完成,继续给它加个十秒钟,那么20加十是不是又到30秒钟?听懂了吧,好。
27:52
那么所以说呢,我们在这儿就要明白,我一执行的时候,听好在这块是不是就会转圈圈啊,因为一直在卡着嘛,那么我们主要是为了测试什么,它的自动续期的功能是否OK,好,那么执行大家请看是不是转圈圈了,那么来看看我们的这个TTL现在有秒,26秒,25秒,好,24 22,二十一二十再执行大家看是不是到20以后,30秒的1/3是不是已经要过去十秒,30秒过去十秒,就是到20秒的时候马上给你加个钟自动续期,同学请看又到20角20秒是吧?来来,24 23 22,二十一二十二,大家看是不是又到29秒,又给你续期了十秒钟,哎,所以说这种思想就是我们red分布式锁的第八个版本自动续期,可以这么讲,为什么说前后两章?
28:52
是承上启下的,因为后面我们会用一个red,它的底层和算法也跟我们这儿是一样的,我们手写都能够整明白了,后面去读人家的原代码,你会觉得很自然,像大自然一样自然,OK,好,那么同学们通过我们这么几天的学习,我相信自言手写一个靠谱的red分布式所,那么同学们应该能够掌握好。接下来给大家做一下red分布式所的小总结,自动续期就给大家介绍到这。
我来说两句