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

设计一个高并发的Web服务接口,比如360安全卫士的“实时威胁扫描”接口,需要支持每秒数千次请求,请设计系统架构,包括限流、熔断、降级、缓存、数据库分库分表等。

360Web服务端开发工程师难度:中等

答案

1) 【一句话结论】为高并发Web服务(如实时威胁扫描接口)设计时,需采用分层架构(网关-服务治理-业务-缓存-数据库),结合限流(控制入口流量)、熔断(保护内部服务)、降级(降级非核心功能)、缓存(提升热点数据效率)、数据库分库分表(水平扩展存储),通过技术手段平衡性能与稳定性,确保每秒数千次请求的响应能力。

2) 【原理/概念讲解】

  • 限流:控制请求进入系统的速率,防止流量冲击。类比“交通红绿灯”,限制每秒通过的车辆数,避免系统拥堵。常见算法有令牌桶(允许一定速率的请求,超出则排队)和漏桶(固定速率流出,超出丢弃)。
  • 熔断:服务故障时自动断开请求,避免级联故障。类比“保险丝”,电流过大时熔断,保护电路。触发条件通常包括错误率、响应时间等,断开后进入“半开”状态,逐步恢复。
  • 降级:故障时暂时关闭非核心功能,保证核心功能可用。类比“手机断网时视频播放降级为显示图片”,保证通话功能正常。
  • 缓存:将热点数据存储在内存中,减少数据库访问。类比“本地仓库”,用户频繁购买的商品放在仓库入口,快速取用,减少去仓库的次数。常用Redis,需考虑缓存穿透(空值查询)、雪崩(缓存失效批量查询)。
  • 数据库分库分表:将大表拆分为多个小表,水平扩展。类比“大仓库分成小仓库”,每个小仓库负责部分商品,提高存储和查询效率。常用ShardingSphere,需解决分片键选择、数据一致性等问题。

3) 【对比与适用场景】

概念定义特性使用场景注意点
限流控制请求进入系统的速率限制入口流量,防止过载高并发场景(如秒杀、实时扫描)位置通常在网关或API网关,需合理设置阈值
熔断服务故障时自动断开请求保护内部服务,避免级联内部服务依赖多、易故障的场景阈值设置需平衡故障检测和误触发
降级故障时关闭非核心功能保证核心功能可用系统故障时(如数据库慢)需明确核心/非核心功能边界

4) 【示例】(伪代码)

  • 限流实现(令牌桶):
    class RateLimiter:
        def __init__(self, rate, capacity):
            self.rate = rate  # 每秒令牌数
            self.capacity = capacity  # 令牌桶容量
            self.tokens = capacity
            self.last_check = time.time()
        
        def allow(self):
            now = time.time()
            elapsed = now - self.last_check
            self.tokens = min(self.capacity, self.tokens + elapsed * self.rate)
            self.last_check = now
            return self.tokens > 0
    
  • 缓存策略(Redis):
    # 缓存热点数据(如用户设备信息)
    SETNX user_device:12345 '{"id":12345, "device_type":"PC", "last_scan":1672531200}'
    GET user_device:12345
    
  • 数据库分库分表(ShardingSphere):
    假设威胁扫描记录表 threat_scan_log 按时间分片,分片键为 scan_time:
    -- 分库分表配置
    CREATE TABLE threat_scan_log (
        id BIGINT AUTO_INCREMENT,
        user_id BIGINT,
        scan_time TIMESTAMP,
        threat_count INT,
        scan_result JSON
    ) 
    SHARDING_KEY("scan_time") BINARY SORTED BROADCAST(3);  # 3个分片
    

5) 【面试口播版答案】
“面试官您好,针对高并发Web服务(如实时威胁扫描接口),我会从系统架构分层和关键技术点设计。首先,整体采用分层架构:前端用Nginx做负载均衡,API网关做请求路由和限流;服务治理层用Sentinel实现熔断、降级;业务层处理核心逻辑,通过Redis缓存热点数据(如用户设备信息),减少数据库压力;数据库层用分库分表(如按时间分片)水平扩展,提升读写性能。具体来说,限流采用令牌桶算法,控制每秒请求速率;熔断设置错误率阈值(如超过50%错误则断开),保护内部服务;降级时关闭非核心的实时通知功能,保证扫描核心逻辑可用;缓存用Redis,并加互斥锁防缓存穿透;数据库分库分表按时间维度拆分表,每个分片存储不同时间段的扫描记录,通过ShardingSphere管理。这样设计能确保系统支持每秒数千次请求,同时保证高可用和稳定性。”

6) 【追问清单】

  • 追问1:限流算法选择?
    回答要点:令牌桶比漏桶更平滑,适合突发流量;漏桶适合严格限制速率,避免突发。根据业务场景选择,比如实时扫描可能用令牌桶,因为允许一定程度的突发。
  • 追问2:熔断阈值如何设置?
    回答要点:通常基于错误率(如错误率超过阈值,如50%)或响应时间(如超过200ms),需根据服务依赖和业务容忍度调整,避免误触发或延迟恢复。
  • 追问3:缓存穿透/雪崩如何解决?
    回答要点:缓存穿透用布隆过滤器或空值缓存;缓存雪崩用随机过期时间或热点数据预热。
  • 追问4:分库分表策略?
    回答要点:分片键选择时间维度(如按月分片),避免热点数据集中;需考虑数据一致性和查询性能,比如通过ShardingSphere的读写分离和分片路由。
  • 追问5:监控指标?
    回答要点:监控QPS、响应时间、错误率、缓存命中率、数据库连接数等,通过Prometheus+Grafana等工具,及时发现问题。

7) 【常见坑/雷区】

  • 限流位置错误:限流放在业务层而非网关,导致流量控制失效。
  • 熔断误触发:阈值设置过严,正常波动被误判为故障,导致服务半开状态频繁切换。
  • 缓存未加互斥锁:高并发下缓存穿透导致大量数据库查询,引发雪崩。
  • 分库分表导致数据不一致:未考虑事务跨分片,导致数据不一致。
  • 降级策略不合理:降级非核心功能但影响用户体验,如实时威胁扫描降级为不显示详细报告,但用户仍需基本扫描结果。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1