高并发中的限流策略

在互联网时代,随着用户数量的激增和业务需求的不断扩展,我们的应用程序经常面临高并发的挑战。高并发环境下,服务器需要处理大量的请求,这就需要我们采取一些策略来保护系统不被过多的请求所压垮。限流,就是其中一种非常重要的策略。

什么是限流?

限流,简单来说,就是限制在一定时间内可以处理的请求数量。这就好比是一条高速公路,虽然可以容纳很多车辆,但如果车辆过多,就会造成拥堵,甚至发生事故。限流的目的就是确保我们的服务器能够稳定运行,避免因为请求过多而导致的系统崩溃。

常见的限流方式

1. 计数器法

计数器法是一种简单直观的限流方式。我们可以设置一个计数器,每当有请求进来时,计数器就加一,当计数器达到设定的阈值时,就拒绝新的请求。

示例代码:
public class CounterRateLimiter {
    private int limit = 100; // 允许的最大请求数
    private AtomicInteger count = new AtomicInteger(0);

    public boolean isAllowed() {
        int currentCount = count.incrementAndGet();
        if (currentCount > limit) {
            count.decrementAndGet(); // 请求超过限制
            return false; // 拒绝请求
        }
        return true; // 允许请求
    }
}

2. 漏桶算法

漏桶算法是一种更加平滑的限流方式。它通过一个固定容量的桶来控制请求的速率,请求就像是水,以固定的速率从桶中漏出。

示例代码:
public class LeakyBucketRateLimiter {
    private int capacity = 100; // 桶的容量
    private long leakRate = 1; // 每秒漏出的水量
    private long lastLeakTime = System.currentTimeMillis();

    public boolean isAllowed() {
        long currentTime = System.currentTimeMillis();
        long leakedAmount = (currentTime - lastLeakTime) / 1000 * leakRate;
        capacity = Math.max(0, capacity - leakedAmount);
        lastLeakTime = currentTime;

        if (capacity > 0) {
            capacity--; // 允许请求
            return true;
        }
        return false; // 拒绝请求
    }
}

3. 令牌桶算法

令牌桶算法与漏桶算法类似,但它允许请求以突发的方式进行。它通过一个令牌桶来控制请求的速率,桶中存放着一定数量的令牌,请求需要消耗令牌才能被处理。

示例代码:
public class TokenBucketRateLimiter {
    private int capacity = 100; // 桶的容量
    private int tokens = capacity; // 初始令牌数
    private long refillInterval = 1000; // 令牌的填充间隔

    public boolean isAllowed() {
        long currentTime = System.currentTimeMillis();
        if (tokens == 0) {
            return false; // 没有令牌,拒绝请求
        }

        tokens--; // 消耗一个令牌
        return true; // 允许请求
    }

    public void refill() {
        long currentTime = System.currentTimeMillis();
        if (currentTime - refillInterval >= lastRefillTime) {
            tokens = Math.min(capacity, tokens + 1); // 填充令牌
            lastRefillTime = currentTime;
        }
    }
}

应用限流策略

在 Spring Boot 中,我们可以使用@RateLimiter注解来轻松地应用限流策略。

示例代码:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RateLimiter;

@RestController
public class RateLimitController {

    @GetMapping("/rate-limited")
    @RateLimiter(limit = 10, capacity = 100, refillInterval = 1000)
    public String rateLimitedEndpoint() {
        return "Hello, this is a rate-limited endpoint!";
    }
}

结语

限流是高并发系统中不可或缺的一部分,它可以帮助我们保护系统免受过多请求的冲击。通过上述的几种限流方式,我们可以根据自己的业务需求选择合适的限流策略。记住,限流不仅仅是为了保护系统,更是为了提供更好的用户体验。希望这篇文章能够帮助大家轻松理解并掌握高并发中的限流方式。


在这里插入图片描述

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源梦倩影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值