写点什么

模块四:学生管理系统考试试卷存储方案

作者:jiaoxn
  • 2022 年 5 月 01 日
  • 本文字数:1290 字

    阅读完需:约 4 分钟

1. 学生管理系统考试试卷背景介绍

  • 系统用户总数估算:1000 万

  • 考试业务建模:

  • 假设每门学科每年 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/每秒。

  • 考试业务性能需求分析:

  • 在校学生考试结果存储:2.4T

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

  • 试卷请求 QPS:5 万/s

  • 提交试卷 TPS:1700/s

2. 考试业务存储架构设计

3. 考试试卷业务存储分析

  • 总体分析来看,单论考试试卷来讲,其瞬时(1 分钟内)QPS 比较高,而生成考卷的 TPS 很低(可理解为一张考卷由一位老师负责创建)。

  • 一张考卷是有有效期,一般情况来讲,教师会在考试前半个月左右准备考试题目,在学生管理系统中组织考卷,考试结束后,考卷即可失效,或者以考试成果的方式存储在对应的 HBase 集群中;教师每次会准备 2 张考卷,一张用于正常的考试,一张用于补考

  • 一张考卷包含 20 判断题、20 选择题、4 道大题(答案 200 字以内),题目包含题干和选项

  • 一般来讲,考卷中不会包含图片,即便包含图片,图片大小不超过 500k

4. Redis 数据结构设计

  • Redis 数据结构选型:Hashtable

  • key:学校 ID+课程 ID+考试 ID+timestamp

  • value:试卷内容,以 JSON 格式存储,具体字段为:

  • choice_questions(选择题): value 为 list,其 item 为字典类型,包括 stem(题干)和 options(选项)

  • judgment_question(判断题):value 为 list,其 item 为字符串类型,表示题干

  • subjective_question(主观题):value 为 list,其 item 为字符串类型,表示题干

5. Redis 数据存储读写流程

  • 写试卷(组织试卷)

  • 考试前半个月,教师从题库中抽取考试题目,浏览器端点击“生成考卷”后,学生管理系统后端服务自动组织考卷

  • 学生管理系统后端服务自动组织考卷时,先在 MySQL 数据库中记录考试相关信息,得到考卷 ID,随后在 Redis 集群记录考卷信息

  • 读试卷(获取试卷)

  • 学生登录系统后,依次选择课程考试和考试时间(考试时间也可由系统自动获取),学生管理系统后端服务读取 Redis,返回具体的考卷内容,浏览器端负责解析数据结构并呈现

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

理论上,Redis 单机 QPS 可达到 10 万/S,能够满足现有需求。但读取考卷对高可用要求比较高,引入 Redis sentinel 模式,因此至少需要 3 台服务器(奇数服务器,防止脑裂)。由于 sentinel 占用服务器资源不高,可在 3 台服务器上分别部署。

最终结论为,Redis sentinel 集群至少需要 3 台服务器,读性能在 20 万/s~30 万/s,写性能在 15 万/s 左右。

发布于: 刚刚阅读数: 5
用户头像

jiaoxn

关注

还未添加个人签名 2020.07.06 加入

还未添加个人简介

评论

发布
暂无评论
模块四:学生管理系统考试试卷存储方案_「架构实战营」_jiaoxn_InfoQ写作社区