写点什么

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

用户头像
关注
发布于: 2021 年 05 月 23 日

性能需求评估

用户量评估

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



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


发布于: 2021 年 05 月 23 日阅读数: 18
用户头像

关注

还未添加个人签名 2018.08.08 加入

还未添加个人简介

评论

发布
暂无评论
模块四-千万级学生管理系统试卷存储方案