
1) 【一句话结论】
采用客户端-服务端分离的微服务架构,结合WebRTC音视频传输、Kafka顺序消息队列、Redis分布式缓存,通过数据库分库分表与分布式事务保障数据一致性,并引入断线重连、消息队列缓冲等容错机制,支撑百万级用户高并发下的实时交互与稳定性。
2) 【原理/概念讲解】
老师:咱们先拆解核心组件,从客户端到服务端,每个环节都针对高并发、实时性设计。
3) 【对比与适用场景】
以WebRTC与WebSocket为例(音视频传输与数据同步的对比):
| 特性 | WebRTC | WebSocket |
|---|---|---|
| 功能 | 音视频流P2P传输 | 数据同步(文本、信令) |
| 原理 | P2P直接通信,减少服务器中转 | 长连接,服务器中转 |
| 延迟 | 低(P2P) | 较高(服务器中转) |
| 适用场景 | 课堂音视频直播(师生/同学互动) | 用户状态同步、聊天消息 |
| 注意点 | 需信令服务器,网络限制(防火墙) | 长连接维护成本,消息顺序依赖服务器 |
4) 【示例】
// 消息服务发送用户举手消息
Producer<String, String> producer = new KafkaProducer<>(props);
// 分区键为用户ID,确保同一用户消息在同一分区
producer.send(new ProducerRecord<>("live-interaction", "user123", "用户A举手了"),
new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
if (exception != null) {
// 重试或记录日志
}
}
});
// 用户登录前检查布隆过滤器
Jedis jedis = new Jedis("localhost");
String bloomKey = "login_bloom";
// 假设用户ID为123,布隆过滤器判断是否已登录
if (jedis.sismember(bloomKey, "user123")) {
// 已登录,拒绝请求
return "用户已登录";
}
// 否则允许登录,并添加到布隆过滤器
jedis.sadd(bloomKey, "user123");
jedis.expire(bloomKey, 3600); // 过期时间1小时
5) 【面试口播版答案】
“面试官您好,设计百万级用户在线教育直播课系统,核心是构建客户端-服务端分离的实时架构。客户端通过WebSocket与信令服务器建立连接,配合WebRTC实现音视频传输,服务端拆分为信令、直播、消息等微服务,用Kafka顺序分发互动消息,Redis缓存用户状态。数据库分库分表保证数据一致性,同时引入断线重连、消息队列缓冲等容错机制。具体来说,用户登录后,客户端先通过WebSocket获取WebRTC信令,建立音视频连接;服务端通过Kafka将互动消息(如举手、答题)推送给所有用户,Redis缓存用户状态减少数据库压力。客户端支持延迟重连,服务端消息队列缓冲未消费消息,确保高并发下的实时性和稳定性。”
6) 【追问清单】
7) 【常见坑/雷区】