Bootstrap

模块四-千万级学生管理系统试卷存储方案

性能需求评估

用户量评估

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估值(官网)

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