
针对百万级用户在线直播课,设计分层架构的视频直播系统,核心是CDN+WebRTC混合流媒体传输(移动端用HLS通过CDN分发适配移动网络;互动强场景用WebRTC端到端低延迟传输),互动功能通过WebSocket+Kafka+Redis实现弹幕实时推送与答题异步处理,结合K8s集群、负载均衡及多区域CDN,确保WebRTC延迟50-100ms、HLS延迟1-2秒,支持百万级用户高并发。
流媒体传输是系统的核心,需解决数据从服务器到用户端的低延迟、高可用传输。常见协议各有特点:
互动功能实现:弹幕通过WebSocket实时双向通信,用户发送后服务器立即广播给所有在线用户;答题则通过Kafka消息队列异步处理高并发数据,结合Redis缓存实时状态(如排行榜),前端订阅更新。类比:HLS像“区域快递分仓”(按区域分拣,用户从附近节点取货,缓存后继续播放),WebRTC像“即时配送”(用户直接拿货,减少中转),消息队列像“订单中转站”(异步处理高并发订单,避免服务器压力)。
流媒体传输协议对比:
| 协议 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| HLS | HTTP Live Streaming | 分段传输,缓存友好,移动端兼容 | 移动网络、Wi-Fi环境 | 延迟稍高(秒级),自适应码率 |
| WebRTC | 端到端实时通信 | P2P传输,低延迟(毫秒级),支持数据通道 | 互动强场景(实时答题、弹幕) | 需信令服务器,部署复杂 |
| RTMP | 实时流协议 | TCP传输,低延迟(毫秒级),需专用服务器 | 低延迟直播(游戏、实时教学) | 移动端兼容性差,依赖TCP |
互动技术对比:
| 技术 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| WebSocket | 全双工通信 | 低延迟(毫秒级),实时双向 | 弹幕、实时消息推送 | 服务器连接数限制 |
| Kafka | 分布式消息队列 | 分区、消费者组,异步处理 | 高并发答题、日志 | 需事务或分布式锁保证一致性 |
| Redis | 内存数据库 | 高速缓存,实时更新 | 实时排行榜、状态同步 | 读写分离,避免单点故障 |
弹幕实现流程(伪代码,区分移动端与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);
“面试官您好,针对百万级用户的在线直播课,我设计的视频直播系统采用分层架构,核心是低延迟和高并发。流媒体传输部分,我们针对不同设备采用差异化方案:移动端用户用HLS通过CDN分发,利用自适应码率适应4G/5G网络切换,保证播放流畅;PC端或互动强场景用WebRTC实现端到端低延迟传输(约50-100ms),减少服务器压力。互动功能方面,弹幕通过WebSocket实时推送,用户发送后服务器立即广播给所有在线用户,延迟控制在50ms内;答题则结合Kafka消息队列异步处理高并发数据,Redis缓存实时排行榜,前端订阅更新,延迟约1秒。系统还部署K8s集群,Nginx负载均衡,多区域CDN(如阿里云、腾讯云)容灾,MySQL主从+Redis缓存,确保百万级用户并发下的流畅性和实时性。”