nginx配置中的burst缓冲队列

nginx里控制请求速率的配置项还挺多的。举个例子:

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

这个很容易理解,就是client的二进制ip进行除重,存储这些ip有10M的内存空间,每个ip每秒请求数不能超过10个。但问题是,请求不是均匀的,如果0.5s内来了6个请求,按速率来算,超过了10r/s,但如果接下来的0.5s里只有1个请求,那平均来看这1秒的请求数只有7个,又不超过10r/s的限制。但时间是连续的,并不能这么切成一秒一秒来看,所以就有最大突发请求的限制,也就是the maximum burst size of requests。

Syntax:	limit_req zone=name [burst=number] [nodelay];
Context:	http, server, location

直接举例:

limit_req zone=req_zone;

有请求就处理,无延时,发现速率超过10r/s,就丢弃请求,返回503 (Service Temporarily Unavailable),相当于burst=0。可以理解为,只接受严格平均的请求,即100ms一个请求,只要稍微的并发,如一个ip同时来了两个请求,就会有一个返回503。

limit_req zone=req_zone burst=5;

瞬时并发请求会缓存到一个长度为5的队列里,然后按照10r/s的速率一个一个处理,如果队列已满,再来的请求会被丢弃。所以有的请求会有明显的延时,如果队列开得足够大,如burst=1000,就会发现并发的请求都能被处理,只是感觉请求一个比一个耗时久。如果队列开得不大,如burst=5,会发现最开始的请求能被及时处理,接着越来越慢,直到不停返回503。

limit_req zone=req_zone burst=5 nodelay;

瞬时并发请求会缓存到一个长度为5的队列里,依次立即处理,表现为无延迟,但是当速率达到10r/s后,会停下来,同样当burst队列满了后,新来的请求会直接返回503。

第二种比较好理解,但第一种和第三种表现比较接近,我的理解,第三种与第一种相比,只是提供了一个缓存队列。

发表于 2018年03月26日 20:28   评论:0   阅读:3044  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo