面试官:高并发系统为什么要限流?很多人答错

张开发
2026/4/7 21:35:47 15 分钟阅读

分享文章

面试官:高并发系统为什么要限流?很多人答错
在Java面试中高并发系统设计是高频考点尤其是限流机制。很多面试者在回答“为什么要限流”时只停留在表面缺乏系统理解。本文将结合原理、代码示例及实际应用带你完整理解高并发系统的限流策略。一、问题背景在互联网业务中尤其是电商、支付、秒杀系统高并发访问非常常见。如果没有有效控制系统可能面临以下风险系统崩溃短时间请求量超过服务器处理能力会导致线程阻塞、内存耗尽甚至宕机。服务质量下降请求响应变慢用户体验差。数据库压力大瞬时高并发可能导致数据库连接池耗尽产生死锁或拒绝服务。连锁故障下游依赖系统也会被拖垮形成雪崩效应。我整理了一套完整Java面试题库完整版在我的技术站https://myquotego.com/html/questions?_fromcsdn_123_1因此在高并发场景下限流是保障系统稳定、提升服务质量的核心手段。二、技术原理解析限流顾名思义就是控制单位时间内允许通过的请求数量。常见原理和算法有1. 计数器Counter原理在固定时间窗口内统计请求数超过阈值拒绝或排队。特点简单易实现精度有限固定窗口可能出现瞬时突发流量溢出算法示意1秒内允许1000请求 - 请求到达时计数器 1 - 计数器 1000 → 拒绝请求 - 每秒重置计数器2. 滑动窗口Sliding Window原理将固定时间窗口拆分成多个小窗口统计最近一段时间的请求总数。特点避免固定窗口的“瞬时爆发”问题精度更高但实现稍复杂3. 漏桶Leaky Bucket原理请求进入“桶”以固定速率处理超过桶容量则丢弃。特点平滑流量防止突发流量冲击适合处理突发高峰但会丢弃部分请求4. 令牌桶Token Bucket原理系统按固定速率生成令牌请求需获取令牌才能执行。特点支持突发流量令牌未用完可以一次性处理突发请求广泛用于网关、接口限流5. 结合分布式限流在微服务或分布式系统中单机限流不足需要结合Redis、Zookeeper 或布隆过滤器实现全局限流。我整理了一套完整Java面试题库完整版在我的技术站https://myquotego.com/html/questions?_fromcsdn_123_1三、代码示例下面用 Java 演示几种限流实现方式。1. 基于计数器的简单限流importjava.util.concurrent.atomic.AtomicInteger;publicclassCounterLimiter{privatefinalintmaxRequests;privatefinalAtomicIntegercounternewAtomicInteger(0);publicCounterLimiter(intmaxRequests){this.maxRequestsmaxRequests;// 每秒重置计数器newThread(()-{while(true){try{Thread.sleep(1000);counter.set(0);}catch(InterruptedExceptione){e.printStackTrace();}}}).start();}publicbooleantryAcquire(){returncounter.incrementAndGet()maxRequests;}publicstaticvoidmain(String[]args){CounterLimiterlimiternewCounterLimiter(5);for(inti0;i10;i){if(limiter.tryAcquire()){System.out.println(请求被允许);}else{System.out.println(请求被拒绝);}}}}2. 基于 Guava 的令牌桶importcom.google.common.util.concurrent.RateLimiter;publicclassGuavaRateLimiterExample{publicstaticvoidmain(String[]args){RateLimiterlimiterRateLimiter.create(2);// 每秒2个请求for(inti0;i5;i){limiter.acquire();System.out.println(请求执行时间System.currentTimeMillis());}}}3. Redis 分布式限流Lua 脚本// Redis key: api:limit:user:123StringluaScript local key KEYS[1] local limit tonumber(ARGV[1]) local current tonumber(redis.call(get, key) or 0) if current 1 limit then return 0 else redis.call(INCR, key) redis.call(EXPIRE, key, 1) return 1 end ;四、实际应用场景电商秒杀限流可防止流量瞬间冲垮库存系统结合排队或异步处理可保障秒杀公平。支付系统防止同一接口被频繁调用导致资金冻结或重复扣款。API 网关多租户限流、全局限流保障下游服务稳定。微服务架构服务间调用通过分布式限流避免雪崩和级联故障。我整理了一套完整Java面试题库完整版在我的技术站https://myquotego.com/html/questions?_fromcsdn_123_1五、总结高并发系统为什么要限流核心原因可以归纳为三点保障系统稳定性避免超负荷崩溃。保证用户体验平滑请求降低响应延迟。防止下游雪崩数据库、缓存、微服务稳定运行。在面试中如果能结合原理、算法和实战案例回答不仅显得专业还能展示你的系统设计能力。关注我持续更新Java面试核心知识。

更多文章