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

设计一个为360安全卫士等客户端提供AI模型在线推理的Web服务端,要求支持百万级并发请求,请描述系统架构,包括负载均衡策略、缓存设计、降级与熔断机制,以及如何保证服务高可用性。

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

答案

1) 【一句话结论】
采用微服务+容器化(K8s)架构,通过Nginx多策略负载均衡、布隆过滤器+多级缓存、动态熔断降级及多机房高可用,支撑百万级并发AI模型在线推理服务的高性能与稳定性。

2) 【原理/概念讲解】

  • 负载均衡:Nginx作为反向代理,采用IP哈希(根据客户端IP计算哈希值,映射到后端实例,保证同一客户端请求同一实例,减少会话不一致风险)与加权轮询(根据服务器CPU/内存使用率动态调整权重,负载高的实例分配更多请求),结合session_affinity(可选,若模型服务需会话一致性),实现请求分发均衡。
  • 缓存设计:三级缓存,CDN缓存静态模型文件(如模型权重文件,减少后端带宽与存储压力);布隆过滤器(前置缓存,快速判断热点key是否存在,降低Redis压力);Redis缓存热点推理结果(如常用模型(如病毒扫描)的推理结果,设置合理TTL并预热);本地缓存(模型参数,减少数据库访问)。
  • 降级与熔断:当模型服务超时(如超过5秒)或错误率(如连续10次错误)超过阈值,触发熔断,降级为默认模型(如轻量模型)或返回缓存结果,避免级联故障;熔断阈值动态调整,基于Prometheus监控指标(如请求延迟、错误率),每分钟更新一次阈值。
  • 高可用:多机房部署(主备机房,通过DNS切换),数据库读写分离(主库写,从库读,通过ShardingSphere或MySQL主从),模型服务容器化(K8s Deployment设置CPU/内存请求与限制,如每个Pod 4核8G,通过Service负载均衡实现资源隔离与弹性伸缩)。

3) 【对比与适用场景】

  • 负载均衡策略对比:
    策略定义特性使用场景注意点
    IP哈希根据客户端IP计算哈希值,映射到后端实例长期绑定,会话一致性高并发,需会话一致性(如模型推理结果需与客户端关联)客户端IP变化(如移动网络切换)会导致实例切换
    加权轮询根据服务器负载(CPU/内存)设置权重,按权重分发负载均衡,动态调整服务器性能差异大,需根据实际负载分配需实时监控负载,避免权重计算延迟
    轮询按顺序分发请求到后端实例简单公平低并发,服务器性能一致可能导致热点服务器负载过高
  • 消息队列选择对比:
    队列优点缺点适用场景
    Kafka高吞吐(百万级),持久化,支持流处理延迟较高(秒级),资源消耗大异步处理,如模型训练结果同步,百万级并发消息积压
    RabbitMQ延迟低(毫秒级),支持多种消息模式吞吐量低于Kafka,持久化成本高小规模并发,需精确消息投递

4) 【示例】

  • 请求示例:GET /api/infer?model=antivirus&data=base64_encoded_data
  • 流程:
    1. 客户端请求 → Nginx负载均衡(IP哈希) → 后端服务实例A。
    2. 后端检查布隆过滤器(布隆过滤器判断key是否存在,若不存在,跳过Redis)。
    3. 检查Redis缓存(key为model:antivirus:${hash(data)}),若存在,直接返回结果。
    4. 若缓存未命中,调用熔断器(检查当前熔断状态,若未熔断,调用模型服务;若熔断,降级为默认模型或返回缓存结果)。
    5. 模型服务(如TensorFlow Serving)处理请求,返回结果。
    6. 后端将结果存入Redis(TTL=3600秒)并返回给客户端。
  • 伪代码(后端服务,Python示例):
    def infer(model_id, data):
        key = f"model:{model_id}:{hash(data)}"
        # 布隆过滤器预过滤
        if not bloom_filter.contains(key):
            return "缓存未命中,且布隆过滤器过滤"
        # 检查Redis
        result = redis.get(key)
        if result:
            return json.loads(result)
        # 熔断判断
        if circuit_breaker.is_open():
            return "熔断降级,返回默认模型结果"
        try:
            # 调用模型服务
            model_result = model_service.predict(data)
            redis.setex(key, 3600, json.dumps(model_result))
            return model_result
        except Exception as e:
            # 触发熔断
            circuit_breaker.record_error()
            if circuit_breaker.is_threshold_reached():
                circuit_breaker.open()
            return "模型服务错误"
    

5) 【面试口播版答案】
面试官您好,针对百万级并发AI模型推理服务,我设计的系统核心是微服务+容器化(K8s)架构,通过Nginx多策略负载均衡、布隆过滤器+多级缓存、动态熔断降级及多机房高可用,保障服务性能与稳定性。首先,负载均衡用Nginx的IP哈希(保证客户端请求同一实例,避免会话不一致)与加权轮询(根据服务器负载动态调整权重),实现请求分发均衡。缓存分三级:CDN缓存静态模型文件,布隆过滤器前置过滤热点key,Redis缓存热点推理结果(TTL 1小时并预热),本地缓存模型参数。降级与熔断机制,当模型服务超时(5秒)或错误率(连续10次错误)超过阈值,触发熔断,降级为默认模型或返回缓存结果。高可用方面,多机房部署(主备切换),数据库读写分离,模型服务通过K8s Deployment设置CPU/内存配额(如每个Pod 4核8G),通过Service负载均衡实现资源隔离。这样能支撑百万级并发,同时保证服务不中断。

6) 【追问清单】

  • 问:如何解决缓存击穿问题?
    回答要点:在Redis前增加布隆过滤器,快速判断热点key是否存在,减少缓存查询压力;同时设置缓存TTL并预热,避免热点key同时过期。
  • 问:熔断的阈值(如超时次数、错误率)如何动态调整?
    回答要点:基于Prometheus监控指标,如请求延迟超过3秒或错误率超过50%,触发熔断;阈值每分钟更新一次,适应系统负载变化。
  • 问:模型更新时如何保证服务不中断?
    回答要点:采用版本控制,灰度发布(先发布到10%服务器,验证后全量上线),或TensorFlow Serving的热更新(动态替换模型文件,无需重启服务)。
  • 问:如何处理模型推理的异步任务?
    回答要点:使用Kafka作为消息队列,将请求放入队列,模型服务异步处理,避免阻塞主线程;消息积压时,自动扩容队列消费者或丢弃旧消息(根据业务重要性)。
  • 问:如何监控服务性能?
    回答要点:使用Prometheus+Grafana监控请求延迟、错误率、服务器负载,结合ELK分析日志,定位性能瓶颈或故障点。

7) 【常见坑/雷区】

  • 负载均衡策略选错:如用轮询导致热点服务器,应选择IP哈希或加权轮询,避免服务器过载。
  • 缓存击穿未解决:若未加布隆过滤器,热点key同时过期会导致Redis压力激增,应前置布隆过滤器。
  • 熔断阈值静态设置:若阈值固定,可能无法适应系统负载变化,应动态调整,基于监控指标。
  • 模型服务资源未隔离:若模型服务资源不足,会导致整体性能下降,应通过K8s配额限制资源,避免资源争抢。
  • 消息队列选择不当:如用RabbitMQ处理百万级并发,吞吐量不足,应选择Kafka,保证消息处理能力。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1