51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

公司产品涉及高并发场景(如城市大脑在高峰时段处理海量请求),请设计一个限流和熔断的方案,确保系统在流量激增时仍能稳定运行,并说明如何监控和调整策略。

佳都科技助理产品经理/销售经理/产业服务销售专员难度:中等

答案

1) 【一句话结论】采用分层限流(入口限流+服务间限流)与熔断降级结合的策略,通过动态监控关键指标(如QPS、错误率、响应时间)自动调整限流阈值与熔断阈值,确保系统在高并发下稳定运行。

2) 【原理/概念讲解】
首先解释限流(Rate Limiting)——核心是控制请求进入系统的速率,防止系统资源被耗尽。类比“交通红绿灯”:红绿灯控制车流量,避免拥堵。常见算法有令牌桶(Token Bucket)和漏桶(Leaky Bucket)。

  • 令牌桶:允许突发流量,但需等待令牌生成(类似“绿灯亮起后车辆快速通过,之后需等待绿灯再次亮起”);
  • 漏桶:限制最大速率,类似“恒定流速的水管,无论上游来水多少,下游出水速率恒定”。
    然后解释熔断(Circuit Breaker)——当服务出现故障时,快速失败(返回错误或空结果),避免级联故障。类比“保险丝”:过载时断开电路,保护系统。熔断状态有三种:关闭(正常)、打开(故障时快速失败)、半开(尝试恢复)。

3) 【对比与适用场景】

特性限流(Rate Limiting)熔断(Circuit Breaker)
定义控制请求速率,防止系统过载服务故障时快速失败,避免级联故障
核心机制令牌桶/漏桶算法控制请求通过速率断路器状态机(关闭/打开/半开)控制调用
使用时机流量正常时,防止突发流量冲击服务故障时,快速失败,避免级联
注意点阈值需合理设置,避免误限流熔断后需恢复(半开状态),避免长期失效

4) 【示例】
假设服务A处理城市大脑请求,入口限流用令牌桶,服务间限流用漏桶,熔断用Hystrix(伪代码):

  • 入口限流(令牌桶):

    class TokenBucket:
        def __init__(self, capacity, rate):
            self.capacity = capacity
            self.rate = rate  # 每秒生成令牌数
            self.tokens = capacity
            self.last_time = time.time()
    
        def consume(self, n=1):
            now = time.time()
            elapsed = now - self.last_time
            self.tokens = min(self.capacity, self.tokens + elapsed * self.rate)
            self.last_time = now
            if self.tokens >= n:
                self.tokens -= n
                return True
            return False
    

    请求进入时,调用bucket.consume(),返回False则拒绝请求。

  • 服务间限流(漏桶):

    class LeakyBucket:
        def __init__(self, capacity, rate):
            self.capacity = capacity
            self.rate = rate  # 每秒漏出的令牌数
            self.tokens = capacity
            self.last_time = time.time()
    
        def consume(self, n=1):
            now = time.time()
            elapsed = now - self.last_time
            self.tokens = max(0, self.tokens - elapsed * self.rate)
            self.last_time = now
            if self.tokens >= n:
                self.tokens -= n
                return True
            return False
    

    服务间调用时,调用bucket.consume(),控制调用速率。

  • 熔断(Hystrix):

    @HystrixCommand(
        commandName = "cityBrainService",
        fallbackMethod = "fallbackMethod",
        executionTimeoutInMilliseconds = 1000,
        circuitBreakerRequestVolumeThreshold = 20, // 20次调用后评估
        circuitBreakerErrorThresholdPercentage = 50, // 50%错误率触发熔断
        circuitBreakerSleepWindowInMilliseconds = 5000 // 5秒后尝试半开
    )
    public String processRequest(String request) {
        // 服务逻辑
        if (someErrorCondition) {
            throw new RuntimeException("Service error");
        }
        return "success";
    }
    
    public String fallbackMethod(String request) {
        return "fallback response";
    }
    

    当调用次数达到阈值且错误率超过阈值时,熔断器打开,后续调用直接返回fallback结果。

5) 【面试口播版答案】
面试官您好,针对高并发场景的限流和熔断方案,我的核心思路是采用分层限流(入口+服务间)+ 熔断降级,结合动态监控调整策略。首先,限流方面,入口层用令牌桶算法控制请求速率,防止突发流量冲击;服务间调用用漏桶算法,限制服务间的调用速率,避免级联过载。然后,熔断机制,当服务出现故障时,快速失败,避免级联故障,熔断状态会动态调整(关闭/打开/半开)。监控方面,通过监控QPS、错误率、响应时间等指标,设置告警阈值,当指标异常时触发告警。策略调整上,根据监控数据动态调整限流阈值(比如高峰时段提高限流阈值)和熔断阈值(比如故障恢复后降低错误率阈值)。这样能确保系统在高并发下稳定运行。

6) 【追问清单】

  • 问题1:限流算法选择时,令牌桶和漏桶的区别是什么?如何根据场景选择?
    回答要点:令牌桶允许突发流量,适合有波峰的场景;漏桶限制恒定速率,适合需要严格速率控制的服务。根据业务需求,比如城市大脑高峰时段有突发流量,入口限流用令牌桶,服务间用漏桶。
  • 问题2:熔断的触发条件(如错误率、调用次数)如何设置?如何避免误触发?
    回答要点:触发条件需结合业务,比如调用次数阈值(如20次/秒)和错误率阈值(如50%)。避免误触发可通过设置合理的阈值,并配合监控验证。
  • 问题3:监控哪些关键指标?如何通过监控数据调整策略?
    回答要点:关键指标包括QPS、错误率、响应时间、熔断状态等。当QPS超过阈值时,调整限流阈值;当错误率上升时,触发熔断;当错误率下降时,恢复服务。
  • 问题4:服务降级与熔断的区别是什么?如何结合使用?
    回答要点:服务降级是主动降级非核心功能,熔断是被动故障时快速失败。两者结合,先熔断故障服务,再降级非核心功能,保障核心功能稳定。
  • 问题5:在高并发场景下,如何处理服务间的依赖关系?如何避免级联故障?
    回答要点:通过服务间限流(漏桶)控制调用速率,结合熔断快速失败,避免级联故障。同时,优化服务间调用链,减少依赖,提高系统韧性。

7) 【常见坑/雷区】

  • 坑1:混淆限流和熔断,只讲限流不提熔断,导致方案不完整。
  • 坑2:限流阈值设置不合理,比如过高导致正常流量被限流,过低无法应对突发流量。
  • 坑3:熔断阈值设置过严,导致正常波动触发熔断,影响服务可用性。
  • 坑4:未考虑监控和动态调整,方案静态,无法适应流量变化。
  • 坑5:服务间依赖关系未处理,只考虑单点限流,导致级联故障。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1