00:00
我们再来给大家测试一个叫simple分布式的信号量,这个信号量呢,我们来给大家举一个例子来模拟一个场景,比如我们这个车库停车,我们这个车库停车呢,我们假设有三个车位,三个车位,那只要来一辆车,占用一个车位,走了一个释放一个车位,那我们想要停车就要看车位够不够,那我们在这种场景我们就可以来使用咱们这个信号量,那们来写两个请求,也给大家模拟一下,比如string,第一个呢叫park,这个呢是我们这个停车的这个请求,比如我们来发送一个请求get map来只要我们来发送请求park,我们想要停车,然后呢,来搞一个response body,我们来写一个叫return OK,只要我们车停成功了,来返回,OK,那我们现在来怎么做,我们想停车要一个车位,那么就可以使用分布式信号量来控制,那我们还是一样使用reddi,点一个有一个。
01:00
啊,Get simple法在这里边呢,我们可以来写一个name name呢相当于我们分布式信号量的名字,只要是同一个名字,那么都是同使用同一个信号量,我们可以来给它进行增减,我们来看好拿到我们这个信号量,然后呢,接下来以前呢都是加锁解锁,现在呢变成了叫acqui aqui呢,就是我们要一个获取一个信号,获取一个咱们这个信号,大家就认为获取一个值吧,获取一个值,那只要获取成功了,好,而且这个东西呢,也是一个阻塞方法,我们一定要能获取成功,获取成功了们就返回,OK,获取失败了我们就不OK,获取失败了呢,我们就会一直在这儿等,直到我们获取成功。所以呢,这是一个停车方法,然后呢,那车停了,那车就要开走,我们再来写一个方法,叫要够好,车开走的方法。那呃块儿就是相当于拿一个车位,那车要开走呢,相当于我们要释放一个车位,只要获取一个信号,我们就是获取一个值,也就在我们这个场景,就是拿一个占一个车位,占一个这个车位,而我们接下来我们要走的话,我们就得释放一个车位,那怎么释放呢?我们调用它的方法有一个叫release,好那么这个呢,就是释放一个信号,相当于我们释放一个车位,好,那为了测试期间呢,我就直接将这个信号量我们给red里边,比如我们来放一份好,我们叫park,比如我们车位有三个,我们就来输一个三好,我们现在呢有三个车位,我们现在有三个车位,占一个呢,它就会减一个车位,释放一个它就会加一个车位,那么现在想要停车,而且这个方法呢,都是阻塞方法,我们想要获取一个车位,必须等待有空余车位,好,我们来给把这个启动起来,我们来测试一下我们这个整个停车的这个过程。
02:55
好,那在这儿呢,还是使用这个1万端口,如果我使用park,那这个呢就是停车,如果呢,我使用go,那就是开走一辆车,好,我们现在来开始来监控,我们现在red里边,好,我们来刷新一下,Reddi里边呢,Park有三个车位。
03:16
我们呢,每想要停一个车,我们就会在这儿获取一个车位,我们是拿到我们把这个park呢当做一个信号量块,就是拿一个车位来看一下现象,好我来帕回车,我发现返回OK,同时我们来看red,它就已经减为二,然后呢,我再来停一个车,那我们这个red呢减为一,那我再停一个车,好,我们停三辆车了,Red减为零,那我再想要停车,我刷新。诶,我发现呢,就在这儿一直等啊,等什么时候能停车呢,肯定就是我们这一块又加上了,所以比如我们现在有一个车开走,你调用够方法,够方法呢,相当于给里边加一个我们推车,诶我们发现我们这一调用够这个帕呢,就执行了,相当于我们只要释放一个车位,我们就能停了,那么不断的让车开走,我们就能释放更多的车位,因为刚才释放的车位已经停车了,所以现在还是零,那我们再来开走一辆车走,那又释放了一个车位,我们来看一下,诶就有一个,那么再开走一辆车走,那么又释放了一个车位,这就是我们分布式信号量,包括我们后来系统呢,我们可以使用它,在未来还可以做一个分布式的限流操作,什么叫限流,那就是我们限制流量,比如我们当前服务顶多能承受每秒1万的并发请求。
04:37
那如果所有请求都来我这个服务来执行,把我这个服务就可能会压爆,所以呢,我们可以这么来做,只要所有服务一上来,他先去获取一个信号量,比如我们这个信号量总量就是1万,他能获取到我们这个信号量,那说明呢,我们就有空余的线程能给他处理。它要获取不了,那就得等别人处理完了,给他释放了,我们就来处理,所以我们就可以来做限流工作,而且如果做限流,我们还可以调用这个方法,我们使用try AC块re,包括以前呢都有各种的look,也有try look,我们这个try acquire这些有什么区别来可以考虑一下,那么这个AC块它是阻塞式获取,就我一定要获取到一个车位,但是呢,我们可以使用TRY块,诶我试着看一下有没有车位,这个就叫TRY块,我看一下有了我就停没了就算了,那TRY块呢,最终会返回一个出货false,我们把这个出货false来给大家打印一下,来加上这个B,好,我们来把这个呢重新启动起来,们来看这个穿二块二方法,它用不用在这来阻塞式等待,那一般呢,我们车位只要一到零想要停车,我们以前A块式阻塞式等待,那么现在来看我们现在的效果,我们将这个控制台呢,先来清空来运行我们的这。
05:56
的方法。我们现在想要停车来看我们这个信号量,现在呢,有两个车位,好,我来刷新,好我们先停了一个车,这是处的,我再来刷新,又停了一个是处的,我们现在停了两辆车,现在没有车位了,如果我们以前是使用A块,我们来停车,那么就在这儿等,一直要等释放车位,那么现在是穿二块,我们来看刷新,诶我们立马返回一个force,那就是,哎,我就瞅一眼,能停了停,停不了就溜了,所以我们这个穿二块呢,那就是给我们来判断,就尝试获取一下,不行就算了,特别是对于我们限流的时候,大量流量一过来,如果我们使用这种来ABB呢,那就是我们获取到信号量成功了,再来执行我们复杂的业务,如果for,如果获取信号量不成功,那我们就直接可以给他返回,比如我们来直接返回,返回什么呢?我们就告诉他,诶当前流量过大,请稍等,我们就可以来给他return,诶什么什么一个错误的提示。
06:58
是这么说,我们这个信号量也可以用来做限流,我说的这个信号量。
07:06
也可以用作咱们这个分布式限流来,我们限制每一个应用的流量,这是我们说的信号量的演示。
我来说两句