
1) 【一句话结论】百万级实时互动课堂系统需采用分布式架构,结合WebRTC实现音视频低延迟传输,通过CDN/边缘计算减少网络延迟,用消息队列处理实时互动,核心是解耦、分层设计以支撑大规模并发和低延迟。
2) 【原理/概念讲解】
要解决百万用户同时在线的实时互动问题,需从音视频传输、网络延迟、实时互动消息三方面入手:
3) 【对比与适用场景】
| 组件/技术 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| WebRTC | 基于P2P的音视频通信技术 | 低延迟,端到端,无需插件 | 实时音视频传输(课堂直播) | 需P2P连接,网络不稳定时切换中转 |
| CDN/边缘计算 | 分布式内容分发网络,缓存内容到边缘节点 | 减少跳数,降低延迟 | 视频流分发,用户访问静态资源 | 动态内容需回源,需动态更新缓存 |
| 消息队列(Kafka) | 分布式消息系统,解耦生产者与消费者 | 高吞吐,持久化,顺序保证 | 实时互动消息(举手、答题) | 需考虑消息顺序与延迟,避免死锁 |
| 负载均衡(Nginx) | 分发请求到多服务器 | 提高系统可用性,避免过载 | 用户请求分发 | 需根据请求类型(如视频/互动)动态路由 |
4) 【示例】
用户“user123”在课堂“class101”中举手,流程伪代码:
前端(浏览器)通过WebSocket发送请求:
{
"userId": "user123",
"action": "raiseHand",
"classId": "class101"
}
后端接收后写入Kafka主题(如“class101_interactions”),消费者读取并更新课堂状态:
// 消费Kafka消息
const msg = await kafkaConsumer.consume("class101_interactions");
const classroom = await db.get("classroom", msg.classId);
classroom.users[msg.userId].isHandRaised = true;
await db.save(classroom);
// 通过WebSocket广播给其他用户
wsServer.broadcastToClassroom(msg.classId, {
type: "handRaised",
userId: msg.userId
});
5) 【面试口播版答案】
面试官您好,百万级实时互动课堂系统需解决大规模并发与低延迟问题。核心思路是分布式架构+分层技术:
6) 【追问清单】
7) 【常见坑/雷区】