限流实践
高并发系统三把利器:缓存、降级和限流
限流大家多少都有所了解,就是限制当前请求流量、数量,避免系统被蜂拥而至的流量瞬间击垮,刚好最近手上业务系统做了限流,顺便整理出来。
我们的业务场景
- 云变量和云列表,用户在线使用的程序变量和数组,一些作品运行人数过多或者作者滥用(for循环中修改变量或数组),大量请求消息落到kafka,而我们消费机器能力有限,造成消息堵塞。直接的影响就是业务不能正常使用,频繁fullgc。
- 无论什么系统,业务上的优化往往更能立竿见影,且成本较低。这里不做详述,比较偏业务,主要思路是尽量减少落入kafka中的无效消息,合并重复消息。
限流方式
- 限制总并发数(比如数据库连接池、线程池)
- 限制瞬时并发数(如nginx的limit_conn模块,用来限制瞬时并发连接数)
- 限制时间窗口内的平均速率(如Guava的RateLimiter、nginx的limit_req模块,限制每秒的平均速率)
- 限制远程接口调用速率
- 限制MQ的消费速率。
- 可以根据网络连接数、网络流量、CPU或内存负载等来限流
限流算法
Google大法了相关资料,总结常用的限流算法如下:
- 计数器
- 通过一个计数器来记录一定时间内某个接口的访问数量,超过阈值则不允许继续访问,或者后续的请求放入队列,计数器到下一个时间段清零,这里缺点是&#