架构实战营 - 模块四作业
一、设计千万级学生管理系统的考试试卷存储方案
作业要求:
基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:
完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构
设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有问题辅助说明)
对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能
1.1 千万级学生管理系统考试试卷存储性能需求估算
1.1.1 存储量评估
假设每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题(答案 200 字以内),考试结果永久保存,在校学生能够看到自己曾经的考试结果,则考试结果记录的存储量为:
在校学生:1000 万* 20(课)* 2(考试次数) * 1000(答案)* 2(学期) * 3(只有前三年考试)= 2.4T
离校学生:每年 250 万,存储量每年增长 0.6T
1.1.2 请求量评估
假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成。由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:
请求试卷:1000 万* 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 ≈ 5 万/每秒
提交试卷: 1000 万* 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟= 1700/每秒
1.2 千万级学生管理系统考试试卷存储系统选择
依据评估的存储量和请求量,单机可以存储所有数据,单机可以支撑写性能,单机可以支撑读性能,需要自动切换,决定采用 Redis sentinel 的存储方案。
1.3 千万级学生管理系统考试试卷存储方案设计
1.3.1 数据结构设计
基于 sorted set 有序,且数据不重复的特性,选择 sorted set 数据结构
考试试卷结构:
key:学校 ID + 课程 ID + 学期
score:题号
value:相应题号的题目以 string 存储
试卷答案结构:
key:学校 ID + 课程 ID + 学期+ 学号
score:题号
value:相应题号的题目和答案以 string 存储
1.3.2 读写流程
老师写出题试卷:
老师出题时,以"学校 ID + 课程 ID + 学期"为 key,将每道题写入到 redis。采用 sorted set 结构,题号为 score,题目内容为 value。
学生读出题试卷:
学生答题时,以"学校 ID + 课程 ID + 学期"为 key,获取考试试卷。
学生写答案试卷:
学生将答题试卷,以"学校 ID + 课程 ID + 学期+ 学号"为 key,将题目和答案存储到 redis 中。
老师读答案试卷:
老师 scan 获取所有学生的试卷,进行批改,批改之后重新写回。
1.3.3 Redis sentinel 集群
redis 性能量级:单机 TPS 5~10 万
考试试卷请求量:请求 TPS 5 万/s
依据 redis 的性能量级和考试试卷请求量级,且保障系统的高性能和高可用,采用一主两从三哨兵的 Redis sentinel 架构。
编辑删除
版权声明: 本文为 InfoQ 作者【Sun】的原创文章。
原文链接:【http://xie.infoq.cn/article/54786a376633d7205691200f3】。文章转载请联系作者。
评论