返回介绍

6.1 限流

发布于 2025-04-21 20:58:44 字数 2316 浏览 0 评论 0 收藏

想象这样一个场景,某个电商平台某天举行秒杀活动,或者某个视频网站某一时刻上线一部热播剧,在此之前,服务器访问比较正常,服务处理能力稳定,但在进行秒杀活动或上线热播剧的特殊时段内客户端访问会突然暴增,即使后端服务器已经扩容,但是访问量仍然难以预估,此时如何保证服务的可用性呢?答案就是进行限流。

限流的本质是通过对高并发请求进行访问限制,将流量限制在一定范围内。当访问达到一定数量时,可以拒绝服务,或者进行熔断和降级操作。本节主要讲解限流的原理及相关的框架。

6.1.1 限流的原理

限流方式主要有两种,即限制并发数和限制访问速度。限制并发数可以通过限制连接池的最大连接数量来实现;限制访问速度可以通过设置 QPS 的访问规则来实现。

当前流行的限流框架是以 QPS 的限制为主。限流算法主要包括漏桶算法、令牌桶算法、固定窗口算法及滑动窗口算法等。

1. 漏桶算法

漏桶算法的原理如图 6.1 所示。

103-1

图 6.1 漏桶算法的原理

漏桶算法的原理是,首先设定一个固定容量的漏桶,所有请求都需要经过这个漏桶,设定请求从漏桶里出去的速度是固定的。当请求的速度大于漏桶流出的速度时,会慢慢地超出漏桶的容量,那么后面的请求就会被阻塞或抛弃,直到漏桶再次有能力接收请求为止。

2. 令牌桶算法

令牌(Token)桶算法的原理如图 6.2 所示。

103-2

图 6.2 令牌桶算法

令牌桶算法的原理中同样需要一个固定容量的桶,此外还需要一个程序以固定的速度向桶里加入令牌。如果超出容量,则抛弃令牌。当请求到来时将尝试获取令牌,如果取得令牌,则进行处理,如果未获取令牌,则拒绝或阻塞等待。

Google 公司提供的 Guava RateLimiter 便是基于令牌桶算法实现的限流工具。

3. 固定窗口算法

固定窗口算法称为计数器算法,它规定在一段时间内从零开始计数,每一次请求加 1,当累计超过设定的临界值时开始限流,下一个时间段开始后,计数器重新计数。

4. 滑动窗口算法

滑动窗口算法是固定窗口算法的优化算法,它把一段时间间隔进行 N 等分,然后记录每一个小的时间段内的请求数。每次滑动 1/N 的时间窗口。如果分割的数量越多,统计结果就越精准,限流就越平滑。

以上 4 种算法的比较如表 6.1 所示。其中最常见的算法是令牌桶算法与滑动窗口算法。

表 6.1 限流的算法比较

104-1

6.1.2 限流示例

下面给出一个简单的限流实例。

(1)在 pom.xml 文件中添加工具包依赖,代码如下:

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>30.0-jre</version>
</dependency>

(2)新建类 RateLimitService.java,限制访问量为 100,代码如下:

@Service
public class RateLimitService {
    //限流器
    private RateLimiter rateLimiter = RateLimiter.create(100.0);
    public boolean tryAcquire(){
        return rateLimiter.tryAcquire();
    }
}

(3)通过接口访问时添加限流,代码如下:

@GetMapping("/springBoot")
public String hi(){
   if(rateLimitService.tryAcquire()){
      return "hi spring boot!";
   }else {  //限流后返回
      return "request rateLimit!";
   }
}

上面的示例展示了单机限流的操作,当每秒请求大于 100 时就会限流。对于分布式的应用限流则需要进行改造。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。