限流使用场景
防止接口高频恶意调用
控制接口流量保护后台
类秒杀场景快速拒绝
后端限流原理
令牌桶算法
固定容量桶匀速生成许可证,多则丢弃
线程排队取许可证,取到执行业务,队列满丢弃
漏桶算法
线程进入固定容量桶中,线程满则丢弃,桶以恒定速率处理线程
滑动窗口算法
控制窗口内时间间隔的请求数总和,算出下一时间间隔的流量
常用限流方案
前端限流
限制重复提交间隔、验证机制
网关限流
单机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 做方法限流