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

设计一个支持百万级用户的高并发在线考试系统,需满足实时答题、成绩同步、防作弊(如禁止复制粘贴、监控设备)等需求,请描述系统架构和关键技术选型。

深圳大学中纺集团难度:困难

答案

1) 【一句话结论】采用微服务+分布式架构,通过WebSocket保障实时答题低延迟,结合防作弊中间件(输入拦截+设备监控+行为分析)与Redis+MySQL分布式存储,实现百万级并发下的实时交互与成绩同步,确保防作弊措施的可验证性及成绩同步延迟控制在1-2秒内。

2) 【原理/概念讲解】老师:先拆解需求——百万级并发、实时答题、成绩同步、防作弊。架构上,拆分为前端(Web/移动)、实时通信(WebSocket)、业务逻辑(答题/成绩计算)、防作弊(输入拦截/设备监控/行为分析)、存储(Redis/MySQL)。实时答题用WebSocket,持久连接,低延迟,像“实时聊天”一样双向通信。防作弊输入拦截用JavaScript禁用Ctrl+C(前端),设备监控收集设备指纹(CPU型号、内存大小等硬件信息),结合摄像头监控(第三方API)检测作弊。成绩同步用消息队列(如Kafka)异步处理,减少数据库压力。存储层中,Redis作为缓存,存储高频访问的热点数据(如答题进度),MySQL作为持久化存储,存储成绩记录(分库分表按用户ID分片)。

3) 【对比与适用场景】

技术选型定义特性使用场景注意点
MySQL关系型数据库ACID事务、事务一致性、支持复杂查询稳定性要求高的数据(如成绩记录、用户信息)扩展性一般,需分库分表(按用户ID或考试ID分片)
Redis内存数据库高速读写、缓存、支持数据结构(列表/集合)实时数据(如答题进度、用户在线状态)数据持久化需RDB/AOF,适合高频访问,缓存热点数据(如热门题目答案)

4) 【示例】用户答题流程伪代码:
前端(答题):

// WebSocket连接
const socket = new WebSocket('wss://exam-server.com');
socket.onmessage = (event) => {
  const data = JSON.parse(event.data);
  // 发送答题
  socket.send(JSON.stringify({ userId: 123, questionId: 1, answer: 'A' }));
};
// 输入拦截(禁用Ctrl+C)
document.addEventListener('keydown', (e) => {
  if (e.ctrlKey && e.key === 'c') {
    e.preventDefault();
    alert('禁止复制粘贴');
  }
});

后端(答题处理):

# 接收答题消息
def handle_answer(event):
  data = json.loads(event)
  user_id = data['userId']
  question_id = data['questionId']
  answer = data['answer']
  
  # 存储到Redis(实时进度)
  redis_client.set(f"user_{user_id}_q{question_id}", answer)
  
  # 触发成绩同步(消息队列持久化)
  kafka_producer.send('exam_results', value=answer, headers={'user_id': user_id, 'question_id': question_id})

成绩同步服务:

# 处理成绩消息
def process_result(message):
  data = message.value
  user_id = message.headers['user_id']
  question_id = message.headers['question_id']
  answer = data
  
  # 计算成绩(假设)
  score = calculate_score(answer)
  
  # 存储到MySQL(成绩表)
  db.execute("INSERT INTO exam_results (user_id, question_id, score) VALUES (?, ?, ?)", (user_id, question_id, score))
  
  # 通过WebSocket推送给前端
  web_socket.send_to_user(user_id, f"question_{question_id} score: {score}")

5) 【面试口播版答案】面试官您好,针对百万级用户的高并发在线考试系统,我的设计核心是构建微服务+分布式架构,通过WebSocket保障实时答题低延迟,结合防作弊中间件(前端JS输入拦截+后端设备指纹+行为分析)与Redis+MySQL分布式存储,实现成绩同步的实时性与防作弊的有效性。架构分为前端、实时通信层(WebSocket)、业务逻辑层(答题/成绩计算)、防作弊层(输入拦截+设备监控+行为分析)和存储层(Redis缓存热点数据,MySQL分库存储成绩)。实时答题通过WebSocket实现用户与后端的双向通信,成绩同步利用Kafka消息队列异步处理,减少数据库压力;防作弊方面,前端用JavaScript禁用Ctrl+C(代码示例),后端收集设备指纹(CPU型号、内存大小等硬件信息),结合鼠标移动轨迹、按键频率等行为分析,限制虚拟机绕过,并配合摄像头监控(第三方API)检测作弊行为。高并发处理上,前端通过CDN负载均衡,后端服务采用Nginx+反向代理,数据库分库分表(按用户ID分片),Redis缓存热点数据。这样既能满足百万级并发下的实时交互,又能保障成绩同步的准确性与防作弊的有效性。

6) 【追问清单】

  • 问题1:如何处理用户使用虚拟机或浏览器插件绕过输入拦截的情况?
    回答要点:通过动态更新设备指纹(如每5分钟更新一次硬件信息),结合行为分析(鼠标移动轨迹、按键频率异常),限制同一设备同时登录多个账号,并配合人工审核。
  • 问题2:系统如何保证成绩同步的实时性(比如用户答题后,成绩立即显示)?
    回答要点:成绩计算通过Redis缓存用户答题进度,当用户提交试卷时,触发Kafka消息将成绩发送至成绩同步服务,前端通过WebSocket订阅成绩更新,延迟控制在1-2秒内。
  • 问题3:如果系统遇到突发流量(如考试高峰期),如何保证服务不崩溃?
    回答要点:采用负载均衡(Nginx)+服务降级(熔断),数据库分库分表+读写分离,Redis作为缓存层减轻数据库压力,并设置令牌桶算法限流控制请求频率。
  • 问题4:防作弊的设备监控是否会影响用户隐私?如何平衡?
    回答要点:仅收集必要硬件信息(CPU型号、内存、屏幕分辨率),不采集用户隐私数据(如摄像头画面仅用于检测作弊,不存储或传输用户面部信息),符合隐私保护法规。
  • 问题5:如果Redis缓存数据丢失,如何保证成绩同步的可靠性?
    回答要点:Redis配置RDB/AOF持久化,结合Kafka持久化消息,确保数据不丢失,并通过消息队列重试机制处理失败情况。

7) 【常见坑/雷区】

  • 忽略防作弊技术细节,只说“禁止复制粘贴”而不具体说明JavaScript实现或设备监控参数,导致方案不可验证。
  • 架构设计过于集中化,未拆分为微服务,导致扩展性差,无法应对百万级并发。
  • 未考虑成绩同步的延迟控制,比如消息队列未设置持久化或重试机制,可能导致成绩延迟或丢失。
  • 技术选型不匹配场景,比如用关系型数据库处理高并发写入(如答题数据),导致性能瓶颈,应优先用Redis缓存。
  • 缺乏容灾设计,比如数据库未配置主从复制或集群,故障时无法快速切换,影响系统可用性。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1