一般情况下,首页的并发量是比较大的,即使 有了多级缓存,当用户不停的刷新页面的时候,也是没有必要的,另外如果有恶意的请求 大量达到,也会对系统造成影响。
而限流就是保护措施之一。
网站上线了:用户访问的。(用户访问量不大) 大:考虑并发(考虑用户手速)
- 限制用户
- 限制用户的访问速率
- 限制用户的连接数
5.1 生活中限流对比
- 水坝泄洪,通过闸口限制洪水流量(控制流量速度)。
- 办理银行业务:所有人先领号,各窗口叫号处理。每个窗口处理速度根据客户具体业务而定,所有人排队等待叫号即可。若快下班时,告知客户明日再来(拒绝流量)
- 火车站排队买票安检,通过排队 的方式依次放入。(缓存带处理任务)
5.2 nginx的限流
nginx提供两种限流的方式:
- 一是控制速率
- 二是控制并发连接数
5.2.1 控制速率
控制速率的方式之一就是采用漏桶算法。
(1)漏桶算法实现控制速率限流
漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率.示意图如下:
(2)nginx的配置
配置示意图如下:
- 修改/usr/local/openresty/nginx/conf/nginx.conf:
#限流设置,每秒只能访问2次
limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=2r/s;
location /read_content {
#使用限流配置
limit_req zone=contentRateLimit;
content_by_lua_file /root/lua/read_content.lua;
}
- 整个nginx.conf配置如下:
user root root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#cache
lua_shared_dict dis_cache 128m;
#限流设置
limit_req_zone $binary_remote_addr