00:00
嗨,同学们好,刚刚呢,我们给大家演示了这个呃,限流的基本的用法,那我们再回顾一下它这里边儿的一些细节,以便于我们后边的学习啊,那我们刚刚又跑了一下,我我之前的这个例子,就是我限速呢是一对吧,每每秒的这个能接受请求的这个单位是一。然后接下来呢,呃,我们呃把请求打过去之后,一旦并发量如果要比较多的话,它就会报出很多的错误,就是503直接把这个呃请求呢就给拒绝掉了,直接丢弃这个连接了,那么这种情况其实是一点这种桶的感觉都没有的,那既然他有这个呃漏桶算法,有桶的感觉,那相当这个这个我们我们理所当然的就会想象一下,它应该有一个桶,有一个容器的感觉,然后也是以这种桶的感觉呢,相当于把这些连接的全都放到里边,或者把这些请求全都放到里边。然后按照这个固定的速率,也就是呃,每秒一个KPS,然后往外去处理,然后超出桶的这个,呃。
01:01
这个容量,然后再去丢弃,那它现在是直接全部都丢弃了,这是为什么呢?这就是因为我们现在没有设置这个桶的概念,那么这个桶应该怎么去配置呢?啊,其实就是在这儿去配置啊,它在这叫这个,呃。呃,Burst这burst呢,其实也不叫土啊,就如果要是直接翻译过来的话呢,我们可以认为这个是表示处理突发请求的概念,但是如果要是按照这个漏桶算法的话,我们就可以把它啊套到这个桶的这种感觉上,那现在每秒请求一次对吧,然后这个。这个桶或者这个burst啊,我们把它配置成呃。五吧,啊,那我们也把它配置成五,那接下来呢,我们再发送一下请求,我们看看效果。然后重启一下服务器,然后把这些呢全部都给它清掉。然后注意看啊,我们这儿还有这个发送请求的这个配置,这有number of threes啊,这相当于是我们同时并发的请求的线程数,然后我们在这儿的限制是呃,Bary remote a DR,这是呃远程请求的这个地址,以它为限速的单位,也就是远程的这个客户端啊,它这个作为唯一的标识啊,来去限速。
02:21
那就是针对于一个客一个用户,然后去做这种限速啊,它并不是说我整个服务器啊,所有的这个请求呢,按照这一个速度来,也就是如果我去请求和你去请求他的这个。它的这个这个这个呃,相同的这个限速的速率都是一,而不是我在请求的时候呢,你你也需要去等待。那我们再去跑一下,我们现在把这个桶给它设置成了五对吧。我们看这看这个table这儿来走。那停掉。嗯。它整体的吞吐量呢,还是一对吧,但是还有好多这个报错,基本上全都是报错,那这个桶的概念也没有体现出来是吧,那这是为什么呢?这是因为我发起的这个请求数量啊有点多,现在的这个并发量,现在是并发量是十,然后无限的循环。
03:18
这个桶它能承载的这个,呃。它能承载的这个这个请求,相当于做一次这个缓冲啊,在这个缓冲的这个区域里,我们现在的这个请求已经远远超过了他设置这个五,所以直接把大于五的这些这个连接呢,直接给它丢弃掉了。那么怎么去做这种实验呢?我们看这个并发,我们如果把它也正好配置成五,那么并发五个用户,五个线程同时放到桶里边,那么这会儿就可以给它进行这个缓冲了啊,我们把这个线程也给它配置成五,然后我们再跑一下。服务器这边不用不用管来走。诶,大家看这会儿没有报错了,他把这个请求都已经进入到我们这个缓冲区了,然后所有的请求呢,都会按照固定我们已经配置好的速率,一个一个去处理。
04:10
那我给大家画张图,然后咱们再加深一下这个理解。来看这儿。这会儿是不是就已经有这个桶的概念了,对吧,你就说这是我的一个用户,然后发送请求到这个NG的服务器。这个N服务器,如果我们不配置这个,呃,这怎么读来着,Boost如果不配置这个boot,也就是它的这个突发处理的能力。啊,或者说我们想象成它就是一个桶。如果这呢,我是这个桶,我设置成是五。那这会儿有一个用户来了,那么把这个用户的请求呢,我就会给他给。放到这个桶里边,然后这个用户的第二次请求,就当前一个用户的第二次请求。
05:00
会根据他第一个用对第一次请求的这个,呃,结束,然后再去开始,也就是有队列的概念,他第一个请求打进来,然后第二个请求再打进来。第三个请求再打进来,注意这是针对于相同的一个用户,如果我们设置了这个呃,Boost,那么它就会相这个相同的用户进入队列请求的这种状态。那如果不设置的话,那么第一个请求呃,打过来,如果要是第二个请求也接过来,呃,由于我们这边有固定速率的限制,那么直接把这个第二个请求以及后边的请求全部都丢丢弃掉了,直到这个满足呃,这个这个速率之后再来的请求才会直接去处理。那么这是一个用户,那这一个用户呢,他的并发请求发送的速度其实是很快的,那么他会把前边的五个请求全部都放到这个桶里边,然后后边的请求呢。进入队列状态,他也不会放弃连接,所以才会出现我们刚刚做实验的这个效果,它会一个一个的去处理,对吧,而不是并发的去处理。
06:04
那么如果是多个用户呢,比如说我现在发送的这个请求的模拟出来的这个用户的数量在这就已经是五个了,那么他就会。因为是并发发起的请求,每一个这个用户呢,都会发送请求打过去。并发请求打过来之后也是这个道理,因为它启动速度够快,我们之前的这个五个这个线程启动速度够快,所以它瞬间把这个五个请求全都放到桶里了,那么这会儿桶他也就满了,那么再有这个用户,呃,这这这这几个线程再去发起请求的时候,就进入队列状态,直到把这个桶里的给消耗掉一个,然后再进去一个,消耗掉一个,再进去一个,这就是这个漏筒的概念。它会限制这个呃,固定流出的速度,这个流出速度一定是固定的,也就是我们的这个每秒一个一个QPS,这个速率是一定固定的,那么前边你至于怎么去做这个缓冲,或者不做缓冲。
07:07
这是,呃,这个我们可以去配置的,那么这种情况下,其实我们设置的比较极端的情况下,一个QPS,那么所以可以看出来,我们现在处理速度是极慢的,当用户请求量变得比较大的时候,很多的很多的请求都进入到队列状态,不是这个请求没打过去,而是我现在没给你处理,那你多等一会儿,一旦时间过长的话。这会儿呢,就大量的用户去超时了,所以这里边儿还有另外一个配置就是快速失败。那么这个快速失败就是在这后边呢,额外再加一个配置就是no delay。然后CTRLS保存这个no d类指的就是后边的后边的所有连接,只要不在桶里边了,我直接让它失败,呃,这就更像我们这个呃漏筒算法了,漏筒算法是啥呢?
08:00
就我这有一个桶,然后往这个桶里边呢,我去放东西。哎,啊,这这样,我往里去放东西,那桶里呢,我一共能抽五个。那现在放不进去了,那前面这个如果没有快速失败的话,那接下来还想往里放,那你等会儿啊,在这外边呢,有一个队列这种感觉,你多等一会儿,等这里边儿呢,消耗掉了一个,然后他再拿进来一个,消耗掉一个,再进来一个。那这个痛。它是有队列的概念的啊,或者说有队列的感觉。那真正的桶是啥样的?这里边装满了,那是不是这是你再往里倒它自然它就直接就从外边给它流出去了。那这这会儿就直接拒绝了他啊,这种情况这是更像是我们现实当中这种桶是吧,那么配好node delay之后,这表示就是我不要任何的延迟,所有的这个请求来了,我就给你处理啊,处理不了的呢,那我就直接给你丢弃掉,那我们看配很多d delay之后,你看这个系统当前我们这个系统这个效果是啥样的。
09:07
那我们再重启一下。嗯,接下来我们跑一下这个jater。清掉。还是看这个table走。来停看。这会儿就没有这个等待的感觉了吧,因为no迪delay了桶桶的大小呢,是五对吧,然后上来啪,直接五个请求扔到桶里,五个请求立马就给你,立马就给你处理了,这个no delay它不光是呃。这个超出这个我们这个桶的大小,这些请求他把它给丢弃掉了,而且你直接放到桶里,这些请求我也立马都给你处理掉了啊,这就no迪类啊,这种情况呢,更像是我们现在这种,呃,这种漏桶算法,也更像是我们线上的这种,呃,真实的这种环境。那现在啊,你看看起来状态其实非常糟糕的,对吧,为啥,因为你现在配置的是。
10:02
每秒只接受一个QPS,那我至少要给它配置成500个QPS吧,对吧?那么给它给它改成500之后,我们再看看现在这个服务器的效果。其实这改成500,这基本上就不太会报错了啊。来充气,然后清掉。That。啊,现在是每秒能处百,这每每秒能处理500个QPS啊,对吧,但是现在虽然说能处理500,主要是这个并发发起的请求数量实在是太多了。所以还有大量的错误是吧,那这种请求就是现在这种模拟的这种情况,他究竟有多少请求。五个这个用户,然后让他这个infinity,让他无限的去发送请求,呃,这会儿你看请请求的失败率还是非常高的。那如果我们现在不限速,你看我们现在这个系统究竟能够承载多少的并发,或者说我们现在这个QPS应该给它配置成多少才是最合理的,我们把这个限速的这个模块给它给除掉。
11:08
然后再重启。要清掉。这会儿呢,我们就直接看这就行了。看这个这个聚合的这个报告来走。再看这基本没有是吧。QPS能到多少大家看能到7000多,也就是说五个用户,然后同时这种这个无限的发送请求的话,我系统承载量最高能到7000多啊7000多的QPS吞吐量呢,12兆是吧?然后你看我觉得啊,他这个可能没跑慢的话。那我是不是可以适当的去调整一下这个并发用户,你看从五呢,我给它改成十。那我们还是看这。嗯,这个聚合的这个报告来再发。哎,这整体的这个QPS是不是有所提升是吧,然后这个吞吐量呢,也变这个这这这个网络的吞吐量呢,也变得更高了。
12:09
所以呢,我们在这个真正配置这个。参数的时候就是这个Rita,我们的这个呃,并发的这个速率究竟配置多少,你是配置成500QPS还是配成5000QPS。这个一定要在我们上线之前啊,你提前把它给压测好,拿到这个真正的数据,然后再去这个做这个配置,再有就是呃,你访问不同的内容,它可能返回的数据包的大小也不一样,这也要参考这个网络配置,所以这个呃QPS呢,我们真正要去设置的时候要综合去考虑,还有包括就是你有一些反向代理的请求,你有一些计算的请求,那么它能够响应的这个呃并发数它也是不一样的,所以要综合去考虑,请咱们这个呃,更专业的这种测试人员给我们去压测,最终得出来我这个系统的这个阈值,它究竟能够承载的并发量。
13:01
是多高,因为它不是一个这个接口就能够直接反馈回来的,它一定是多个接口,呃,我们这才能组成一个比较庞大的项目,那么找到其中的短板,再找到这个。这个这个这个速率最高的,那第一种方式就是取一个平均值出来啊,比如说最慢的这个接口呢,我们在请求的时候啊,可能只有500QPS,但最快的能不能达到8000,但这会儿我们就直接取一个平均值,但是这个平均值呢,我们取出来之后,真正用户访问的时候,我不可能按照它的这个比例,比如说我就50%的去请求这个高速率,高速度的,50%的用户去去请求这个低速的,这一定不是用户的真实反馈,那么这个真实的反馈为什么说要去请这个专业的测试人员去做这件事儿。啊,他们不是说他的技术有多高啊,是他们手里的数据可能会比较多,那在真正的这个项目当中,一般来说我们都会去模拟用户的请求,以达到真实的这个项目的,呃,这个呃,这这这已达到真实的测试的这个效果,也是我们在玩一些游戏的时候啊,有好多这个在开,刚开始呃,这个游戏会开一些测试服。
14:08
在测试服里边呢,有好多玩家已经在里边开始去玩了,所有用户的这些行为呢,都会被记录成日志。啊,把这个用户的每一举一动,比如说他拾取了一个金币,穿上了一件装备,所有的操作全都记到日志里,那么每一条日志都是一条一条用户的行为,那么在我们后期做这种压力测试的时候,我就再也不需要担心这个这些接口,我们的访问的这个频次,究竟哪个更高,哪个更低,或者取平均值,这些都这些这些值在取的时候,啊,都不是这个最客观的,也都不是最真实的这个用户的访问行为,最真实的访问的行为就是测试服务器里边,呃,我们当我们当下来这些日志。那么接下来我们把这个当下来的日志呢?给它重放一遍,重新的来一遍,这个日志从哪来,大家可以看这这是我们当前这个N的服务器,那如果说我们现在不是游戏服务器啊,就是一个网站,对吧?那这个用户的真实的行为在哪?就在这个日志里,这里边有access log和error log access log呢,就是用户访问的这个所有的用户的行为。
15:15
那么把这个现在这个有点大啊,我们把它给删了。然后重新来一个。你看我在这发请求的,少发一点。呃,十个十个是吧。一个用户,然后让他发100次。然后呢,呃,我重启一下服务器,让它重新生成一下这个文件,因为刚才也删了嘛。刷一下啊,又出来了,但是这里边儿没有数据了是吧,我们发请求过去。然后看看,哎,这里面有11K的数据了。大家看。IP地址、时间以及发送请求的目标的uri。
16:00
那这三个条件其实就组成了一个用户的行为,用户的IP地址是独立的一个用户是吧?呃,当当然我们排除这个局域网的这种可能性,然后这就是用户发起请求的时间或两条来看的就是时间的间隔,它两个动作中间间这个间隔多长时间,然后以及请求的接口后边再加一个这个他请求这个头是吧,这就user agent。这也很重要,我们用的是JA meter发送的这些请求呢,全都是htp client发送的请求,如果我们这个写Java程序想要去重放这个请求的话。那我其实也可以用这个htp client HP client是一个非常高性能的这个拟器啊,它可以模拟HTTP请求直接发送出去这个HTP的这个请求包,我们也可以直接写一个HTP的这种脚本程序,然后去读取这个access log,一行一行的去读。那么在发送请求的时候呢,就按照这个时间的间隔啊去发送。
我来说两句