返回

Sentinel7-限流算法与RateLimiter 源码剖析

后端

引言

限流是一种保护系统不受过载的软件设计模式。它通过限制请求或任务的速率来实现这一点,从而防止系统因处理过多的请求或任务而崩溃。

四种经典限流算法

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实现,可以帮助开发者轻松地实现限流功能。