模块四-千万级学生管理系统试卷存储方案
性能需求评估
用户量评估
1000万学生
业务建模
试卷存储主要涉及以下业务场景:
老师-考前提交&修改试卷
学生-考前1分钟读取试卷
学生-考试中临时保存答案
学生-最终提交答案
老师-评阅答案并打分
学生-查看考试成绩

性能评估
几点假设
考试课程:
每个学生每年参加20门课程考试
每个课程20判断题、20选择题、4道大题(答案200字以内),每个题目50中文字,大题答案100中文字
每次考试90分钟
考试时间:
考试开始时间集中在上午8点、上午10点、下午2点、下午4点、晚上7点,5个时间点
考试在1个月内完成
提交试卷:
学生每5分钟临时保存答案一次
学生每次考试都在最后30分钟全部交卷
阅卷打分
5天内完成,每天阅卷8小时
学生查阅成绩
阅卷完成次日的一天12小时
性能评估
存储量(JSON存储):
试卷存储:4个年级*20门课程*(20选择+20判断+4大题)*50中文字*3Byte每字=4*132000Byte=516Kb,如果考虑历史数据,大四4次、大三3次……516Kb*(4+3+2+1)=5MB(约等)
答案存储:1000万*20门课程*(20选择*2Byte+20判断*2Byte+4大题*100中文字*3Byte)=250G(约等),如果考虑历史数据,大四4次、大三3次……250G*(4+3+2+1)=2.5T(约等)
读性能
老师考前读试卷:可忽略
学生考前1分钟读试卷:20门课程*1000万*1分钟/60S/20天/5次=4万/秒(约等)
老师评阅试卷并打分:1000万*20门课程/5天/8小时/60分钟/60秒=1500/秒(约等)
学生查阅评分及打分结果:1000万/5天/12小时/60分钟/60秒=50/秒(约等)
写性能
学生考中临时保存答案:20门课程*1000万*(90分钟/5分钟)/20天/5次/90分钟/60秒=7000/秒(约等)
学生最终提交答案:20门课程*1000万/20天/5次/30分钟/60秒=1500/秒(约等)
老师阅卷并打分:1000万*20门课程/5天/8小时/60分钟/60秒=1500/秒(约等)
性能汇总
试卷
存储量:答案总5MB,每年516Kb增长
读性能:学生读试卷4万/秒
答案
存储量:答案总2.5T,每年0.5T增长
读性能:老师评分读1500/秒
写性能:学生保存答案7000/秒,老师评分1500/秒
存储系统指标分析
单机存储量、单机写性能、单机读性能、自动切换、分区架构

存储方案设计
主流技术的指标假设
Linux最大连接数10万
Nginx每秒2-3万并发
Web容器最大并发线程100个,每秒可处理请求1000个
Redis每秒5-10万读
MySQL每秒最高2000TPS
HBase四台32核主机每秒插入70000条,读取大约是25000条,扫描100条以内记录,每秒15000条(读取比写入慢?)
试卷存储分析
存储架构

存储结构
MySQL试卷表
CREATE TABLE `examin_paper`(
`id` INT PRIMARY KEY AUTOINCREMENT COMMENT '主键ID'
`cousre_id` INT DEFAULT 0 COMMENT '课程ID',
`content` TEXT COMMENT '试卷内容,JSON',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
)ENGINE=InnoDB CHARSET=UTF8MB4;
Redis KV
Key:examin_paper的主键ID
Value:exmin_paper的content
过期时间:考试结束后1小时
写入时间:考试试卷开始前10分钟
答案存储分析
存储架构

存储结构
MySQL答案表及答案评分表
CREATE TABLE `examin_answer`(
`id` INT PRIMARY KEY COMMENT '主键ID,雪花算法生成',
`examin_paper_id` INT DEFAULT 0 COMMENT '试卷ID',
`student_id` INT DEFAULT 0 COMMENT '学生ID',
`class_id` INT DEFAULT 0 COMMENT '班级ID',
`content` TEXT COMMENT '答案内容,JSONArray->[],数组下标就是题号',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
)ENGINE=InnoDB CHARSET=UTF8MB4 hash by(class_id);
CREATE TABLE `examin_answer_score`(
`id` INT PRIMARY KEY COMMENT '主键ID',
`examin_paper_id` INT DEFAULT 0 COMMENT '试卷ID',
`examin_answer_id` INT DEFAULT 0 COMMENT '答案ID',
`content` TEXT COMMENT '得分结果,JSONArray->[],数组下标就是题号',
`score` INT default 0 comment '得分',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
)ENGINE=InnoDB CHARSET=UTF8MB4;
HBase Key-Columns
Key:学生ID+试卷ID
Columns:得分、试卷内容JSON、考生答案
附录
Redis各CPU架构下TPS估值(官网)


数据传输时延比对表(华仔架构课程)
