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

描述一个你参与过的处理高并发的大促系统(如双11),具体做了什么技术方案,比如限流策略(令牌桶/漏桶)、熔断、降级,以及效果如何(如系统QPS提升、错误率降低)。

Tencent软件开发-后台开发方向难度:中等

答案

1) 【一句话结论】在双11大促中,通过分布式令牌桶限流(Redis实现)、熔断降级、动态业务降级组合策略,成功将核心接口QPS提升至2500,错误率从3%降至0.2%,保障系统在高并发下稳定运行。

2) 【原理/概念讲解】老师会解释关键技术原理:

  • 分布式限流(令牌桶):在高并发场景下,单机限流无法应对分布式请求,需通过Redis实现共享状态。令牌桶按固定速率生成令牌(如每秒10个令牌),请求需获取令牌才能进入队列。Redis的原子操作(如SETNX)确保分布式环境下令牌桶状态一致性,避免竞态条件。
  • 熔断:当调用第三方服务(如支付、库存)失败率超过阈值(如50%),熔断器“打开”,暂时拒绝请求,避免故障扩散(类似电路保险丝,故障时断开电路)。
  • 降级:系统压力过大时,关闭非核心功能(如优惠券核销展示),保证核心业务(支付)可用(类似医院急诊分流,优先保障核心资源)。

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实现)、熔断降级、动态业务降级组合策略保障稳定。具体来说:

  • 采用分布式令牌桶限流,控制核心接口QPS在2000-2500左右,通过Redis共享状态确保全局限流,避免单点限流失效。
  • 当调用第三方支付服务失败率超50%时,触发熔断,暂时停止调用,避免故障扩散。
  • 对非核心的优惠券核销功能降级,关闭展示,保证核心支付流程。
    实施后,系统QPS从1000提升至2500,错误率从3%降至0.2%,成功支撑峰值流量。

6) 【追问清单】:

  • 问:分布式限流为什么用Redis实现令牌桶,而不是本地实现?
    答:高并发下单机限流无法应对分布式请求,Redis的原子操作(如SETNX)确保分布式环境下令牌桶状态一致性,避免竞态条件。
  • 问:限流参数(容量、速率)如何动态调整?
    答:通过实时监控QPS和系统负载,当QPS接近阈值时,动态增加令牌生成速率或桶容量,避免限流过严或过松。
  • 问:熔断恢复机制如何设计?
    答:采用“半开状态”(Hystrix的半开模式),先允许少量请求通过,若失败率低于阈值则逐步开放,否则关闭。
  • 问:如何验证限流效果?
    答:通过双11前压测工具模拟高并发,记录QPS和错误率变化,对比限流前后的数据,确保效果符合预期。

7) 【常见坑/雷区】:

  • 分布式限流状态不一致:若Redis不可用或网络延迟,可能导致限流失效,需确保Redis高可用。
  • 熔断阈值设置不当:阈值过低会导致频繁熔断,影响业务;阈值过高则无法及时响应故障,需根据业务容忍度调整。
  • 降级范围过窄:未覆盖所有非核心功能,可能影响用户体验,需按业务重要性排序降级。
  • 限流参数静态设置:未考虑实时流量变化,导致限流过严或过松,需动态调整参数。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1