限流机制在现代软件系统中,是普遍存在的一个技术。它可以保护系统免受恶意攻击或滥用,防止由于请求过多而导致的资源耗尽,平滑流量以避免系统崩溃,化系统性能,确保合理的资源使用。
常见的限流算法有令牌桶算法和滑动窗口限流。
令牌桶算法
令牌桶算法是一种常用的限流算法,它基于令牌的概念。在一个令牌桶中,令牌以固定速率生成,然后存放在桶中。当请求到达时,必须消耗一个令牌,只有在桶中有足够令牌时才能通过。
上面代码演示了一个简易的令牌桶算法,它使用一个阻塞队列来存储令牌,请求必须消耗令牌才能通过。这确保了以每秒5个请求的速率通过,超出速率的请求将被拒绝。
滑动窗口限流
滑动窗口限流是另一种常见的限流策略,它使用时间窗口来平滑控制请求速率。我们可以定义一个时间窗口,在窗口内统计请求的数量,然后与阈值进行比较。
上面例子就是一个固定窗口滑动限流,它在1秒的时间窗口内限制了每秒2个请求,多的请求就会被拒绝。
固定窗口滑动限流,简单直观,便于理解,能准确控制窗口大小,实现起来也简单。但是对于一些突发的请求可能会有临时超限,比如在时间窗口边缘的请求。
这个示例演示了滑动窗口计数限流。滑动窗口计数限流比固定窗口限流更加平滑,而且可以做到更加精细的控制,但是代价就是复杂度会增加,同时对时钟同步要求更高,计数的准确性依赖于时间的准确性。
为了对时间窗口进行更精细的控制,使得流量更加平滑,可以参考源码:https://github.com/alibaba/Sentinel/blob/master/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/base/LeapArray.java#L61 实现,对1秒的时间窗口进行划分。
下面代码实例展示了将1s分割成两个时间窗口进行计数,使得流量控制更加平滑。
- 作者:Yibin
- 链接:https://yibin.dev/article/b7c9638e-0a8b-46db-8b4b-efcdd87dd4c9
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章






