并发请求限流简单方案
并发请求限流简单方案
一、问题场景
商城应用,活动期间力度大,引流超过预期,系统并发能力支撑不够,导致高峰期服务不可用(实际活动最高并发数峰值达到并发评估和性能压测的2倍)。在系统紧急扩容后,还需做基本的限流操作,避免突增流量时造成系统瘫痪。 应对秒杀,大促等高性能压力的场景时,为了保证系统的平稳运行,必须针对超过预期的流量,通过预先设定的限流规则选择性的对某些请求进行限流。
二、限流理解
分布式三大利器
随着业务的发展壮大,对后端服务的压力也会越来越大,为了打造高效稳定的系统, 产生了分布式,微服务等等系统设计,因为这个原因,设计复杂度也随之增加,基于此 诞生了高并发系统三大利器限流,缓存,降级/熔断。
限流: 从系统的流量入口考虑,从进入的流量上进行限制,达到保护系统的作用;
缓存: 将数据库中的数据缓存起来,提升系统访问速度和并发度,保护数据库资源。
降级和熔断比较类似,都是属于过载保护机制,但是实现上有着如下区别
降级: 从系统内部的平级服务或者业务的维度考虑,流量大了,可以暂停或延迟一些非重要服务,如日志收集等等,保护其他正常使用;
熔断: 当某一服务出现了过载现象,为防止整个系统故障,直接关闭该服务或者保证部分请求成功,另一部分返回失败。比如10s内连续请求失败次数达到20次, 触发熔断机制,过滤60%请求。
三、限流方案
由于系统前期限流需求较为简单,只需要为了保证系统的平稳运行,针对超过预期的流量,进行限流即可。限流规则简单。
初步应用nginx限流和网关限流两种方案实现,并做以调试。
方案一 nginx限流
Nginx 提供两种限流方式,一是控制速率,二是控制并发连接数。
1、limit_conn_zone
ngx_http_limit_conn_module 提供了限制连接数的能力,利用 limit_conn_zone 和 limit_conn 两个指令即可。
2、limit_req_zone
ngx_http_limit_req_module 模块提供限制请求处理速率能力,使用了漏桶算法(leaky bucket)。
3、ngx_http_upstream_module
前两种只能对客户端(即单一ip限流)
根据实际情况应用upstream_module限流
压测限流生效
方案二 网关gateway限流
geteway可以基于GatewayFilter自身的RequestRateLimiter实现限流,可以基础Sentinel等中间件实现限流,这里是基于自身GatewayFilter实现。
RequestRateLimiter限流是基于redis的,需要继承配置redis
压测限流效果
分布式高并发系统限流原理与实践 https://zhuanlan.zhihu.com/p/340815033
Nginx 限流总结 https://www.cnblogs.com/jelly12345/p/14469280.html
SpringCloud gateway 限流 RequestRateLimiter https://blog..net/xgw1010/article/details/109403892
Spring Cloud Gateway 网关限流 https://www.cnblogs.com/huan1993/p/15416072.html