我们要把A池子的水转到B池子,如何控制水平稳的从A池子进入B池子就是限流
首先需要了解两个算法
系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处
理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。
类似
把A的水接入到一个固定流速的水龙头里,控制水龙头的流速,流入到B池子就是令牌桶算法,从入口处限流。
把A的池子全都倒入一个大桶,在桶底部加个漏斗就是漏桶算法,从出口处限流
所谓的滑动时间算法指的是以当前时间为截止时间,往前取一定的时间,比如往前取 60s 的时间,在这 60s 之内运行最大的访问数为 100,此时算法的执行逻辑为,先清除 60s 之前的所有请求记录,再计算当前集合内请求数量是否大于设定的最大请求数 100,如果大于则执行限流拒绝策略,否则插入本次请求记录并返回可以正常执行的标识给客户端
把A和B池子之间接一个固定长度为60米的水管,水管直径限制为100,水管满了就拒绝继续注入水
漏桶算法能够强行限制数据的传输速率。保护B池子,超出漏斗的会被丢弃,因此不允许某种程度的突发传输。
令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。保护A池子。
1、验证码、IP 黑名单
2、Tomcat控制最大线程数、Nginx控制速率与并发请求数,网关控制最大连接数
3、利用上面的 三种算法 使用 熔断器,服务降级,消息队列Kafka,等限流