【每天5分钟,了解一个知识点】
架构中的限流需求,我们有多种算法可供选择,主要包括固定窗口限流算法、滑动窗口限流算法、漏桶限流算法和令牌桶限流算法。下面我们将对这四种算法进行比较,并分析各自的优缺点。
一、固定窗口限流算法
原理:将时间划分为固定大小的窗口,在每个窗口内限制请求的数量。例如,设定每分钟最多允许 100 个请求,那么在每分钟这个固定窗口内,一旦请求数量达到 100,后续的请求就会被拒绝,直到下一个窗口开始。
优点:
实现简单,易于理解和实现。
对于一些对限流精度要求不高的场景,能够快速有效地进行限流。
缺点:
限流不够平滑。在窗口切换的瞬间,可能会出现流量突发的情况。例如,前一分钟的最后几秒和后一分钟的开始几秒,可能会有大量请求集中涌入。
无法准确控制请求的分布,可能导致某些时间段内请求过于集中,而其他时间段内请求较少。
二、滑动窗口限流算法
原理:将时间划分为多个小的时间片段,通过不断滑动窗口来统计请求数量,从而实现限流。与固定窗口不同的是,滑动窗口可以更精确地控制请求的分布。
优点:
相比固定窗口算法,限流更加平滑,能够更好地控制请求的分布。
可以更准确地反映当前的流量情况,避免了在窗口切换时的流量突发问题。
缺点:
实现相对复杂,需要维护多个时间片段的请求统计信息。
对于高并发场景,可能会消耗较多的内存和计算资源。
三、漏桶限流算法
原理:想象有一个漏桶,无论流入的水量(请求)有多大,漏桶总是以固定的速率出水(处理请求)。当桶满时,新流入的水(请求)就会被拒绝。
优点:
限流非常平滑,能够保证系统以稳定的速率处理请求。
可以有效地防止突发流量对系统造成的冲击。
缺点:
对于突发流量的响应不够灵活。即使系统有足够的处理能力,也不能在短时间内处理更多的请求。
可能会导致一些请求的延迟增加,特别是在桶接近满的时候。
四、令牌桶限流算法
原理:有一个令牌桶,系统以固定的速率向桶中放入令牌。当请求到来时,需要从桶中获取一个令牌才能被处理。如果桶中没有令牌,则请求被拒绝。
优点:
能够在一定程度上应对突发流量。当有突发流量时,只要桶中有足够的令牌,就可以快速处理请求。
可以通过调整令牌生成的速率和桶的大小来灵活地控制流量。
缺点:
实现相对复杂,需要维护令牌桶的状态。
如果令牌生成的速率设置不当,可能会导致系统资源的浪费或限流效果不佳。
【关联阅读】
关注公众号,回复【Java面试】,获取更多面试资料




