写点什么

模块四 - 考试试卷存储方案

作者:悟空
  • 2023-01-02
    上海
  • 本文字数:1766 字

    阅读完需:约 6 分钟

模块四-考试试卷存储方案

一.存储性能需求估算

1.用户量预估

这里确定预估为 1000 万

2.用户行为建模和性能需求计算

关键行为:考试

考试结果记录存储量:

假设每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以内),考试结果永久保存,在校学生能够看到自己曾经的考试结果。

• 在校学生:1000 万 * 20(课)* 2(考试次数) * 1000(答案)* 2(学期) * 3(只有前三年考试)= 2.4T。

• 离校学生:每年 250 万,存储量为 0.6T。

请求试卷和提交试卷估算:

假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:

• 请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。

• 提交试卷: 1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟 = 1700/每秒。

3.存储性能需求汇总

1.在校学生考试结果存储:2.4T;

2.离校学生考试结果存储:每年增长 0.6T;

3.试卷请求 QPS:5 万/s;

4.提交试卷 TPS:1700/s;

应用面向复杂度架构设计思想,会发现复杂的地方如下:

• 试卷请求每秒 5W,请求量非常大了

• 在校学生考试结果存储为 2.4T,存储量相对还是有点大的


二.存储架构选择

1.考试存储架构分析

下图架构分析不要体现在架构设计,只是自己的思路解析。


2.考试存储架构图



试卷存储和访问:使用 Redis sentinel,因为同一门考试读取的试卷是一样的,redis sentinel 支持主从,从机读下来也是一样的,可以支撑比较高的性能。可以在后台管理配置试卷,快考试预热到 redis 缓存中。redis 缓存中试卷可以设置缓存时效。


老师考试课程结果:Mysql 集群,根据具体业务场景决定的,老师需要基于考试结果来进行统计和分析,一般分析当年的考试结果,分析完成以后就可以归档了


学生考试结果:Hbase,无需统计分析,只需要学生自己查看自己的考试结果即可,学生考试结果是需要永久保存的


三.存储方案设计

1.试卷存储和访问

存储架构:Redis sentinel

a)

【数据结构设计】

数据类型:string

key:学校 ID:课程 ID:试卷 ID

value:题目的 json 字符串


【读写分析】

1.考试前试卷按照 key 的规则预加载到 redis 中

2.考试的时候学生获取试卷从 redis 中按照 key 的规则获取当前考试的试卷


b) 如果试卷的内容比较大的话,可能就需要根据试卷题型进行分类

【数据结构设计】

数据类型:set

key:学校 ID:课程 ID:试卷 ID:题型 ID

value:不同题型的题目的 json 字符串


【读写分析】

1.考试前试卷按照 key 的规则预加载到 redis 中

2.考试的时候学生获取试卷从 redis 中按照 key 的规则获取当前考试的试卷


2.学生考试结果存储

存储架构:Habse

【数据结构设计】

Key:学校 ID+学号 ID+考试 ID

Column Family:test

Column:result,score,其中 result 是 JSON 格式


【读写分析】

1.学生提交考试结果,直接按照 key 保存 result;

2.老师改卷以后,直接写入 score;

3.学生查看自己的成绩,按照 key 读取 result 和 score,可以看到得分和具体错在哪里。


3.老师考试课程结果

存储结构:Mysql 集群

【数据结构设计】

学生考试成绩表结构设计:

create table student_exam_score(   student_id varchar(50) not null comment '学号',   subject_id varchar(50) null comment '课程id',   exam_id varchar(50) null comment '考试ID',   total_score int(3) null comment '考试总分数',   score int(3) null comment '学生考试得分',   ......);

复制代码

上面只是列出学生考试分数这个场景部分字段。另外可能还需要汇总不同分数段的统计,学生做错较多的题目数等统计数据。关于统计的话可以根据不同需求来设定,例如可以在后台管理系统设置不同维度统计开关供老师手动点击进行统计或者设计自动后台相关统计的任务


【读写分析】

1.老师改卷以后直接保存学生试卷结果

2.后台跑批根据试卷结果对数据按照不同纬度分析统计


四.Redis sentinel 集群的服务器数量和性能

根据经验 Redis 一般像 32G 的单机的性能大概在 5~10 万 qps 每秒。考试刚开始的时候根据之前评估的每秒请求在 5W/s 的 qps。可见单机的 Redis 已经满足性能需求。考虑到高可用,Redis 使用主从,Redis sentinel 的话因为要选举至少需要部署 3 个节点,所以最终需要 1 台 redis 主,1 台 redis 从,3 台 redis sentinel


用户头像

悟空

关注

还未添加个人签名 2018-12-28 加入

还未添加个人简介

评论

发布
暂无评论
模块四-考试试卷存储方案_存储_悟空_InfoQ写作社区