千万级学生管理系统的考试试卷存储方案
1. 考试试卷存储-性能估算
假设在校学生数量总共为1000万,每个学生平均一学期20门课,考试都采取机考的方式,安排在某一个月内。考试的时候主要分为请求试卷、提交答案两大步骤,中间答题过程浏览器本地完成。考试集中在上午4小时和下午4小时,请求试卷操作集中在考试开始的前1分钟,提交答案集中在考试结束前的30分钟,因此估算如下:
1、请求试卷
1000万 * 20(课)/ 20(周末不考试) / 4(每天4堂考试)/ 1分钟 = 250万请求/分钟 ≈ 5万/每秒。
请求试卷 QPS约为:5万/s。
2、提交试卷
1000万 * 20(课)/ 20(周末不考试) / 4(每天4堂考试)/ 30分钟 = 1700/每秒。
提交试卷 TPS约为:1700/s。
2. 考试试卷存储方案设计
2.1 请求试卷场景存储方案设计
1、数据结构设计
Key:Paper + 年度(四位年份:2022) + 学期(01-第一学期、02-第二学期等)+ 学校ID + 课程ID + 试卷ID
Value:String类型,使用JSON字符串存储试卷中的所有试题信息,读取后可以比较方便的分解成不同的试题,并显示在浏览器中。
2、请求试卷操作分析
待读取试卷存储在Redis中,Reids采用一主二从部署结构,主从服务器均提供试卷读取功能。每台Redis服务器的处理能力在5-10万QPS,故可以支撑试卷请求的需求。
2.2 提交试卷场景存储方案设计
1、数据结构设计
Key:Paper + 年度(四位年份:2022) + 学期(01-第一学期;02-第二学期)+ 学校ID + 课程ID + 试卷ID + 学号ID
Value:String类型,使用JSON字符串存储试卷中的所有试题信息及学生的答案。
2、提交试卷分析
试卷提交后存储在Redis主服务中。每台Redis服务器的处理能力在5-10万TPS,故可以支撑试卷提交的需求。
3. 考试试卷存储读写流程

一、请求试卷
1、学生登录后,请求对应课程的试卷,系统根据年度、学期、学校ID、课程ID和试卷ID生成Key值,从Redis中查找对应的试卷信息。
2、Redis从服务器根据key值查找对应的试卷信息(String),并返回。
3、系统解析试卷信息(String,JSON格式),并格式化后,返回给浏览器。
二、提交试卷
4、学生在浏览器中阅读试卷,答题后提交。
5、系统根据根据年度、学期、学校ID、课程ID、试卷ID和学号生成Key值,根据试题和答题结果生成JSON字符串,作为Value,提交到Redis进行保存。
6、Redis主服务器根据key值保存包含答题结果的JSON字符串,并自动复制到从服务器,然后返回存储完毕。
7、系统检查是否为最后一题,如果是最后一题,则询问是否继续答题,如果不是最后一题,那么跳转到步骤4展示试卷,以便继续答题。
(如果步骤6中,提交试卷不成功,系统应该多次重试,如果多次重试仍不成功,则将失败信息返回给浏览器。)
8、学生选择是否继续答题,选择是则跳转到步骤4展示试卷,以便继续答题,选择否则答题结束。
4. Redis sentinel 集群架构设计
考虑到Redis单服务器性能在5-10万TPS,因此采用一主二从三哨兵的部署架构,共部署3台服务器。Redis的一主二从三个服务各自独立部署,每个服务分别部署在一台服务器上。三个哨兵分别与Redis的主从服务部署在一起,如下图所示:
