学生管理系统考试试卷存储方案设计
前言
本文是千万级学生管理系统考试试卷存储系统的详细方案设计文档,用于指导后续数据存储的开发、测试和运维。
修订历史
[可选,文档会因为各种原因导致修订,通过修订历史来记录变更情况]
词汇表
Redis:Remote Dictionary Server,是一个开源(BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
1. 业务背景
对于千万级学生系统,在考试期间,学生在线考试时,对试卷数据的请求峰值高,且对系统的响应时长有较高要求,因此试卷的存储方案提出了以下几点要求:
1、高并发场景下,系统稳定可靠
2、较低的响应速度
2. 约束和限制
1、支撑 1000 万学生系统访问试卷存储系统
2、使用 redis 存储
3. 总体架构
试卷存储使用 redis cluster 存储,通过部署 redis sentinel 保证高可靠。
3.1 架构分析
数据估算:
学生数量 1000 万,假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时, 且请求试卷集中在考试开始的前 1 分钟,提交试卷的性能估算为 5 万请求/秒。
假设有 100 个学校,每个学校每年有 200 门课程需要考试,试卷各不相同,每年试卷数量为 2W。每份试卷包括 20 判断题、20 选择题、4 道大题(答案 200 字以 内)
3.1.1 高性能
如上面数据估算,试卷存储系统对查询性能要求比较高,同时试卷数据量比较小,试卷本身需要存储的内容比较少,故可以考虑使用 Redis 存储数据以供读取使用。
3.1.2 高可靠
由于每年的试卷数量相对比较平稳,不会出现突然变大、或者线性增长的情况,对存储系统的容量大小几乎没有什么压力,无需考虑后续扩容,故采用 redis sentinel 模式保证 redis 存储系统的高可靠。
考虑到试卷数据不能丢失,所以试卷数据保存到 redis 的同时,也要保存到 mysql 数据库一份(mysql 主备),降低数据丢失的可能性。
3.1.3 可扩展
试卷数据量比较小,暂不考虑可扩展性。
3.2 总体架构
1、采用 mysql 主备存储所有试卷数据,用于写试卷数据。
2、采用 redis sentinel 存储当年的试卷数据,用于读取试卷。
4. 详细设计
4.1 核心功能
1、考试月期间,教师登录学生管理系统,录入/修改试卷数据,删除相同 redis key 的数据,保存试卷数据到 mysql 数据库,再将数据保存到 redis 中(有效期为 2 个月),都保存成功则返回成功,数据失败则都返回失败,需要重新保存。
2、考试开始后,学生登录学生管理系统,获取考试的试卷编号信息,点击开始考试,去 redis 中获取试卷信息,如果试卷信息不存在,则需要去数据库中获取,并将试卷信息再保存到 redis 中。
3、考试结束,学生在学生管理系统中,提交试卷,将试卷结果信息保存到 HBase 数据库中。
4.2 关键设计
4.2.1 redis 数据结构
key:课程编号+年份+试卷编号
value:试卷数据使用 zset 数据结构保存,zset 中每个元素为一个实试题
有效期:1 个月
4.2.3 部署架构
redis sentinel 3 台集群
redis 1 主 2 从,内存:32G
4.3 设计规范
1、学生管理系统使用 java 开发,使用 redisson 开源组件接入 redis
5. 质量设计
5.1 可测试性
redis 有不少可视化工具可以直接查看 redis 资源情况,也可以通过工具(redis-rdb-tools)分析 redis 的性能使用情况。无需特殊设计。
5.2 可维护性
使用 redis 可视化工具维护,无需特别考虑
5.3 可观测性
使用 redis 可视化工具观测,无需特别考虑
5.4 成本
不涉及
6. 演进规划
[必选,可以是演进规划,也可以是项目计划,需要描述每个里程碑或者版本具体要实现的能力]
[样例:
6.1 消息队列一期
6.2 消息队列二期
]
[技巧:开发阶段快速迭代,小步快跑,但要基本完善后才能正式推出给其他人用]
评论