返回
Sentinel7-限流算法与RateLimiter 源码剖析
后端
2023-10-14 15:22:31
引言
限流是一种保护系统不受过载的软件设计模式。它通过限制请求或任务的速率来实现这一点,从而防止系统因处理过多的请求或任务而崩溃。
四种经典限流算法
1. 固定窗口算法
固定窗口算法是最简单的限流算法。它将时间划分为固定大小的窗口,并在每个窗口内限制请求或任务的数量。当窗口满了时,新来的请求或任务将被拒绝。
2. 滑动窗口算法
滑动窗口算法与固定窗口算法类似,但它使用滑动窗口。滑动窗口随着时间移动,允许新请求或任务进入窗口,同时从窗口中移除旧的请求或任务。这样,滑动窗口算法可以更好地适应请求或任务的速率变化。
3. 漏桶算法
漏桶算法使用一个固定大小的桶来限制请求或任务的速率。当请求或任务到达时,它将被放入桶中。如果桶已满,新来的请求或任务将被拒绝。漏桶算法可以平滑请求或任务的速率,防止突发流量对系统造成冲击。
4. 令牌桶算法
令牌桶算法使用一个固定数量的令牌来限制请求或任务的速率。当请求或任务到达时,它将从桶中获取一个令牌。如果桶中没有令牌,新来的请求或任务将被拒绝。令牌桶算法可以更好地控制请求或任务的速率,防止系统过载。
Guava和Sentinel中的RateLimiter
Guava和Sentinel都提供了RateLimiter实现。Guava的RateLimiter使用令牌桶算法,而Sentinel的RateLimiter使用滑动窗口算法。
Guava的RateLimiter
Guava的RateLimiter使用令牌桶算法来限制请求或任务的速率。它提供了两种构造函数:
RateLimiter(double permitsPerSecond)
:创建一个新的RateLimiter,以每秒permitsPerSecond
个令牌的速度生成令牌。RateLimiter(double permitsPerSecond, long warmupPeriod, TimeUnit unit)
:创建一个新的RateLimiter,以每秒permitsPerSecond
个令牌的速度生成令牌,并在warmupPeriod
时间内逐渐增加到该速率。
Sentinel的RateLimiter
Sentinel的RateLimiter使用滑动窗口算法来限制请求或任务的速率。它提供了两种构造函数:
RateLimiter(int count, long intervalMs)
:创建一个新的RateLimiter,在intervalMs
毫秒内允许count
个请求或任务。RateLimiter(int count, long intervalMs, int coldFactor)
:创建一个新的RateLimiter,在intervalMs
毫秒内允许count
个请求或任务,并使用coldFactor
来控制令牌桶的预热速度。
结论
限流算法是保护系统不受过载的重要手段。Guava和Sentinel都提供了RateLimiter实现,可以帮助开发者轻松地实现限流功能。