写点什么

重学架构之千万级学生管理系统的考试试卷存储方案

作者:陈华英
  • 2022 年 3 月 06 日
  • 本文字数:1336 字

    阅读完需:约 4 分钟

前言

文本是学生管理系统考试试卷存储方案,用于指导考试试卷存储方案的开发与落地。

1 业务背景

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

2 约束与限制

考试试卷永久保存

本期不考虑试卷中有图片的情况

3 用户行为建模和性能估算

假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,

且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,

因此请求试卷估算如下:

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

试卷存储空间估算:

查询以我毕业高校本科生专业目录,96 个专业,每个专业的学生平均 20 门课程,

假设判断题平均 50 个汉字,选择题平均 150 个汉字,大题 100 个汉字,统一采用 UTF8 编码,每张试卷的大小:(20 * 50 + 20 * 150 + 4 * 100)* 3 = 13200 Byte

1)每年试卷存储

96(专业) * 20(课)* 2(次)* 13200 = 50688000 ~= 48 MB

假设平均每所高校 3 万人,可接入 1000 / 3 ~= 300 所高校,

总存储空间:300 * 48 MB ~= 15 GB

同专业不同学科之间有部分课程是相同的,估算每年试卷存储 15 * 80 % = 12 GB

2)每天试卷存储估算

一年考试两次,一学期为 6GB,考试时间为 20 天,平均每天 300MB

请求试卷的带宽总占用

50000 QPS * 13200 * 8 = 4.9 Gb

4 存储系统选择

1) 当前考试数据存储

考试需要支持高并发量,支持 5w QPS,redis 单机可支持,存储数据量 redis 单机可支持,考试期间需要保证服务高可用,需要故障自动切换功能;因此选用 redis sentinel 存储方案

2) 考试全量数据存储

全量数据每年新增 12GB,考虑到业务增长,系统长时间运行全量数据会很大,单机无法支持,因此需要采用分片架构。

试卷内容与考试信息、考试成绩、学生信息等关联不大,可以不用关系型数据库,可以用 HBase 存储全量数据。

5 存储方案设计

1) 当前考试试卷

不同的学校分在不同的 DB 中,db 为学校 ID;

考虑到试卷创建后,不会被修改,直接使用 list 存储;

key:课程 ID

value:[[题目类型, 内容], ...]

题目类型:1 判断题,2 选择题, 3 大题

内容为 json 格式,{"stem": "题目内容", "options":[items...]}

读写分析

开始考试前,系统在全量试卷信息中查询考试试题,将考试试卷数据以 list 的方式,写入到 redis sentinel 集群中,设定过期时间为两小时;

开始考试后,在学校 ID 的 db 中,以课程 ID 为 key 读取试卷试题。

2)全量试卷数据

不同的学校数据分布在不同的 table,表名为学校 ID;

row key:课程 ID + 学期(YYYY_X,如 2022_1,表示 2022 年第一学期)

column family: exam

column:type 题目类型,stem 内容, options_num 选项数量,options_n 选项内容

读写分析

老师录入考试题并提交,在学校 ID 的 table 中以 row key 写入考试内容,考试基本信息写入数据库中;

查询考试试题,或开始考试加载考试试题时,在学校 ID 的 table 中以 row key 读取考试内容。

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

sentinel 机器 3 台,1 核,1G 内存

由于 redis 单进程模型,考虑到操作系统其它进程,使用 2 台作为数据节点,一主一从,2 核 2G 内存


用户头像

陈华英

关注

还未添加个人签名 2017.10.17 加入

还未添加个人简介

评论

发布
暂无评论
重学架构之千万级学生管理系统的考试试卷存储方案_架构实战营_陈华英_InfoQ写作平台