架构实战营模块 4 作业
设计千万级学生管理系统的考试试卷存储方案
1. 性能估算
1.1 计算性能
假设每门学科每年 2 次考试,每个学生平均一学期 20 门课,考试采取机考的方式,每门考试的答案 20 判断题、20 选择题、4 道大题。
假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时,且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:
请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
提交试卷: 1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 30 分钟 = 1700/每秒。
1.2 存储性能
假设每道选择题和判断题的描述平均 100 字以内,选择题的四个选项平均 10 个字,大题的题目描述平均 200 字以内,一张考试试卷的共有:20 * 100 + 20 * 100 + 20 * 4 * 10 + 4 * 200 = 5600 个字;
如果假设使用 UTF-8 的编码格式,中文字符按 3 个字节来存储,则一张试卷占用的空间为:5600 * 3Byte = 16800 Byte,近似估算为 20KB;
假设 1000 万学生,平均每场考试有 50 人参加,一个学期所有的考试数量为:1000 万 * 20(课) / 50 * 20KB = 80GB;
假设考试试卷在考前一天提前被加载到 redis 中缓存,那么留出两倍余量,Redis 容量要求为:80GB / 20(周末不考试) * 2 = 8GB
1.3 结论
试卷写入的请求量很低,但读取的请求量接近 5 万/每秒,是一个低写入、高读取的存储系统。同时估算的数据量在留出余量之后总共只有 8GB,单机的内存容量能够胜任这个要求,适合使用 Redis Sentinel 的方案。
2. 数据结构设计
数据结构:直接采用 Redis String
Key: 学校 ID + 考试 ID
Value: 试卷内容,使用 JSON 格式存储
3. 读写流程
3.1 写流程
老师在考试系统上编辑好试卷后,发布试卷以及选定考试时间,数据会先记录到 mysql,等到考试前一天,考试系统自动将考试试卷取出,通过学校 ID 和考试 ID 进行编号,存入到 Redis 中。
3.2 读流程
学生登录考试系统之后,在考试前一分钟,考试系统通过学校 ID + 考试 ID 到 Redis 中读取考试试卷的内容,系统将请求到的试卷展示在浏览器中。
4. Redis sentinel 集群预估
4.1 考试场景性能需求汇总
试卷请求 QPS:5 万/s
提交试卷:1700/s
试卷存储容量:8GB
4.2 集群预估
搭建 sentinel 至少需要 3 台服务器,每台服务器都各有一个 redis 实例和 sentinel 实例
Redis 主从关系为一主两从
Redis 单机的 QPS 在 5-10 万左右,完全满足需求
redis 中只需存储考试试卷,需要 8G 内存
综上,需要 3 台 4 核 16G 服务器即可。
版权声明: 本文为 InfoQ 作者【挖了蘑菇哩斯】的原创文章。
原文链接:【http://xie.infoq.cn/article/5b286ed3f20b7cd275e5e2041】。文章转载请联系作者。
评论