00:00
好,同学们,通过前面的讲解,我们算式又简单的复习了一下,我们加锁哈,在单机版的程序这个层面加锁,加SYNCH还是加re lock try lock,这个你是一定要小心,并且根据你的业务说清楚,再次强调不见不散,过时不候,你是一直要死等,还是说柔和一点,给个三五秒钟,一两秒钟。等得到我用,等不到我撤,好这个有个准心,那么接下来我们加锁了以后。杨哥在这儿呢?把这个锁讲完了,我们这图简单,我呢直接来一个s this OK,就当前对象呢,谁进来谁加锁好吧,那么接下来呢,我们呢,继续。完成了以后,我们修改为2.0版,那么从1.0,刚才是1.0好吧,那么现在是不是就是我们的S了。好的,那完成了以后同学们单机版能不能。正确呢,现在把我们的服务。
01:00
全部启动OK吧,然后我把库存呢,干脆呢,也就重新更新成100,没问题吧,比方说GOODS001这个商品现在也是100,我们现在部署或者是启动的程序是加了这么一个SYNCH,这个SNCH,完了以后我点一下是不是假设啊,现在我是加了这个S,加了单机版锁的,那么来来看看验证是否正确,那么1111。各位亲,第100件商品卖出去,剩下99件。2222再回车,第99件商品卖出去,剩下98件来自于二号服务器,那得到我们的结论就是说至少现在。加了锁以后没有产生任何的变化,程序更加的健壮,OK的好。稳扎稳打,那么现在加完锁以后,就是我们的2.0版的程序,在这个基础上,同学们再看看我们现在目前。来找第二个bug。你们认为目前我这个程序单机版肯定没问题了啊,加了S单机版。
02:05
下面的问题是。如果我们的架构变化了,要上分布式和微服务。这样的情况下,你们认为?高并发会不会有问题?思考一下同学们,我们继续。现在呢,我们先看看我们的架构变化。我们都知道啊,我们一般前面的现在分布式为负,都是N的前面挡这个。作为一个大型的类似于网关也好,或者说是限流的措施也罢,总之一句话,不可能裸奔。我们现在是不是直接微服务的架构,直接去找我们的服务器,找111222,实际而言不可能,我们的请求过来是不是一定是先找我们的N,这个请思考并回忆一下他原来我们在这个讲解的时候画的一个最简单的一个架构图哈。那么同学们,我们现在是不是?
03:00
原来说过有一台所有分布式微服务架构是不是应该是N多个线程,不能直接找111222,前面要打这个N啊,由N啊默认的一些请求转发的规则是轮询或者权重也罢,那么把我们的微服务啊打到一号机二号机,一号机二号机没问题吧,这是最经典的一个。小型的一个小戴帽,那接下来的问题就是我们来看一下啊。如果说分布式不属于号。GVM层面的单机线索还会出现超卖现象,我们是解决不了这种架构的,为什么?请听我分析。第一种啊。我们现在呢,这个文字类的表述就是这张图都清楚,请求过来了,找到engine。111222333,只不过我这儿呢,为了讲课方便,我把333呢就没有部署了,一跟二一啊,默认N最经典的全轮是不是。
04:02
权重是1:1,就是你一次我一次,你一次我一次,单数的落到一号机,双数的落到二号机,那么这样的一种情况是不是就能够让我们的机器获得一种负载均衡啊,那么通过N的反向代理和权重相关的配置啊,完成了我们的负载均衡,那接下来这个问题就是我们加的这个SYNCH是属于GVM层面的。一把锁是加在这儿,另外一把锁是加在这儿,是两把不同的锁,它只在自己的地盘上有效,我们无法保证你在高并发的请求下面。A锁不能管B的领域,B锁管不到A的领域,所以说我们在这种情况下是单机锁基于这样的分布式架构部署以后,它不好使,那么接下来我们来演示一下单机锁会出现超卖的现象,OK。好,首先。节约时间,那么杨哥呢,早在之前给大家讲课的时候讲过N高级的时候就什么都配清楚了,好吧,那么我们要干的一件事情呢?重复啰嗦的来一下,启动in并测试通过那么这些命令A4RELOAD配置文件不再废话,OK,直接启动,那么现在呢,我节约时间。
05:15
搁到这儿,我们杠EF竖线grape。Engines啊,我们是不是后台已经启动了一台enginex啊,那至于说什么X的启动命令啊,什么点。N,这些我就不再废话了啊,我认为你是应该懂了啊,都听过我的那么多课了,那接下来我们要干一件什么事呢?为了完成我们这个架构,就是前面胆N。第一要用反向代理选出一号机还是二号机,第二个默认采用最简单的轮询,也就是它们的权重是1:1,一次是一,一次是二,一次是一,一次是二,OK,那么这样的一种配置啊,那么同学们我们来简单的看一下啊,那么。或者是退出去吧,点点。看这这个配置文件夹下面我们这儿是不是有个叫NX的,看我们先把NX的配置啊给大家简单的再回顾一下,那搁到这儿了以后同学们都明白,所谓NS就是最经典的运用反向代理加负载均衡,那么何为反向代理?我们在location这配了这么一根目录,意思就是全部拦截。
06:19
那么反向代理是proxy,你代理什么?我代理一个东西叫。Http my engines,那这个是个啥东?这个engines就是上面这个my engines,也就是我们所说的权重,OK,一个是反向代理,一个是负载均衡,在这儿配权重,那么我们现在Linux这台机器。OK,我们再给大家看一下啊。我的IP是多少?147没问题吧,那么待会儿的意思就是说。我们N啊挡在前面,我的IP是147,那么我的这个。
07:01
111222是idea里面的,我Windows机器上面的两个微服务,那么换句话说就是我先去访问LINUX147这台机器上的,然后按照1:1的权重一样一半,一次访问找一,一次访问找二,一次访问找一,一次访问找二,相当于通过N访问一二一二两个不同的微服务,OK,那么这个时候我们达成这样的部署以后来看看会有什么样的情况,那么配置了以后,我们启动两个微服务,1111222,想达到的效果就是出现。我们现在呢,比如说我这台机器叫147NX啊,我们后面可没有跟端口号N默认没有端口号,是不是就八零,相当于它反向代理选出1212 OK,看到效果一边一个默认就是轮询走起,那么完成这个部署以后。我们NX已经配置好了。关闭,然后呢也启动了我们的N,刚才呢,大家也已经看到了我们的N后台启动,那接下来我们来进行我们的验证和测试啊,现在首先1111安G的话OK吧,那么2222OK吧,现在就是直接请求发到两个微服上面,这个是属于什么,你自己测试这么玩是可以的,生产上访问不可能直接就捅到后面微服务一定是要去访问我们的N192.1.8.111.147,那么大家请看一回车。
08:30
这个时候请看147是不是我们NX啊。找到一个N,你去给我访问这个链接地址,买一个商品,大家请看现在是不是96号商品出去了,95号。以后的还剩到库存里面,当前库存数就是95,谁提供的二号机再来一下,请看95号出去了。还剩94个。谁提供的一号题,请看一二一二一二点快一点,那么同学们look好像貌似啊,也没有发生什么太大的问题嘛,那么请看99号24680,好像这个二一号机全是偶数。
09:14
那么一号机是不是13579全是激素,那么看它N怎么轮巡达到,那无所谓,那么从这我们可以得到,是不是完成了我们的一个最经典的。N的一个架构分配好吧,那么到这儿也好,貌似到这儿都是岁月静好,没有什么太大的问题吧,而且我们就是什么。点快一点,好像也没出什么故障,那么请同学们回到我们这儿,我们这儿可是加了单机锁了,貌似好像一切顺利。非常抱歉,不OK,为什么我这狂点?这种根本就不叫高并发,我的手速毕竟有限,那接下来呢,兄弟们,我们是不是接米来压测一下,让大家看看爽一下。假设我一瞬间。
10:04
100个线程或者200个线程砸过来,那么这种情况下,我们的。单机环境下面的分布式锁还有没有效果,再或者说是在分布式环境下面我们加了这个单机锁还有没有效果?那么来同学们。现在我们呢,直接过来添加一个啊,至于说是这个解密什么的,这个做压测。不废话啊,我默认你懂了,那么这比方说我们就现成就是100个商品好吧,线程数就100个,那么这。但它一次多少秒钟,一秒钟时间范围以内。那么给我打出去100个线程,那么如果这样写零呢,那么就是一窝蜂的那一瞬间,100个听懂,这个是不一样的啊,一秒钟可能比方说一秒钟是不是有0.1 0.2 0.3 0.4啊,可能0.1秒的时候。只有五个线程,0.2秒的时候干出去了72个,0.3秒的时候又是剩下是一个等等,总之一句话,你在一秒钟以内给我把这100个消耗完,明白好,这是第一步,整个线程组,那么第二个我们是不是要加个HTP请求,那么这个HTP请求你要访问哪个地址,就是我们现在这个。
11:17
来,那么端口号是多少,八零路径就是这个,那么这个。IP就是我们的147这一波没什么问题吧,好。完成这个以后,就是我们最简单的解密的压测,那么做一个简单的保存啊,假设呢,就是100个商品,我们就HP请求100。接下来同学们,我们呢,把我们的库存恢复。现在这个库存。就是一号商品就是100个,我一压一秒钟100个线程打过来,那么这儿我们先看一下笔记,先说清楚我们最后要得到的结论啊,因为在这个解谜的时候,不排除第一次啊,可能没有找到这个超卖的这个现象,那么什么叫超卖的现象呢?首先我们在手动的啊,启动两个服务,这个是OK的了,那么现在我们用解密塔模拟高并发,那么解密塔压特的情况下呢?
12:13
有可能第一次啊,我们没有看到这个效果,可能我做到第二次,第三次才会成功,当然也希望杨哥的运气好,一次就成,我们先看到的最后效果是什么意思啊?一号机二号机,此时商品还剩余99,此时商品还剩99,爽死你了,类似于什么买一赠一,99号商品是不是卖了两次啊?那么这种情况下,在电商的系统里面,或者是各种外卖的系系统里面,比方说啊饿了么的点餐系统,它有那种购物券一券多发,这个是会在互联网企业里面是严重的故障,叫资损,你的公司的资产受损了,资损故障了以后,那么你今年的晋升可能就倒霉了,那么所以说同学们,我们先把结论让大家看看到,再次强调有可能哈。第一次没找到重复的,那么我们就再压一次好,那么后台刷的干干净净,我们呢,洗干净脖子等着压测。那么现在同学们。
13:06
保存以后,我们现在呢,也已经是100激动人心的时刻到了,看看我们能不能一次就压测成功,好,同学们一下子答过去了100,那么看后台啊,同学们请看。二号机是不是123456789,那么来同学们一眼,这个时候是不是。91 92 93 94 99出现了什么情况?不说别的,这个91是不是在一号机被卖过一次,在二号机也被卖过一次,这种情况下,OK,杨哥运气好,模拟出来了效果。严重的超卖出现了吧,99号机。99号商品也被卖了两次啊,那么所以说同学们,我们得到这个结论,如果基于这样的是吧,分布式微服务架构。一台N啊,121212这样的打的话,你加单机锁,不管你是SNCH还是re lock等等,是控制不住我们这些问题的清楚啊,所以说同学们,我们现在2.0版的程序不OK,我们会出现一个严重的情况,那么就是氨基锁没有办法解决分布式部署的问题。
14:19
所以我们引出来了需要加分布式所,那么我们加分布式所是不是就是我们前面所说的?Set命令或者set NX,那么再来看一下我们的官网上的说明。Red性能极高,且对这个命令对分布式所支持也比较友好,借助set我们可以实现加锁的处理,那么它的从我们的问题再到理论,再到我们上线的代码,我要这样带着大家一步一步的跟你说清楚,你不要是给面试官说,哎,我们分布式所用red洛安LOCK1加就解决了。马上会问你,那么原理呢,你们为什么要要用这个东东,如果加锁过程当中会出现两个问题,为什么加SYNCH不可以,你要说的清楚,所以说同学们大家请看现在我们。
15:10
在2.0版的程序就是加了SYNCH以后,对吧,单击锁不OK,所以我们需要看看官网的说明。那么在这。都清楚,这个呢,以前大家大家讲red也说过提前剧透过对吧?Set命令它有ex p X keep t tln X X,那么所有的命令参数均来自于这儿的说明,这是为什么就不再说了,那么这个是加分布式锁,那么提前聚套我们也晓得加锁就需要解锁,那么解锁的话,人家官网上也说了,是不是要用这个撸啊脚本呐,对吧?好。那么。不要觉得。简单,因为现在的面试题很难,他会问你。不许用露R脚本来解锁,你会有什么办法?好,先提前剧透OK吧,那么待会儿我们再说。那么接下来同学们,我们已经得到了我们的结论。
16:02
高并发,下面吉米塔一压,那么出现了超慢现象,那么同学们,我们应该怎么改我们的这个程序呢?好,那么可以得到我们这儿的一个结论,加in和单基锁是不OK的,走起,那么我们这儿呢,就把它拿掉喽,因为分布式的环境也不可能去写这个单基锁,我就不再废话。那么来吧。我们上面是不是引入了我们的STEM,那么现在就要把我们的2.0版的程序改成我们的3.0版,加分布时速,好根据上面官网呢,我们也带大家看了,可以用set命令对吧,那么我们呢有两种。第一种啊,你自己在这儿。写set命令。对吧,那么大家请看这些的话,有set命令的各种重载,那么我们这儿呢,选set if absent。
17:00
Absent的意思是缺席的意思,听懂逃课缺席的意思啊,它的意思就相当于NX这个命令什么概念,就这。OKNX是什么意思啊?If doesn't already exit就不存在才见,那么加这个锁的意思嘛,你肯定嘛,对吧,你加锁要没有锁才在里面写进去,这把锁如果有了不OK,所以说我们在这儿干一件事呢,加一个锁,那么这这个锁的话呢,我们在上面呢,定义一个常量,那string。Rea。洛克。假设。这把锁的名字就叫艾硅谷洛克,兄弟们,没问题吧?那么这个就是我们的T,那么这个value呢?那么这个value我们现在要选一个,现在就是有点类似于这个相当于。银行的受理窗口每次只能对外提供一个服务,这个相当于一个卫生间,相当于那个门刷,每次只能有一个人进去,门刷还是同一把门刷,这个好说,但是进去的这个人肯定是不同的人,所以说我们在这儿。
18:11
Value就等于UU id.random.to string,再加上我们自己现成的名字啊,这样这个value是不是有一个类似唯一的固定标识啊,OKUD是一个流水序列号,不会重复,MYTH就是当前的进卫生间或者去银行受理窗口,反正就是要独占的这个线程的名字啊,一拼加不会重复啊。那么现在就比方说这个value是个张三,张三就用red lock这么一个。所加进去代表张三已经入局了,OK,那么来同学们完成以后,他呢,好处呢,就是有一个不二直,哎。这一波同学们,那么这就是一个flag,没问题吧?再次强调,这行命令相当于我们的。
19:03
Set NX命令好吧,那完活以后我们怎么来进行判断呢?假设第一个线程进来。我来减库存,肯定上面没有见过一个叫at特硅谷洛的这么一个锁,所以说我建的时候。如果我flag点。If建成功了,加锁成高,我是不是就往下走这些业务逻辑,那反过来,如果我取反,那么说明什么?如果我这错。取反不好意思啊,First什么意思啊,不进来这段说明加锁成功往下走,如果我加锁失败,说明现在里面已经有人加过。这把锁了,那么我这是。False false取反是。进到这什么意思啊,是不是就返回一句话最经典的。OK,那么就是。前所失败,那么请再次尝试,那么这个我就不写了,OK,那么同学们完成到这儿了以后,我们是不是完成了我们的加锁乘高,那么自然而然有洛克就有安洛克,那么必而然会有一个东西是不是叫解锁,那么这儿解锁的话,我们是不是。
20:15
还是用我们的template。第二。我们的delete塔你要杀哪个?那么我们这个门刷是不是就是这个readylo这个常量?用的时候请去加锁。加锁成功,你用完了以后请你解锁,那么完成了我们现在到这什么3.0版程序的修改,从二修改到三,解决了register上分布式所,那么我们在这儿一样的set if absent,然后删除,就是这么一个业务逻辑,OK,那么目前我们的程序到3.0版上了red分布式锁,那么继续,同学们请。思考到这儿,大家认为还会有什么问题?
我来说两句