限流原理与应用实践

限流使用场景

防止接口高频恶意调用
控制接口流量保护后台
类秒杀场景快速拒绝

后端限流原理

令牌桶算法

固定容量桶匀速生成许可证,多则丢弃
线程排队取许可证,取到执行业务,队列满丢弃

漏桶算法

线程进入固定容量桶中,线程满则丢弃,桶以恒定速率处理线程

滑动窗口算法

控制窗口内时间间隔的请求数总和,算出下一时间间隔的流量

常用限流方案

前端限流

限制重复提交间隔、验证机制

网关限流

单机Nginx IP限流

限制同一IP请求频率
限制最大连接数
限制带宽

分布式SpringCloud Gateway、Sentinel

后端限流

单机Guava和流量预热

同步非阻塞模式,有票证服务,无则拒绝
同步阻塞模式,有票证服务,无则等待服务
流量预热,票证趋满发放慢(数倍间隔),票证趋少发放快(单倍间隔)

分布式Redis+LUA

利用Redis中LUA脚本的原子性和内存的快速读写实现
LUA脚本预加载减少网络请求和重新编译成本

实践落地

同一用户、规定时间段只允许请求cnt次

设置{key: userID, val: count, EX: interval},每次访问校验incr count是否超量,直到key过期(key过期后重新设置可以循环限制)

限制单次请求、幂等性控制

1)Redis记录请求的userId,已存在直接拒绝
2)用户先获取唯一token(可进行token发放数量限制),后端存入redis,首次请求时token存在并删除,再次请求时无token被拒绝

具体实现参考资料

1 令牌桶算法原理及应用
2【高并发】使用Nginx实现限流
3 分布式限流方案(gateway限流,redis+lua实现限流,nginx限流)
4 使用 AOP+redis+lua 做方法限流

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

©2018-2024 Howell版权所有 备案号:冀ICP备19000576号