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

好未来需要支持百万级用户的在线直播课,请设计一个视频直播系统的架构,包括流媒体传输、互动功能(如弹幕、答题)的实现方案。

好未来基础平台难度:困难

答案

1) 【一句话结论】

针对百万级用户在线直播课,设计分层架构的视频直播系统,核心是CDN+WebRTC混合流媒体传输(移动端用HLS通过CDN分发适配移动网络;互动强场景用WebRTC端到端低延迟传输),互动功能通过WebSocket+Kafka+Redis实现弹幕实时推送与答题异步处理,结合K8s集群、负载均衡及多区域CDN,确保WebRTC延迟50-100ms、HLS延迟1-2秒,支持百万级用户高并发。

2) 【原理/概念讲解】

流媒体传输是系统的核心,需解决数据从服务器到用户端的低延迟、高可用传输。常见协议各有特点:

  • HLS(HTTP Live Streaming):基于HTTP协议,将视频拆分为小段(如10秒),通过HTTP请求传输。优点是缓存友好、移动端兼容性好(iOS/Android),尤其适配移动网络(4G/5G切换时,缓存内容可继续播放);缺点是延迟较高(约1-2秒),因需重新请求新段。
  • WebRTC(Web Real-Time Communication):端到端技术,支持P2P传输(用户直接与服务器或用户传输数据,减少中继服务器压力),延迟约50-100ms。优点是低延迟,适合互动强场景(如实时答题、弹幕);缺点是需要信令服务器(STUN/TURN)处理NAT穿越(移动网络下常见),部署复杂。
  • RTMP(Real-Time Messaging Protocol):基于TCP传输,延迟低(毫秒级),适合低延迟直播(如游戏、实时教学);缺点是移动端兼容性差,依赖TCP,需专用服务器(如Wowza)。

互动功能实现:弹幕通过WebSocket实时双向通信,用户发送后服务器立即广播给所有在线用户;答题则通过Kafka消息队列异步处理高并发数据,结合Redis缓存实时状态(如排行榜),前端订阅更新。类比:HLS像“区域快递分仓”(按区域分拣,用户从附近节点取货,缓存后继续播放),WebRTC像“即时配送”(用户直接拿货,减少中转),消息队列像“订单中转站”(异步处理高并发订单,避免服务器压力)。

3) 【对比与适用场景】

流媒体传输协议对比:

协议定义特性使用场景注意点
HLSHTTP Live Streaming分段传输,缓存友好,移动端兼容移动网络、Wi-Fi环境延迟稍高(秒级),自适应码率
WebRTC端到端实时通信P2P传输,低延迟(毫秒级),支持数据通道互动强场景(实时答题、弹幕)需信令服务器,部署复杂
RTMP实时流协议TCP传输,低延迟(毫秒级),需专用服务器低延迟直播(游戏、实时教学)移动端兼容性差,依赖TCP

互动技术对比:

技术定义特性使用场景注意点
WebSocket全双工通信低延迟(毫秒级),实时双向弹幕、实时消息推送服务器连接数限制
Kafka分布式消息队列分区、消费者组,异步处理高并发答题、日志需事务或分布式锁保证一致性
Redis内存数据库高速缓存,实时更新实时排行榜、状态同步读写分离,避免单点故障

4) 【示例】

弹幕实现流程(伪代码,区分移动端与PC端):

  • 移动端(HLS传输流,弹幕用WebSocket):用户发送弹幕,服务器通过WebSocket广播,前端实时渲染。

    // 服务器(Node.js + WebSocket)
    const wss = new WebSocket.Server({ port: 8080 });
    wss.on('connection', ws => {
      ws.on('message', message => {
        const barrage = JSON.parse(message);
        wss.clients.forEach(client => client.send(JSON.stringify(barrage)));
      });
    });
    // 客户端(移动端)
    const ws = new WebSocket('ws://example.com:8080');
    ws.onmessage = e => {
      const barrage = JSON.parse(e.data);
      document.getElementById('barrage').append(barrage.text);
    };
    
  • 答题实现流程(Kafka+Redis,分布式锁保证一致性):
    用户答题:POST /api/answer?questionId=1&userId=123&answer=A
    服务器(Kafka生产者)发送消息:

    {
      "questionId": 1,
      "userId": 123,
      "answer": "A",
      "timestamp": 1672531200
    }
    

    Kafka消费者处理:

    const consumer = new kafka.Consumer({ topic: 'answers', partition: 0 });
    consumer.on('message', msg => {
      const data = JSON.parse(msg.value);
      // MySQL事务存入答案
      db.query('INSERT INTO answers (question_id, user_id, answer) VALUES (?, ?, ?)', 
               [data.questionId, data.userId, data.answer], (err, res) => {
        if (err) throw err;
        // Redis分布式锁(SETNX)保证唯一性
        const lockKey = `lock:q${data.questionId}`;
        const rankKey = `rank:q${data.questionId}`;
        redis.set(lockKey, '1', { EX: 10, NX: true }, (err, ok) => {
          if (ok) {
            redis.get(rankKey, (err, rank) => {
              const currentRank = JSON.parse(rank);
              const newScore = calculateScore(data.answer);
              currentRank.push({ userId: data.userId, score: newScore });
              redis.setex(rankKey, 300, JSON.stringify(currentRank.sort((a,b)=>b.score-a.score)));
              redis.del(lockKey);
            });
          }
        });
      });
    });
    

    客户端实时显示排行榜:

    setInterval(() => {
      redis.get('rank:q1', (err, rank) => {
        document.getElementById('rank').innerHTML = JSON.parse(rank).map(item => `${item.userId}: ${item.score}`).join('<br>');
      });
    }, 1000);
    

5) 【面试口播版答案】

“面试官您好,针对百万级用户的在线直播课,我设计的视频直播系统采用分层架构,核心是低延迟和高并发。流媒体传输部分,我们针对不同设备采用差异化方案:移动端用户用HLS通过CDN分发,利用自适应码率适应4G/5G网络切换,保证播放流畅;PC端或互动强场景用WebRTC实现端到端低延迟传输(约50-100ms),减少服务器压力。互动功能方面,弹幕通过WebSocket实时推送,用户发送后服务器立即广播给所有在线用户,延迟控制在50ms内;答题则结合Kafka消息队列异步处理高并发数据,Redis缓存实时排行榜,前端订阅更新,延迟约1秒。系统还部署K8s集群,Nginx负载均衡,多区域CDN(如阿里云、腾讯云)容灾,MySQL主从+Redis缓存,确保百万级用户并发下的流畅性和实时性。”

6) 【追问清单】

  • 问:如何处理百万级用户下CDN热点区域的流量过载?
    回答要点:采用多区域CDN(如阿里云、腾讯云全球节点),热点区域增加边缘节点,结合负载均衡器动态调整流量,避免单点过载。
  • 问:WebRTC的P2P传输如何保证数据安全,防止恶意用户干扰?
    回答要点:对WebRTC信令和媒体流进行TLS加密,服务器端验证用户身份(JWT),限制用户发送的数据类型和频率,监控异常流量及时封禁。
  • 问:互动功能中,如何保证弹幕和答题的实时性,避免延迟?
    回答要点:弹幕通过WebSocket全双工通信,服务器直接广播;答题数据通过Kafka异步处理,Redis缓存实时状态,前端订阅更新,确保实时性。
  • 问:系统如何处理高并发下的数据一致性,比如用户同时答题?
    回答要点:答题数据存入MySQL事务,Redis用SETNX分布式锁保证同一用户只能提交一次,避免脏读。
  • 问:如果用户网络不稳定,如何保证直播不卡顿?
    回答要点:HLS自适应码率,WebRTC的NAT穿越(STUN服务器),服务器端重传机制,确保网络波动时仍能流畅播放。

7) 【常见坑/雷区】

  • 坑1:忽略移动网络多样性,用WebRTC传输移动端直播,导致兼容性问题,应区分场景选择协议(移动端用HLS)。
  • 坑2:互动功能用轮询实现弹幕或答题,导致高延迟(秒级),应使用WebSocket。
  • 坑3:未考虑服务器集群规模和负载均衡,导致单点故障,应部署Nginx负载均衡和CDN多区域。
  • 坑4:消息队列未处理延迟,导致答题实时性差,应结合Redis缓存实时状态。
  • 坑5:技术指标不具体,比如只说低延迟,应给出具体数值(如WebRTC 50-100ms,HLS 1-2秒)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1