文章插图
我们使用单个IP在10ms内发并发送了6个请求,只有1个成功,剩下的5个都被拒绝 。我们设置的速度是2r/s,为什么只有1个成功呢,是不是Nginx限制错了?当然不是,是因为Nginx的限流统计是基于毫秒的,我们设置的速度是2r/s,转换一下就是500ms内单个IP只允许通过1个请求,从501ms开始才允许通过第二个请求 。
burst缓存处理我们看到,我们短时间内发送了大量请求,Nginx按照毫秒级精度统计,超出限制的请求直接拒绝 。这在实际场景中未免过于苛刻,真实网络环境中请求到来不是匀速的,很可能有请求“突发”的情况,也就是“一股子一股子”的 。Nginx考虑到了这种情况,可以通过burst关键字开启对突发请求的缓存处理,而不是直接拒绝 。
来看我们的配置:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location / { limit_req zone=mylimit burst=4; } }我们加入了burst=4,意思是每个key(此处是每个IP)最多允许4个突发请求的到来 。如果单个IP在10ms内发送6个请求,结果会怎样呢?
文章插图
相比实例一成功数增加了4个,这个我们设置的burst数目是一致的 。具体处理流程是:1个请求被立即处理,4个请求被放到burst队列里,另外一个请求被拒绝 。通过burst参数,我们使得Nginx限流具备了缓存处理突发流量的能力 。
但是请注意:burst的作用是让多余的请求可以先放到队列里,慢慢处理 。如果不加nodelay参数,队列里的请求不会立即处理,而是按照rate设置的速度,以毫秒级精确的速度慢慢处理 。
nodelay降低排队时间在使用burst缓存处理中,我们看到,通过设置burst参数,我们可以允许Nginx缓存处理一定程度的突发,多余的请求可以先放到队列里,慢慢处理,这起到了平滑流量的作用 。但是如果队列设置的比较大,请求排队的时间就会比较长,用户角度看来就是RT变长了,这对用户很不友好 。有什么解决办法呢?nodelay参数允许请求在排队的时候就立即被处理,也就是说只要请求能够进入burst队列,就会立即被后台worker处理,请注意,这意味着burst设置了nodelay时,系统瞬间的QPS可能会超过rate设置的阈值 。nodelay参数要跟burst一起使用才有作用 。
延续burst缓存处理的配置,我们加入nodelay选项:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location / { limit_req zone=mylimit burst=4 nodelay; } }单个IP 10ms内并发发送6个请求,结果如下:
文章插图
跟burst缓存处理相比,请求成功率没变化,但是总体耗时变短了 。这怎么解释呢?在burst缓存处理中,有4个请求被放到burst队列当中,工作进程每隔500ms(rate=2r/s)取一个请求进行处理,最后一个请求要排队2s才会被处理;这里,请求放入队列跟burst缓存处理是一样的,但不同的是,队列中的请求同时具有了被处理的资格,所以这里的5个请求可以说是同时开始被处理的,花费时间自然变短了 。
但是请注意,虽然设置burst和nodelay能够降低突发请求的处理时间,但是长期来看并不会提高吞吐量的上限,长期吞吐量的上限是由rate决定的,因为nodelay只能保证burst的请求被立即处理,但Nginx会限制队列元素释放的速度,就像是限制了令牌桶中令牌产生的速度 。
看到这里你可能会问,加入了nodelay参数之后的限速算法,到底算是哪一个“桶”,是漏桶算法还是令牌桶算法?当然还算是漏桶算法 。考虑一种情况,令牌桶算法的token为耗尽时会怎么做呢?由于它有一个请求队列,所以会把接下来的请求缓存下来,缓存多少受限于队列大小 。但此时缓存这些请求还有意义吗?如果server已经过载,缓存队列越来越长,RT越来越高,即使过了很久请求被处理了,对用户来说也没什么价值了 。所以当token不够用时,最明智的做法就是直接拒绝用户的请求,这就成了漏桶算法 。
自定义返回值 limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location / { limit_req zone=mylimit burst=4 nodelay; limit_req_status 598; } }默认情况下 没有配置 status 返回值的状态:
文章插图
文章插图
【理论+实践,教你如何使用Nginx实现限流】
推荐阅读
- 手机内存越来越少,怎么办?教你两招,快速释放20G内存空间
- 手机相册几千张,教你3秒锁定想要的照片
- win10本地连接不见了怎么办,教你一个方法立马搞定
- pdf去除加密方法有哪些,一招教你在线去除pdf密码
- 苹果手机通讯录没了怎么找回,一招教你找回通讯录联系人
- 视觉营销的三大要素是什么,教你6个步骤引爆客源
- 河南创业补贴网上怎么申请,手把手教你一次申报成功
- 品牌网络推广方案怎么做,教你三步就轻松搞定
- 新产品推广怎么做,一步教你如何快速推广新产品
- 创业指导课的心得体会怎么写,一文教你就业与创业指导课心得体会