架构实战营 - 模块四作业
需求分析,项目是一个千万级的学生管理系统中的一个试卷存储解决方案,虽然整个系统是千万级学生管理系统,但是考试是个比较特殊的场景,他是一个可以提前预知业务并发峰值且可以相对准确计算出峰值时间和并发量的业务场景因此实际上设计并不那么复杂,另外虽然千万级的系统但是考试这个场景下的数据是相对独立的,每个学校之间的数据相互访问量是很低的,且大部分的学校学生人数是差不多的。因此可以考虑以学校为单位对存储进行分区。
一、Redis 数据结构设计
1.试卷内容存储:采用 String 将试卷的内容 json 格式化后存入 String,以考试号为 key
2.试卷选择题答案存储:使用 set 方式,将考试号_题号_答案作为 key 进行存储,value 存入分值
3.学生的答题结果存储:使用 set 方式,将考试号_学号_题号作为 key 进行存储,value 存入答案
4.学生的试卷成绩存储:使用 sorted set 存储,将考试号_学号作为 key 进行存储,score 存入本次成绩
5.考试完成批阅操作后数据全部落 mysql。redis 数据全部清除
二、读写流程
1.试卷封卷后系统会将试卷内容从 mysql 读取到 redis 中,以 String 方式存储。并且将选择题答案生成一套 set 集合用于快速判定答案
2.开考时学生会读取 redis 中存储的试卷内容,并将 string 解析为 json 数据,最终呈现在学生面前
3.学生提交题目答案时使用 set 方式,将考试号_学号_题号作为 key 进行存储,value 存入答案
4.学生选择交卷后系统读取用考试号_学号_*方式读取该学生的所有答案,并读取选择题的答案,进行判断并以考试号_学号作为 key 将成绩存入
三、性能设计
首先采用以学校为维度将数据做第一层分区,根据每个学校的人数预设 10w 学生为一分片,大致就是 10-20 个学校为一个分区,总共建立 100 个分区。然后在以 10w 学生的一个分区 redis 的架构设计。
10w 学生考试同步提交答案最大并发应该为 1w,极限并发为 10w。给予这个性能要求,我们采用 Redis sentinel 的主从模式进行设计。每个分区使用 2 台服务进行主从,redis 单台时可以支撑 10w 并发的极限,因此我们使用 2 台进行主从式足以满足性能要求的。
最终整个系统在极限情况下需要 200 台 redis 进行考试的支撑。但是由于考试场景的特殊我们时可以预知性能要求的,所以我们可以动态的将现有的 redis 调度给不同时间考试的学校使用。并且动态的启动和关闭 redis。实际期末考试时应该使用的服务器不会 100 台。
版权声明: 本文为 InfoQ 作者【Alex.Wu】的原创文章。
原文链接:【http://xie.infoq.cn/article/c50af19d9381d01c80ff325fa】。未经作者许可,禁止转载。
评论