首页 » 开源分析 » 使用限流策略,让系统更稳定

使用限流策略,让系统更稳定

 

限流简介

什么是限流

限流是保障系统稳定性的一种策略。限流的思路是,当单位时间系统处理的请求量达到指定阈值,则后续的请求做特殊处理。如,后续的请求被抛弃,或者放到队列中一直等待,而不是及时处理。

生活中限流的应用也很多。如,地铁高峰时,每隔一段时间,放一定量的人进地铁。后面的人只能排队等着。

限流的意义

任何系统都有一个处理能力。如果负载过高,很容易导致系统瘫痪,不能持续的提供服务。

还拿地铁来举例吧。每辆地铁能载多少人,基本是固定的。如果,不进行限流,一直是尽量载更多的人,那地铁的负载会非常高。长期的高负载运转,很容易系统出故障。

由此可见,限流的意义就是让系统能在一个合理的水位运转,不会由于负载过高而导致瘫痪。

如何实现限流

限流的常见实现有两种,控制并发和控制速率。

控制并发,就是控制系统同时处理的请求数。海底捞的拿号排队,就是一个控制并发的限流策略。只能一桌吃完走了,再让另一桌进来用餐。

控制速率,就是控制请求进入系统进行处理的速率。常见的算法有令牌桶算法和漏桶算法。

实现限流方案

实现限流的方案很多,我们使用nginx的ngx_http_limit_req_module 模块用于限制QPS。

http {
limit_req_zone $server_name zone=asp:10m rate=2000r/s;
...
server {
...
location /search/ {
limit_req zone=asp burst=10 nodelay;
}
}

我们使用`$server_name`作为key,而不是常用的`$binary_remote_addr`,是因为我们想对整个应用做QPS限制。

上面的配置,我们设置的QPS是2000。超过限制的请求直接返回,不再处理。

至于QPS设置多少合理,需要你对系统进行压测。压测的过程中并发数会影响QPS。因此,需要不断调整并发连接数多次压测。

如果想限制并发连接数,可以尝试使用nginx的ngx_http_limit_conn_module模块。

其他相关

压测工具

ab -n 20000 -c 1 -p data.txt -T application/x-www-form-urlencoded 'http://www.bo56.com/index.php'
上面的命令是1个并发,发送20000个请求。并且使用post方式进行请求。
data.txt文件中的内容就是请求数据。数据格式类似:
site_key=站点&user_key=用户

相关资料

https://my.oschina.net/kone/blog/88713
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

技术交流

原文链接:使用限流策略,让系统更稳定,转载请注明来源!

原文链接:使用限流策略,让系统更稳定,转载请注明来源!

7