51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个在线考试系统,支持实时监考、自动评分和成绩实时反馈。请考虑并发控制、数据一致性和系统容错。

深圳大学上海交运难度:困难

答案

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) 【追问清单】

  • 问题1:如何处理监考端和考生端的网络延迟问题?
    回答要点:用WebSocket心跳检测(3秒一次),超时(10秒)重连,监考端缓存操作日志(本地存储,断线后同步)。
  • 问题2:自动评分的题目类型(如选择题、主观题)如何处理?
    回答要点:选择题解析答案字符串,主观题用NLP模型匹配(如TF-IDF或BERT),通过消息队列异步处理,避免影响实时监考。
  • 问题3:系统如何保证成绩的不可篡改?
    回答要点:成绩更新通过事务,结合区块链存证(可选),或时间戳+签名(如JWT签名),确保数据不可篡改。
  • 问题4:高并发下,如何优化自动评分的性能?
    回答要点:使用消息队列解耦,评分服务集群化(Nginx负载均衡),缓存常用题目答案(Redis)减少数据库压力。
  • 问题5:如果考试系统出现故障,如何快速恢复?
    回答要点:数据库主从复制+备份(MySQL的binlog备份),消息队列重试机制(Kafka的rebalance),监考端本地缓存操作日志(断线后同步)。

7) 【常见坑/雷区】

  • 忽略分布式锁的过期时间,导致死锁(如锁未释放,其他请求无法获取);
  • 消息队列未选型,如Kafka vs RabbitMQ,未考虑场景(如Kafka适合高吞吐,RabbitMQ适合可靠性);
  • 自动评分服务未做高可用,单点故障影响全局;
  • 容错机制不完善,如无数据库备份,消息队列未持久化导致数据丢失;
  • 表达模板化,使用大量比喻(如“抢购商品”),缺乏真实工程经验。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1