高并发系统用于保护系统有三种利器:缓存、降级、限流。
服务端限流的方案可以归纳为两窗两桶(固定窗口,滑动窗口,漏桶算法,令牌桶算法)
固定窗口法
- 固定时间周期划分时间为多个时间窗口,如:每10秒为一个时间窗口
- 在每个时间窗口内,每有一个请求,计数器加一
- 当计数器超过限制,丢弃本窗口之后的所有请求
- 当下一时间窗口开始,重置计数器
缺点
-
通过请求量为允许限制的两倍
假设限制1秒内最多通过10个请求,在第一个窗口的最后半秒内通过了10个请求,第二个窗口的前半秒内又通过了10个请求。这样看来就是在1秒内通过了20个请求。
-
一旦流量进入速度有所波动,要么计数器会被提前计满,导致这个周期内剩下时间段的请求被限制。要么就是计数器计不满,导致资源无法充分利用。
滑动窗口法
- 以当前时间为截止时间,往前取一定的时间作为时间窗口,比如:往前取 60s 的时间
- 当有新的请求进入时,删除时间窗口之外的请求,对时间窗口之内的请求进行计数统计,若未超过限制,则进行放行操作;若超过限制,则拒绝本次服务
缺点
- 当时间区精度越高,占用的空间资源就越大。
漏桶算法
- 将每个请求视为水滴加入漏桶进行存储
- 漏桶以固定速率匀速出水(处理请求)
- 若桶满则抛弃请求
缺点
- 不适合突发请求场景:当短时间内有大量的突发请求时,即便此时服务器没有任何负载,每个请求也都得在队列中等待一段时间才能被响应。
令牌桶算法
- 以恒定的速度往令牌桶中放入令牌
- 当有请求过来则从令牌桶中获取令牌进行后续请求
- 当获取令牌失败后则进行友好处理。
分布式场景
网关限流
Nginx限流
- 基于IP地址和基于服务器的访问请求限流
- 并发量(连接数)限流
- 下行带宽速率限制