
1) 【一句话结论】
采用微服务+容器化(K8s)架构,通过Nginx多策略负载均衡、布隆过滤器+多级缓存、动态熔断降级及多机房高可用,支撑百万级并发AI模型在线推理服务的高性能与稳定性。
2) 【原理/概念讲解】
3) 【对比与适用场景】
| 策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| IP哈希 | 根据客户端IP计算哈希值,映射到后端实例 | 长期绑定,会话一致性 | 高并发,需会话一致性(如模型推理结果需与客户端关联) | 客户端IP变化(如移动网络切换)会导致实例切换 |
| 加权轮询 | 根据服务器负载(CPU/内存)设置权重,按权重分发 | 负载均衡,动态调整 | 服务器性能差异大,需根据实际负载分配 | 需实时监控负载,避免权重计算延迟 |
| 轮询 | 按顺序分发请求到后端实例 | 简单公平 | 低并发,服务器性能一致 | 可能导致热点服务器负载过高 |
| 队列 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Kafka | 高吞吐(百万级),持久化,支持流处理 | 延迟较高(秒级),资源消耗大 | 异步处理,如模型训练结果同步,百万级并发消息积压 |
| RabbitMQ | 延迟低(毫秒级),支持多种消息模式 | 吞吐量低于Kafka,持久化成本高 | 小规模并发,需精确消息投递 |
4) 【示例】
GET /api/infer?model=antivirus&data=base64_encoded_datamodel:antivirus:${hash(data)}),若存在,直接返回结果。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) 【追问清单】
7) 【常见坑/雷区】