Nginx结合漏桶算法和令牌桶算法。对请求做了完美限速。
漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。
令牌桶算法(Token Bucket)和 Leaky Bucket 效果一样但方向相反的算法,更加容易理解.随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了.新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务.
nginx配置如下:
http {
.....................................
limit_req_zone $binary_remote_addr zone=test:100m rate=10r/s;
//其中$binary_remote_addr不同请求不同值
server {
……………………
limit_req zone=test burst=5 nodelay;
…………………
}
}
zone=test 表示设置了名为test的存储区,大小为10兆字节。
rate=10r/s 的意思是允许每秒10个请求的速度。
burst=5 表示最大令牌数量。超过就会503拒绝。
如果太过多的请求被限制延迟,如果不需要延迟,这时需要使用nodelay参数。
本文分享自 nginx遇上redis 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!