
1) 【一句话结论】核心是构建分布式架构的在线考试系统,通过分布式锁、消息队列、事务和容错机制,实现实时监考、自动评分与成绩反馈,保障高并发下的数据一致性与系统稳定性。
2) 【原理/概念讲解】设计在线考试系统,需重点解决三大核心问题:并发控制、数据一致性与系统容错。
3) 【对比与适用场景】
| 特性 | 乐观锁 | 悲观锁 |
|---|---|---|
| 定义 | 假设数据未被修改,通过版本号/时间戳验证 | 假设数据会被修改,操作前加锁 |
| 适用场景 | 读多写少,高并发读场景(如监考端实时查看考生操作) | 写多读少,写操作频繁(如考生提交答案) |
| 注意点 | 可能超卖,需重试机制 | 性能受锁竞争影响,高并发下可能阻塞 |
4) 【示例】
// 考试开始流程(后端伪代码)
function startExam(userId, examId) {
// 1. 获取考试配置(题目、时间等)
const examConfig = getExamConfig(examId);
// 2. 使用Redis分布式锁(SETNX)锁定考生会话
const lockKey = exam_session:${userId}:${examId};
const lockValue = Date.now();
const isLocked = redis.setnx(lockKey, lockValue, 'EX', 30); // 30秒超时
if (!isLocked) {
throw new Error('考试已开始或超时');
}
// 3. 创建考试会话,分配唯一ID
const examSession = createSession(userId, examId);
// 4. 启动WebSocket连接,实现实时监考
startWebSocket(examSession.id);
// 5. 启动自动评分定时任务(每题提交后触发)
scheduleAutoScore(examSession.id);
// 释放锁
redis.del(lockKey);
}
// 自动评分流程(后端伪代码)
function autoScore(questionId, answer) {
// 1. 查询题目标准答案
const correctAnswer = getCorrectAnswer(questionId);
// 2. 计算得分(选择题)
const score = answer === correctAnswer ? 1 : 0;
// 3. 通过Kafka异步发送评分结果
kafka.produce('score_topic', {
examId: examSession.id,
questionId,
score,
timestamp: Date.now()
});
// 4. 事务更新用户成绩(确保数据一致性)
db.transaction(() => {
updateScore(userId, examSession.id, score);
});
}
5) 【面试口播版答案】
面试官您好,我来设计一个在线考试系统。核心是构建分布式架构,通过分布式锁、消息队列、事务和容错机制,实现实时监考、自动评分与成绩反馈。系统分为前端(考生/监考端)、后端(考试服务、评分服务、消息队列)、数据库(用户、考试、成绩)。实时监考用WebSocket实现考生操作实时传输,监考端可查看考生屏幕和操作日志。自动评分通过解析题目答案,结合消息队列异步处理,避免阻塞主流程。数据一致性方面,采用乐观锁处理题目提交(读多写少场景),确保高并发下不会超卖;成绩更新用事务保证ACID。系统容错方面,数据库读写分离,消息队列持久化(Kafka的日志持久化),监考端断线重连(心跳检测)。总结来说,这个系统通过技术选型和架构设计,实现了高并发下的实时交互、自动评分和成绩反馈。
6) 【追问清单】
7) 【常见坑/雷区】