
1) 【一句话结论】在双11大促中,通过分布式令牌桶限流(Redis实现)、熔断降级、动态业务降级组合策略,成功将核心接口QPS提升至2500,错误率从3%降至0.2%,保障系统在高并发下稳定运行。
2) 【原理/概念讲解】老师会解释关键技术原理:
SETNX)确保分布式环境下令牌桶状态一致性,避免竞态条件。3) 【对比与适用场景】用表格对比策略:
| 策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 分布式令牌桶 | 通过Redis共享状态实现全局限流,按固定速率生成令牌 | 允许短时间突发流量,平滑处理 | 核心接口(如订单创建、支付)限流 | 需确保Redis高可用,避免状态丢失 |
| 熔断 | 服务失败率超阈值时暂时拒绝请求 | 防止故障扩散,避免雪崩 | 服务依赖场景(如调用第三方支付) | 阈值需根据业务容忍度设置,恢复需逐步进行 |
| 降级 | 关闭非核心功能,保证核心业务 | 保障核心体验,减少资源消耗 | 高并发场景(如非核心优惠券核销) | 优先级需按业务重要性排序,避免误伤核心功能 |
4) 【示例】(Redis令牌桶实现伪代码):
import redis
import time
class DistributedTokenBucket:
def __init__(self, redis_client, bucket_key, capacity, rate, interval=1):
self.redis = redis_client
self.bucket_key = bucket_key
self.capacity = capacity
self.rate = rate # 令牌生成速率(令牌/秒)
self.interval = interval # 时间窗口(秒)
def consume(self, tokens=1):
# 计算当前时间窗口内的剩余令牌数
now = time.time()
# 获取当前时间窗口的开始时间(向下取整)
window_start = int(now / self.interval) * self.interval
# 计算当前时间窗口内应生成的令牌数
tokens_generated = (now - window_start) * self.rate
# 获取当前令牌数(Redis原子操作)
current_tokens = self.redis.get(f"{self.bucket_key}:tokens")
if current_tokens is None:
current_tokens = self.capacity
else:
current_tokens = int(current_tokens)
# 计算可用的令牌数
available_tokens = min(self.capacity, current_tokens + tokens_generated)
if available_tokens >= tokens:
# 原子减去令牌
self.redis.set(f"{self.bucket_key}:tokens", available_tokens - tokens)
return True
return False
# 示例:订单接口限流,每秒生成10个令牌,桶容量100
redis_client = redis.Redis(host='localhost', port=6379)
bucket = DistributedTokenBucket(redis_client, "order_bucket", capacity=100, rate=10)
if bucket.consume():
process_order()
else:
reject_request()
5) 【面试口播版答案】面试官您好,我参与过双11订单处理系统的高并发优化,核心是通过分布式令牌桶限流(Redis实现)、熔断降级、动态业务降级组合策略保障稳定。具体来说:
6) 【追问清单】:
SETNX)确保分布式环境下令牌桶状态一致性,避免竞态条件。7) 【常见坑/雷区】: