什么是限流?
限流可以被视为服务降级的一种形式,其核心目标是通过控制输入和输出流量来保护系统。通常,一个系统的处理能力是可以预估的,为了确保系统的稳定运行,当流量达到预定的阈值时,必须采取措施限制进一步的流量。这些措施可能包括延迟请求的处理时间、直接拒绝请求,或者部分地拒绝请求等策略。
为什么要做限流?
限流是一种面对资源有限性或安全威胁时采取的防御措施,旨在自我保护。通过限流,系统能够使用有限的资源来最大化服务能力,确保在预期的流量范围内提供服务。
当流量超出这一范围时,系统会采取诸如拒绝服务、排队等待、服务降级等应对措施。在实际业务场景中,如限时秒杀活动、微博热搜等,用户流量可能会急剧增加。在这种情况下,后端服务的处理能力是有限的,如果无法妥善处理这些突发流量,后端服务可能会崩溃,进而导致整个系统的瘫痪。
此外,对于潜在的恶意流量,例如爬虫或DoS攻击,我们的服务必须以最大的恶意来防范可能的调用者行为。由于我们无法预知调用者将如何使用我们的服务,假设有调用者开启多个线程,全天候地进行密集调用,如果我们的服务没有适当的防护措施,那么服务的稳定性将受到严重威胁。因此,限流策略对于维护系统稳定性和防止恶意攻击至关重要。
四种常用限流算法
固定窗口限流算法:这种算法将时间分成固定的单位窗口,并在每个窗口期内限制请求的数量。如果窗口内的请求量未超过设定的阈值,则允许请求;否则,请求将被拒绝。每个窗口期结束后,计数器会重置。
(图源腾讯云)
这种算法简单直观,但在窗口切换时可能会出现突发流量。
(图源腾讯云)
滑动窗口限流算法:不同于固定窗口算法,滑动窗口算法将时间分为多个小周期,每个小周期都可以视为一个固定窗口。这样,即使在某一小周期内请求量超过了阈值,也可以在后续的小周期中补充处理这些请求,从而提供更平滑的限流效果。
(图源腾讯云)
下面这个图片更加容易理解
漏桶限流算法:漏桶算法通过控制数据流入网络的速度来防止网络拥塞。它使用一个“漏桶”来接收请求,桶内的水代表待处理的请求。水的流出速度是恒定的,而流入速度则是不确定的。当桶满时,新来的请求会被丢弃。
令牌桶限流算法:令牌桶算法也是用于限制单位时间内的请求数量。它以固定的速率向桶中添加令牌,请求需要消耗令牌才能被处理。如果桶中没有足够的令牌,请求将被限制或拒绝。
(图源腾讯云)