
1) 【一句话结论】在直播课场景下,通过服务端实时监控客户端心跳,客户端崩溃时由服务端接管播放逻辑并同步恢复数据,确保课程无缝继续。
2) 【原理/概念讲解】老师口吻,解释核心概念:直播课通常采用“服务端控制流、客户端渲染”的C/S架构,服务端负责发送视频流、互动数据,客户端负责画面渲染和交互。容灾的核心是“状态感知+快速切换”。具体流程为:服务端定期(如每100ms)向客户端发送心跳包,维护客户端状态表。当客户端未响应心跳超时(如3秒),服务端判定崩溃,此时服务端从数据库获取当前课程状态(播放时间、画面帧、互动数据),通过WebSocket向其他正常客户端广播“客户端X崩溃,服务端接管”,并推送服务端本地播放的直播流;同时同步崩溃客户端的数据给其他客户端,确保一致性。类比:就像班级里老师(服务端)监控每个学生(客户端)状态,若学生“睡着”(崩溃),老师立刻接管教学(播放),并通知其他学生(正常客户端)继续听讲,同步“睡着”学生的笔记(数据)。
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 服务端接管 | 服务端在客户端崩溃时主动接管播放逻辑,由服务端负责画面渲染和状态控制 | 实时性高,快速恢复播放;依赖服务端性能 | 直播课、实时互动类应用(如在线课堂、直播游戏) | 需服务端具备高并发处理能力,避免负载过高 |
| 客户端自动恢复 | 客户端崩溃后尝试自动重启或从本地缓存恢复 | 实现简单,但恢复时间长,可能影响体验 | 非实时性要求不高的场景(如离线课程回放) | 恢复时可能丢失实时数据,不适合直播 |
4) 【示例】
服务端伪代码(简化):
// 维护客户端状态表
clientStates = {}
// 心跳检测循环
while true:
for client in clientStates:
if not client.isAlive(): // 检查心跳超时
handleClientCrash(client)
sleep(100ms)
// 客户端崩溃处理函数
function handleClientCrash(client):
// 1. 获取当前课程状态
courseState = getCourseStateFromDB(client.courseId)
// 2. 通知其他客户端
broadcastToOtherClients("clientCrash", {
clientId: client.id,
courseState: courseState
})
// 3. 服务端本地播放
startServerPlayback(courseState)
// 4. 同步数据
syncDataToOtherClients(courseState)
5) 【面试口播版答案】
面试官您好,针对Unity 3D客户端崩溃导致直播课中断的问题,我的容灾方案核心是通过服务端实时监控客户端状态,实现快速接管和状态同步。具体来说,直播课采用C/S架构,服务端负责控制流,客户端负责渲染。首先,服务端会定期(如每100ms)向客户端发送心跳包,监控客户端存活状态。当客户端未响应心跳超过3秒,服务端判定其崩溃。此时,服务端会从数据库获取当前课程的播放状态(如当前时间戳、画面帧、用户互动数据),然后通过WebSocket向其他正常客户端广播“客户端X崩溃,服务端接管”,并推送服务端本地播放的直播流。同时,服务端会将崩溃客户端的播放进度和互动数据同步给其他客户端,确保数据一致性。这样,即使客户端崩溃,课程也能无缝继续,用户体验不受影响。
6) 【追问清单】
7) 【常见坑/雷区】