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

描述你参与的一个高并发项目(如360广告投放系统),遇到的挑战及解决方案。

360Web服务端开发工程师-投放方向难度:中等

答案

1) 【一句话结论】在360广告投放系统高并发项目中,通过分库分表(单库QPS从5万降至1万)、缓存穿透优化(布隆过滤器+空值缓存,穿透率<1%)、请求限流(令牌桶限流至5万QPS),高峰期响应时间从2秒降至0.3秒,数据库压力降低80%,系统稳定性显著提升。

2) 【原理/概念讲解】老师会解释高并发场景下的压力来源。比如,系统在广告投放高峰期(每日18-22点),QPS达到10万,数据库连接池耗尽,响应时间超过2秒。关键技术点:

  • 分库分表:将广告数据按ID哈希分片到多个数据库,通过路由规则(如ShardingSphere的哈希分片)分散压力,单库压力从5万QPS降至1万QPS以下。
  • 缓存穿透:当查询不存在的广告ID时,所有请求直接访问数据库,导致数据库压力激增(类比:所有用户问“不存在的人”,服务端资源被耗尽)。
  • 请求限流:通过令牌桶算法限制请求速率,防止系统雪崩(类比:给水龙头装限流阀,避免瞬间大量水流冲坏管道)。

3) 【对比与适用场景】用要点说明:

  • 缓存穿透:定义是查询不存在的key,导致数据库全量查询;特性是请求无缓存命中,直接数据库;使用场景是恶意攻击或数据未初始化;注意点是需要布隆过滤器或空值缓存。
  • 缓存击穿:高频key缓存过期,大量请求同时访问数据库;特性是瞬间高并发;使用场景是热点数据未设置永不过期;注意点是预热或设置永不过期。
  • 缓存雪崩:大量key同时过期;特性是短时间内缓存失效;使用场景是缓存统一过期时间;注意点是随机过期或预热。

4) 【示例】缓存穿透解决方案伪代码(布隆过滤器+空值缓存+重试逻辑):

def get_ad_info(ad_id):
    # 布隆过滤器判断是否存在
    if not is_in_bloom_filter(ad_id):
        return None  # 直接返回,避免数据库查询
    # 缓存未命中
    info = redis.get(f"ad_info:{ad_id}")
    if info:
        return json.loads(info)
    # 数据库查询
    info = db.query("SELECT * FROM ads WHERE id = ?", ad_id)
    if info:
        redis.set(f"ad_info:{ad_id}", json.dumps(info), ex=3600)
        return info
    # 存空值缓存,防止后续穿透
    redis.set(f"ad_id:{ad_id}", "", ex=60)
    return None
# 空值缓存过期后处理(假设有监控触发重试)
def handle_cache_miss(ad_id):
    if redis.get(f"ad_id:{ad_id}") == "":
        # 触发重试逻辑,比如再次布隆过滤器判断或直接数据库(带降级)
        info = db.query("SELECT * FROM ads WHERE id = ? FOR UPDATE", ad_id) # 降级处理
        if info:
            redis.set(f"ad_info:{ad_id}", json.dumps(info), ex=3600)
            return info
        return None

布隆过滤器实现:位数组大小为2^16,3个hash函数(如murmurhash3),误判率约1%。

5) 【面试口播版答案】“我参与的是360广告投放系统的高并发项目。当时遇到的挑战是系统在投放高峰期(比如每日广告点击高峰),QPS达到10万,数据库连接池耗尽,响应时间超过2秒。具体来说,缓存穿透问题比较突出——当查询不存在的广告ID时,所有请求都直接访问数据库,导致数据库压力激增。解决方案上,我们做了三方面优化:一是通过布隆过滤器快速判断key是否存在,避免无效数据库查询;二是对于高频查询的key,设置永不过期或预热机制;三是采用分库分表策略,将广告数据按ID哈希分片到多个数据库,单库压力降低80%以上。同时引入请求限流,通过令牌桶算法限制每秒请求量,防止系统雪崩。这些措施实施后,系统在高峰期的响应时间从原来的2秒降至0.3秒,数据库压力降低80%,系统稳定性显著提升。”

6) 【追问清单】

  • 问题1:分库分表后的数据一致性如何保障?
    回答要点:采用最终一致性,通过消息队列(如Kafka)异步同步数据变更,或使用分布式事务(如两阶段提交,但高并发下用补偿机制)。
  • 问题2:空值缓存过期后仍可能穿透的应对?
    回答要点:空值缓存设置短时间过期(如60秒),若再次穿透则触发重试逻辑,或增加布隆过滤器判断。
  • 问题3:令牌桶的参数配置?
    回答要点:令牌生成速率1000个/秒,桶大小1000,超过则拒绝请求。
  • 问题4:分库分表的具体实现方式?
    回答要点:使用哈希分片,根据ad_id的哈希值选择数据库,通过路由规则(如ShardingSphere的Sharding-规则)实现数据分片。
  • 问题5:缓存穿透的布隆过滤器误判率如何控制?
    回答要点:位数组大小为2^16,3个hash函数,误判率约1%,通过调整位数组大小和hash函数数量控制。

7) 【常见坑/雷区】

  • 坑1:只说概念不提具体技术细节(如只说“用了缓存”,而不说“用了布隆过滤器+空值缓存”)。
  • 坑2:解决方案不具体(如只说“优化数据库”,而不说“通过分库分表降低压力”)。
  • 坑3:忽略监控和测试(如没提到性能测试或监控指标)。
  • 坑4:没提到高并发下的数据一致性(如分库分表后的数据一致性如何保证)。
  • 坑5:缓存穿透的解决方案没考虑空值缓存,导致后续请求仍穿透。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1