写点什么

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

作者:五月雨
  • 2022 年 3 月 06 日
  • 本文字数:1110 字

    阅读完需:约 4 分钟

前言

本文是千万级学生管理系统中考试试卷存储方案的详细设计文档,用于指导后续的开发、测试和运维

词汇表

redis:一种键值存储数据库

redis sentinel:为保证 redis 高可用的工具

存储架构



存储分析

一张试卷大概 20 道选择题类,10 道简答题类。

选择题类一般是 200 个汉字,大概 800 个字节,算上额外元信息,就算 900 个字节

简答题类一般是 300 个汉字,大概 1200 个字节,算上额外元信息,就算 1300 个字节

则计算后,一张试卷大概有 20 * 900b + 10 * 1300b = 31kb


每次期中(期末)考试的试卷大概在 10000000 人数 * 20 (专业/人) / 100(人/专业) = 200 万份 不同卷子

由于试卷会越积越多,所以我们一般把试卷放入 HBASE 中进行存储,用 redis 做个缓存加速就够了。

每次期中(期末)考试的试卷存储大小在 2,000,000 * 31 kb = 62 gb 左右

由于每次期中或期末考试并不是一周全部考完,一般是分成 4 周,我们只将单周的试卷缓存进 redis

则 redis 缓存的数据为 62 / 4 周 = 16G 左右

所以 redis 的机器最好内存为 32G 以上


QPS 分析

假设学校的考试都安排在某一个月内,考试的时候请求试卷,提交答案,中间答题过程浏览器本地完成,由于考试集中在上午 4 小时和下午 4 小时, 且请求试卷集中在考试开始的前 1 分钟,提交答案集中在考试结束前的 30 分钟,因此估算如下:

请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒

redis 可以承受住 5 万的 QPS 没有问题

但是流量问题,由于试卷大小为 31kb,则每秒需要传输的流量为 31kb * 50,000/s = 1500mb/s

流量压力比较大,所以我们最好采用分页进行读取,比如一页只显示 5 题,初次只加载 5 题,翻页后再加载后 5 题

则流量可以降低为 1500 / (30 / 5) = 250mb/s 可以接受的地步

由于我们每次只读取部分题目,所以我们就不能采用 string 数据类型,得使用 list 或者 hash 结构,只有这种才能进行部分有序读取。


数据结构设计

使用 redis 的 list 数据结构

key:考试 id

value: [基础信息,题目 1,题目 2,...]

其中:基础信息,题目 1,题目 2 都是 json 格式的字符串


读写分析

写分析:老师出好试卷后,写入持久化存储(mysql 或者 HBASE),设置考试的日期,在考试到来时,自动将考试试卷读取后放入 redis 中缓存(按照题目顺序放入 list 数据格式中)(由于是在考试前进行,随时都可以做,所以并不需要高并发,可以排队做)

读分析:考试开始前一分钟,开始根据 key 读取 list 中前几项(试卷的基础信息和前 5 题)进行展示,点击下一页再读取 list 中展示后 5 题。


配置分析

服务器数量为 3 台即可,每台配置为 32G 以上即可,因为 sentinel 集群要实现高可用,至少需要 3 台。

50000 qps / 3 ≈ 20000 qps。

所以每台只需要承受不到 2 万的 qps 完全可以接受。

所以使用 3 台 32g 的服务器组建 redis sentinel 集群即可。

用户头像

五月雨

关注

还未添加个人签名 2021.12.12 加入

还未添加个人简介

评论

发布
暂无评论
千万级学生管理系统考试试卷存储设计_架构实战营_五月雨_InfoQ写作平台