模块四作业 - 考试试卷存储设计
前言
本文是千万级学生管理系统的考试试卷存储设计文档,用于指导系统后续开发、测试和运维。
词汇表
1. 业务背景
假设每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以内),考试结果永久保存。
学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟。
2. 约束和限制
学校学生人数按千万人计算
在校学生考试结果存储:1000 万 * 20(课)* 2(考试次数) * 1000(答案)* 2(学期) * 3(学年)= 2.4T
离校学生考试结果存储: 2.4T / 4 = 每年增长 0.6T
试卷请求 QPS:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 5 万/s
提交试卷 TPS:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟 = 1700/s。
3. 总体架构

3.1 架构分析
3.1.1 高性能
开始考试前的读取试卷峰值较高,故采用 Redis 作为缓存,redis 单机性能 5w-10wTPS 能满足读取需求
3.1.2 高可用
为防止读取是服务宕机造成不能正常考试,故采用 redis-sentinel 集群模式,单机故障时自动切换,并提供多机可读操作,3 台机器可提供 15w-30wTPS
3.1.3 可扩展
学生考试记录离校之后也要保存,故采用 Hbase 保存学生答卷的所有历史数据
3.1.4 安全
答卷不可丢,redis 要做持久化
4. 详细设计
4.1 核心功能
4.1.1 教师创建及批改试卷

4.1.2 学生流程
4.2 关键设计
4.2.1 考试试卷题库
存储在 mysql 中,记录应包括题目类型,答案,题目的文字等
4.2.2 缓存考卷
考试开始前 load 考卷任务 随机考题并 加载考卷至 redis 集群
考卷在 redis 中以 hashmap 格式保存
学校 ID+学院 ID+学科 ID+考卷 ID:{
key: 题号 value: {type:1,context:'请问 xxxxxxxxxx?', answer:"A"}
}
4.2.3 答卷
答卷在 redis 中以 hashmap 格式保存
学校 ID+学生 ID+考卷 ID:{
key:题号 ,value:{answer:"C"}
}
评论