00:00
好,同学们,我们继续,目前我们的程序已经修改为3.0版。当前的代码样式就是加了一个。Ready的分布式锁,用set if absent,如果没有我们建,然后完了以后需要的时候加锁,用完了以后delete,删除这把锁,示范完成我们的相关的业务逻辑好,那接下来在3.0版的基础上请同学们思考。我们当前目前这个程序啊。还需要有哪些?进一步完善的地方还有哪些潜在的隐患和bug,请同学们思考。第一个问题。一个锁有加锁,就必须要有解锁lock,安洛,那现在我们的一个问题就是我这的是业务逻辑简单啊,有可能我的程序走到这儿。会出现一种情况,就是报异常了,一报异常以后,第60行这个解锁他根本就没有走到,那么这样是不是我们根本就没有执行。
01:07
解锁这个命令同意吗?那么所以说我们在这儿在3.0版程序的基础上,一定要有一种意识啊。保证最后程序如果在程序顺利的前提下,一定要把锁给我删了,给我示范,说白了是不是需要有一个final的代码块来强制完成删锁这个动作。所以说。我们在3.0版程序的基础上,我们又出现一个问题,如果出异常的话,可能无法释放锁,必须要在代码层面加一个final来控制啊,OK。走起,那么所以说呢,我们在这儿啊,需要对它来进行一定的封装。Try finally保证我们的程序不管是正常执行还是异常执行都可以完成。我们的finally删除并示范所。
02:06
最经典的是不是资源的申请要有资源的示范啊,OK,那么所以说我们现在就完成了,我们的枷锁必然要伴随着解锁lock,按lock必须保持出现并保证调用,所以呢,我们在程序能够正常执行的前提下。我们能够finally强制删除这把锁,这就是我们的从3.0改到4.0版的程序,这一波同学们OK吧,好,这说一下啊,可能针对于你所看到的代码,比如说你的思路啊,可能跟杨哥的顺序不一致啊,这是正常的,我呢只是按照我个人的理解和思路一步一步的推出,为什么我们要上这样的分布式所可能啊,比如说你肯定也看到了其他的问题,我讲到这一步我没有说。那么在后面我们会总结这样,你的前你发现问题的前后顺序跟我不一致啊,这个是正常的啊,这个倒无所谓,只要找出来就行了,好比吃一碗面条,你先加酱油再加味精,还是先加味精再加酱油都一样啊,只要你加了料全了,是没味的就OK,好那么同学们。
03:16
接下来我们就完成了我们的从3.0版修改为我们的4.0版,也就是说要保证假设啊,现在我这个程序在这出了个异常,那么finally点你要给我有加锁,就一定要示范所好,那么同学们,现在我们当前的程序已经是4.0版了,求同学们继续观察来看看,求关注求观察来看看现在我们还有什么样的隐患和bug,我先暂停一下录屏们,刚才我们说了啊。这个程序顺利的执行啊。正常情况收工。会执行finally异常情况。不好意思啊,没有走完,但是他也会执行final动力,这是代表什么你?
04:04
机器。OK的情况下,那么我们要考虑一种极端,比如说现在机器宕机了,你这个red被每人被后台的一个进程被人Q掉了,或者是什么机房失火,一句话怎么着?我们宕机了,在我们4.0版的这个程序上,这个宕机了。我们将会碰上一个严重的问题,那就说明什么?假设我这个程序干走到这儿呢,一下子后台程序被人给Q掉了,Q杠九给杀掉了,或者宕机了,程序是残疾的,他根本就走不到final,你就算加了final是不是他也删不掉啊,程序就根本没走到这儿,所以说我们现在出现的问题就是。部署了微服的架包,这个机器挂了,比如说我现在杨哥的3OS这个Linux上面的这个服务器已经挂了。代码层面根本就没有走到三流的这块,没办法保证解锁这个key没有被删除,那么就麻烦了。
05:06
我现在干的这个事儿,我一步一步的啊,完善我们的程序,一开始可能会让你觉得啊,写什么呀,这有bug呀,是不是写错了,不是这样的啊,我一步一步的走,现在就是有bug,我要跟你一个个挑出来,把这些bug挑出来,我们怎么一步步走到最后的。算是比较靠谱,比较完美的程序,我们现在强调是这个过程,不是强调这个结果,那下面我们的问题就是机器宕机了,代码层面走不到这儿,完了加的这个T永远无法删除。那red里面永远有这把锁,那么就算你恢复以后,以后我们的是不是也没有办法能够获得这把锁了?所以说呢,我们这儿要有万全之策,需要加入一个过去时间来限定这个K,那么回忆一下兄弟们,我们在讲我们的ready play的时候,怎么来进行加锁,用哪个命令,请大家先思考,我先暂停。那么同学们。
06:02
思路清晰了以后,我们需要加入一个过期时间来保证啊,就算是你服微服务宕机了,但是我ready上面你微复宕机了,你没有执行delete,通过发服务发请求把上面的锁给删掉,你程序死就死吧。但是我还好活的好好的,你给我个过期时间,到期以后,比如说十秒钟以后。你没有主动删除,我也会给你自动删除,这样是不是完成一种自动解锁呀,所以说呢,我们这儿加一个我们的过期时间的处理,在这我们叫exp。过期时间给哪个闹?这个呢,那么假如说我们过去时间多少十秒钟,那么这一块。Timer。Unit单元就是十秒,也就是说我们现在如果这个程序啊刷执行,可能六秒钟就执行完了,你自己。
07:01
你没有宕机的前提下,手动就删除这把锁了,假设你的程序宕机了,不好意思啊,根本就没有走到final第一层保险突破,但是我们还有第二个保险,十秒钟过了以后,我们将会把你这把锁自动有red删除,一个是手动挡,一个是自动挡,是不是保证这个锁有申请就一定有释放啊,这样比较配对和完美好。那么接下来我们就出现这个问题,就是需要对加减锁有过期时间的设定修改为我们当前的5.0版。好,那么同学们请思考一下啊。我们目前。考虑到的情况越来越复杂。那么请大家看一下,所以说你要做一个互联网高并发高性能程序下的Java工程师,要求是蛮多的,那么下面请继续思考,继续找茬,你觉得我现在写的这个程序还有哪些不足和bug,还有哪些隐患?我先暂停,请思考,哎,同学们继续有没有发现一个?
我来说两句