模块四作业 - 设计千万级学生管理系统的考试试卷存储方案
1. 业务背景
学生数 1000 万,门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以内)
2. 性能估算
•请求试卷:1000 万* 20(课)/ 20(周末不考试)/ 4(每天 4 堂考试)/ 1 分钟= 250 万请求/分钟≈ 5 万/每秒。
•提交试卷:1000 万* 20(课)/ 20(周末不考试)/ 4(每天 4 堂考试)/ 30 分钟= 1700/每秒。
3. 存储方案
3.1 试卷的 Redis 数据结构:String
Key:考试 ID
格式:学校 ID +课程 ID + 4 位学年+ 1 位学期标志(0:上学年;1:下半学年)+ 1 位考试标志(0:平时测试;1:期中测试;2:期末测试)+8 位考试日期
Value:json 字符串
格式:
{
“Q_count”:”44”
“Q_list”: [
{
“Q_type”:”1”,
“Q_No”:”1”,
“Q_content”:”判断题内容 1”
},
{
“Q_type”:”2”,
“Q_No”:”21”,
“Q_content”:”选择题内容 1”
},
{
“Q_type”:”3”,
“Q_No”:”41”,
“Q_content”:”问答器内容 1”
}
。。。
]
}
value 值大小:假设平均每道题 200 个字节,json 格式辅助信息平均每题 100 个字节,每个试卷 44 道题目,因此 json 字符串大小约为 13K 字节。
(200 + 100 ) * 44 / 1024 ≈ 13K
3.2 考试读写流程
![](https://static001.geekbang.org/infoq/21/210123721fab77524fe3ac29eac3ede5.png)
学生进入考试页面后,考试系统从 redis 集群读取试卷信息,通过数据解析和渲染,把试卷展现给学生。
学生做题时,每道题的答案缓存在浏览器中。学生提交答案时,将所有答案提交给考试系统。因提交答案业务处理不复杂,同时 1700/每秒的 TPS,估计数据库集群可以承受,因此先不设计消息队列。如提交不成功,提示学生稍后再重试,交卷时间以第一次提交为准。
3.2 Redis sentinel 集群的服务器数量
服务器数量
1 主,2 从,3 哨兵
性能
单机 redis 支持 10 万 QPS,本集群有 3 数据节点,可支持 30 万 QPS,因此支持 5 万 QPS 没有问题。
版权声明: 本文为 InfoQ 作者【卡西毛豆静爸】的原创文章。
原文链接:【http://xie.infoq.cn/article/1da7778a9a27a80f7591043fd】。文章转载请联系作者。
评论