模块四:学生管理系统考试试卷存储方案
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 左右。
版权声明: 本文为 InfoQ 作者【jiaoxn】的原创文章。
原文链接:【http://xie.infoq.cn/article/ba17124808f3a636efa3a8ec5】。文章转载请联系作者。
评论