
1) 【一句话结论】
采用分层微服务架构,结合Nginx的加权轮询负载均衡、Redis的缓存策略(LRU淘汰+缓存预热)、MySQL分库分表(用户ID哈希分库+业务类型分表+读写分离),前端用WebRTC实时传输语音,后端接入层处理请求分发,业务层处理语音识别、语义理解,数据层缓存热点数据并持久化,保障百万级并发下的低延迟与高可用。
2) 【原理/概念讲解】
老师会先解释“高并发语音交互”的核心挑战:百万级用户同时请求时,需解决请求分发效率、实时处理能力、数据一致性问题。
3) 【对比与适用场景】
| 技术选型 | 定义/特性 | 使用场景 | 注意点 |
|---|---|---|---|
| 前端:WebRTC | 实时音视频传输协议,低延迟(QoS保障) | 语音数据实时传输(如智能音箱) | 需支持浏览器/设备原生API,网络抖动会影响传输质量 |
| 后端框架:Spring Cloud | 微服务生态(负载均衡、服务发现) | 微服务集群部署,服务间调用 | 需配置Nginx/Consul等组件,服务间通信需限流 |
| 数据库:Redis | 内存型NoSQL,支持缓存、消息队列 | 热点数据缓存(如用户配置、热门对话模板)、会话管理 | 数据持久化需配合RDBMS(如Redis持久化),避免数据丢失 |
| 数据库:MySQL | 关系型数据库,支持事务 | 业务数据持久化(如用户信息、对话记录) | 需分库分表处理百万级数据,读写分离需配置主从复制 |
4) 【示例】
{
"type": "voice",
"data": "base64编码的语音数据(如用户说“打开灯”的音频)",
"timestamp": "2023-10-27T10:00:00Z",
"user_id": "user_123"
}
# 接入层(Nginx加权轮询分发请求)
def handle_voice_request(request):
# Nginx根据服务器负载选择后端节点(如节点1负载50%,节点2负载30%)
backend_node = load_balancer.select_node_by_weight()
# WebSocket接收语音数据
voice_data = websocket.receive(request)
# 业务层(调用ASR与NLU)
def process_voice(voice_data):
# 调用ASR服务(科大讯飞API)
text = asr_service.transcribe(voice_data)
# 调用NLU服务解析意图
intent = nlu_service.parse(text)
# 调用业务逻辑服务处理
result = business_service.handle(intent)
return result
# 数据层(缓存与数据库)
def save_result(result, user_id):
# 缓存预热(初始化时加载用户常用数据)
redis.set(f"user_{user_id}_config", {"light_on": True}, expire=3600)
# 热点数据缓存(减少数据库压力)
redis.set(f"user_{user_id}_result", result, expire=60)
# 持久化到分库分表MySQL
mysql.insert("user_results", {"user_id": user_id, "result": result})
5) 【面试口播版答案】
“面试官您好,针对百万级并发语音交互产品,我的系统架构设计核心是分层微服务架构+动态负载均衡+分层缓存,保障高并发下的低延迟与高可用。
前端采用WebRTC实时传输语音,后端接入层通过Nginx的加权轮询分发请求(根据服务器负载优化请求分配),业务层调用科大讯飞的ASR和NLU服务处理语音,数据层用Redis缓存热点数据(如用户配置、对话结果),并持久化到分库分表的MySQL中。核心组件职责明确:负载均衡器提升请求分发效率,ASR服务转语音为文本,NLU解析意图,业务逻辑处理具体请求,缓存减少数据库压力,整体架构能支撑百万级并发,同时保证实时交互体验。”
6) 【追问清单】
7) 【常见坑/雷区】