Java 面试题
目录

Java 中什么是限流?

· 约 3 分钟读完 · 第 234 / 274 章

推荐答案

限流(Rate Limiting)是一种用于控制系统中请求流量的技术,目的是防止系统因过载而崩溃。通过限制单位时间内允许通过的请求数量,限流可以保护系统资源,避免因突发流量导致的性能下降或服务不可用。

在Java中,常见的限流算法包括:

  1. 计数器算法:通过记录单位时间内的请求数量,超过阈值则拒绝请求。
  2. 滑动窗口算法:在计数器算法的基础上,将时间窗口划分为更小的区间,实现更精确的流量控制。
  3. 漏桶算法:以固定的速率处理请求,超出容量的请求会被丢弃或排队。
  4. 令牌桶算法:以固定的速率生成令牌,请求需要获取令牌才能被处理,没有令牌则拒绝请求。

本题详细解读

1. 限流的作用

限流主要用于保护系统,避免因突发流量或恶意攻击导致系统资源耗尽。例如:

  • 防止API被滥用。
  • 保护数据库、缓存等关键资源。
  • 确保系统在高并发场景下的稳定性。

2. 常见的限流算法

2.1 计数器算法

  • 原理:统计单位时间内的请求数量,超过阈值则拒绝请求。
  • 优点:实现简单。
  • 缺点:无法应对突发流量,可能导致流量不均匀。

2.2 滑动窗口算法

  • 原理:将时间窗口划分为多个小窗口,统计每个小窗口的请求数量,动态调整限流策略。
  • 优点:比计数器算法更精确,能更好地应对突发流量。
  • 缺点:实现复杂度较高。

2.3 漏桶算法

  • 原理:请求以固定速率被处理,超出容量的请求会被丢弃或排队。
  • 优点:流量输出平稳,适合处理突发流量。
  • 缺点:无法应对突发请求的快速处理需求。

2.4 令牌桶算法

  • 原理:以固定速率生成令牌,请求需要获取令牌才能被处理,没有令牌则拒绝请求。
  • 优点:允许一定程度的突发流量,灵活性高。
  • 缺点:实现复杂度较高。

3. Java中的限流实现

在Java中,可以使用以下工具或框架实现限流:

  • Guava RateLimiter:基于令牌桶算法,提供简单的API实现限流。
  • Resilience4j:提供丰富的限流、熔断等功能,适合微服务场景。
  • 自定义实现:根据业务需求,结合上述算法实现限流逻辑。

4. 示例代码(Guava RateLimiter)

5. 限流的应用场景

  • API网关:限制客户端对API的调用频率。
  • 微服务架构:保护服务实例不被过载。
  • 分布式系统:防止某个节点因流量过大而崩溃。

通过合理使用限流技术,可以有效提升系统的稳定性和可靠性。