架构实战营模块 4 作业
【作业题目】
设计千万级学生管理系统的考试试卷存储方案
【作业要求】
基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:
1)完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构
2)设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)
2)对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能
【提示】
1. 性能可以有一定冗余
2. 如果对 Redis sentinel 不熟悉,请参考官方文档:https://redis.io/topics/sentinel
性能分析
假设每个大学平均 5 万人,1000 万人大概有 200 所大学,假设每所大学平均 100 个专业,每个专业设置 20 门课,则试题种类有 200(所大学)*100(个专业)*20(门课程)=40 万种试题
假设每道题题目描述平均 300 字,每个试卷的大小为:44(道题)*200(中文字)*3(字节,UTF8 编码)=26400 字节 大约为 26Kb
那么一年的考试试卷需要的存储空间为 40 万*26Kb*2(次考试)=20800000Kb 大约为 20GB,此外,还需要预留一定空间来存储
该容量单机内存足够存储,因此 redis sentinel 数据节点采用一主两从,每台内存为 32G,sentinel 节点采用 3 个,总服务器至少 6 台。
由于 1000 万学生的答题信息比较庞大,对读写性能要求比较高,可以可以存放在 hbase
如果题目和答案涉及图片,图片存储在专门的 oss 图片服务器上,利用 cdn 加速
根据之前第 6 课对于 QPS 的预估为 5W,根据 redis 的读性能,足够满足
数据结构
redis 数据结构
考试信息
采用 list 结构
key:学校 id+考试 id
value:list 存放习题 id+习题内容
hbase 数据结构
对于客观题,只需要一张表
(习题成绩表)
table:成绩反馈表
row key:学生 id+考试 id+习题 id
column:题目信息,习题答案,学生答题情况,得分,答题反馈,考试信息,答题时间
对于主观题,需要两张表
数据结构 1
table:答题情况表
row key:学生 id+考试 id+习题 id
column:题目信息,习题答案,学生答题情况,答题时间
数据结构 2(习题成绩表)
table:成绩反馈表
row key:学生 id+考试 id+习题 id
column:题目信息,习题答案,学生答题情况,得分,答题反馈,考试信息,批改时间
读写场景
考试前一天,试卷加载到 Redis 保存,设置试卷数据保存时间为一天。
学生在考试开始 1 分钟前,通过(学校 id+考试 id)请求试卷
从 Redis 获取考试数据(JSON 格式),存储在浏览器缓存里
学生提交考试,考试结果和答案存储在 HBase 集群。
老师批改作业,查看学生答题
学生查看成绩,可以通过学生 id+考试 id 在 hbase 查询成绩表
评论