写点什么

架构实战营模块 4 作业

  • 2022 年 6 月 19 日
  • 本文字数:1032 字

    阅读完需:约 3 分钟

设计千万级学生管理系统的考试试卷存储方案

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 考试场景性能需求汇总

  1. 试卷请求 QPS:5 万/s

  2. 提交试卷:1700/s

  3. 试卷存储容量:8GB

4.2 集群预估

  1. 搭建 sentinel 至少需要 3 台服务器,每台服务器都各有一个 redis 实例和 sentinel 实例

  2. Redis 主从关系为一主两从

  3. Redis 单机的 QPS 在 5-10 万左右,完全满足需求

  4. redis 中只需存储考试试卷,需要 8G 内存

综上,需要 3 台 4 核 16G 服务器即可。

发布于: 刚刚阅读数: 6
用户头像

还未添加个人签名 2018.09.21 加入

还未添加个人简介

评论

发布
暂无评论
架构实战营模块4作业_架构实战营_挖了蘑菇哩斯_InfoQ写作社区