费曼学习法学习限流算法
为什么要限流
mysql插入600次/秒
超过这个阈值,要么使用mysql集群、要么限流,防止宕机
有哪些算法
固定窗口
就是个计数器,一秒内超过阈值,不允许访问
缺点:不均匀,跨越临界点的一秒内,阈值会翻倍,导致宕机
优点:实现简单
滑动窗口
一秒代表一个窗口,同时一秒又划分多个格子
格子越多,越均匀
窗口记录每个格子的请求量,每次滑动一下,新增一个格子,原本窗口第一个格子被划出,释放格子占用的请求量,给新格子。
缺点:复杂,需要记录每个格子的请求数量
漏桶
相当于一个消息队列,有一定的缓冲作用
请求放入桶里,另一个线程允许提取
适合请求稳定的场景
令牌桶
一个线程匀速往桶内放令牌
另一个线程,拿到令牌才能处理请求
可以一次拿一个或者多个,应多突发秒杀活动等流量
使用场景:tcp协议 滑动窗口,保证速度,还要保证可靠性。
客户端速度大于服务器,就会出现丢包重发,随意客户端根据服务器返回的滑动窗口的格子内请求书,来调整速度
有哪些实现
guava
redis
lua
sentinel
gate lway