漏桶算法
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}
limit_req
设置共享内存区域和请求的最大突增大小。
语法:limit_req zone=name [burst=number] [nodelay | delay=number];
默认值:-
位置:http, server, location
如上配置通俗解释如下图:
在内存中申请10m区域存放数据,限制每秒只能处理1个请求,最大突增大小为5,这里引入了桶的概念。客户端并发发送请求后,第一个请求可以正常处理,后续请求有5个会进入到桶中,而有更多的请求将在桶外等待排队。当第一个请求处理完毕,桶中的请求继续流出一个,这时桶里剩下4个请求等待处理,而桶外又会再次有请求进入直到桶中有五个请求。流出一个,流入一个。
这样做会导致很多请求会有延迟,如果不想有过多延迟可以加入nodelay参数
limit_req zone=one burst=5 nodelay;
delay 参数 指定过多请求延迟的限制。默认值为零,即所有过多的请求都延迟
令牌桶算法
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
}
locatin / {
limit_req zone=one burst=5 nodelay;
...
}
漏桶算法中rate=1r/s表示每秒接收1个请求,而在令牌桶中,此处代表每秒中会生成一个令牌放到桶中。
请求拿到令牌后才会进行下一步处理,如果桶中已经没有令牌则请求不会处理。
一个请求还可以拿到多个令牌,比如一个令牌代表限制的带宽为100m,此时桶中有四个令牌,第一个客户发送的请求拿到了三个令牌,那此时他的带宽就为300m,第二个客户发送请求,只拿到了一个令牌,那么第二个客户的带宽便只有100m。