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