
1) 【一句话结论】采用分层限流(入口限流+服务间限流)与熔断降级结合的策略,通过动态监控关键指标(如QPS、错误率、响应时间)自动调整限流阈值与熔断阈值,确保系统在高并发下稳定运行。
2) 【原理/概念讲解】
首先解释限流(Rate Limiting)——核心是控制请求进入系统的速率,防止系统资源被耗尽。类比“交通红绿灯”:红绿灯控制车流量,避免拥堵。常见算法有令牌桶(Token Bucket)和漏桶(Leaky Bucket)。
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) 【追问清单】
7) 【常见坑/雷区】