
1) 【一句话结论】采用“前端隔离+实时同步+分布式消息+多级缓存+主备容灾”的微服务架构,通过隔离防作弊、WebSocket实时同步、消息队列保证一致性、缓存加速、主备集群容灾,实现百万级并发下的公平性、实时性与稳定性。
2) 【原理/概念讲解】老师口吻,解释核心组件与机制:
“首先,考试系统需分层设计:前端隔离层(防作弊核心,如屏幕录制、摄像头监控+行为分析)、实时同步服务(负责答题进度实时推送)、后端核心服务(处理业务逻辑)、分布式消息队列(如Kafka/RabbitMQ,保证异步消息可靠传递)、多级缓存(Redis用于热点数据缓存,提升响应速度)。通信机制上,答题进度同步用WebSocket,因持久连接能实现低延迟实时推送(类比:像手机即时消息,双方持续在线,消息秒级到达,比HTTP轮询“频繁请求”更高效)。容灾方案采用主备集群模式,主节点处理请求,备节点热备,通过健康检查(如心跳检测)实现故障自动切换,保证系统故障不影响其他考试(类比:城市交通,主干道故障时,备路快速分流,不影响其他路段通行)。”
3) 【对比与适用场景】
| 通信方式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| WebSocket | 基于TCP的双向通信协议 | 持久连接,低延迟,双向实时 | 答题进度、实时通知 | 需要服务器支持,连接管理复杂 |
| HTTP长轮询 | 客户端定期向服务器发送请求,服务器保持连接 | 低延迟,但需频繁请求 | 简单实时需求 | 服务器负载高,延迟稍高 |
| Server-Sent Events | 单向从服务器到客户端的实时推送 | 单向,低延迟 | 实时通知(如考试倒计时) | 仅支持单向 |
4) 【示例】
前端(JavaScript)发起WebSocket连接,后端(Node.js)处理进度更新:
const socket = new WebSocket('wss://exam.wc.com/socket');
socket.onopen = () => console.log('连接成功');
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'progress') {
updateProgress(data.progress); // 更新本地进度显示
}
};
socket.onclose = () => console.log('连接关闭');
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
ws.on('message', (message) => {
const data = JSON.parse(message);
if (data.action === 'updateProgress') {
updateProgressInDB(data.userId, data.progress);
broadcastProgress(data.userId, data.progress);
}
});
});
function broadcastProgress(userId, progress) {
wss.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify({ type: 'progress', userId, progress }));
}
});
}
5) 【面试口播版答案】
“面试官您好,针对百万级用户在线考试架构,我的核心方案是采用分层微服务架构,结合实时通信与容灾设计。首先,公平性方面,通过前端隔离层实现防作弊,比如屏幕录制、摄像头监控,同时答题数据实时同步到中心服务器,防止篡改。实时性上,使用WebSocket实现答题进度双向实时同步,确保所有用户看到一致进度。稳定性方面,后端服务采用主备集群,通过健康检查实现故障自动切换,保证系统故障不影响其他考试。通信机制上,核心数据通过消息队列(如Kafka)保证异步处理的可靠性,缓存层(Redis)加速热点数据访问。容灾方案采用多活集群,主节点故障时备节点秒级接管,确保高可用。这样整体架构既能支撑百万级并发,又能保证公平、实时、稳定。”
6) 【追问清单】
7) 【常见坑/雷区】