限流算法是一种系统保护策略,主要是避免在流量高峰导致系统被压垮,造成系统不可用的问题。
1. (如图) 计数器限流,一般用在单一维度的访问频率限制上 ,比如短信验证码每隔 60s 只能发送一次 ,或者接口调用次数等它的实现方法很简单 ,每调用一次就加 1 ,处理结束以后减一。
2. (如图) 滑动窗口限流,本质上也是一种计数器,只是通过以时间为维度的可滑动 窗口设计 ,来减少了临界值带来的并发超过阈值的问题。
每次进行数据统计的时候 ,只需要统计这个窗口内每个时间刻度的访问量就可以了。 Spring Cloud 里面的熔断框架 Hystrix ,以及 Spring Cloud Alibaba 里面的 Sentinel 都采用了滑动窗口来做数据统计。
3. (如图)漏桶算法 ,它是一种恒定速率的限流算法,不管请求量是多少 ,服务端的处理效率是恒定的。基于MQ 来实现的生产者消费者模型,其实算是一种漏桶限流算法。
4. (如图) 令牌桶算法 ,相对漏桶算法来说 ,它可以处理突发流量的问题。
它的核心思想是,令牌桶以恒定速率去生成令牌保存到令牌桶里面,桶的大小是固定的, 令牌桶满了以后就不再生成令牌。
每个客户端请求进来的时候 ,必须要从令牌桶获得一个令牌才能访问 ,否则排队等待。 在流量低峰的时候,令牌桶会出现堆积,因此当出现瞬时高峰的时候,有足够多的令牌 可以获取 ,因此令牌桶能够允许瞬时流量的处理。
网关层面的限流、或者接口调用的限流,都可以使用令牌桶算法,像 Google 的 Guava, 和Redisson 的限流 ,都用到了令牌桶算法。
限流的本质是实现系统保护,最终选择什么样的算法,一方面取决于统计的 精准度 ,另一方面考虑限流维度和场景的需求。