架构实战营模块 4 作业
设计千万级学生管理系统的考试试卷储存方案
1. 估算性能
1.1 场景假设
按照模块 4 第 6 课的估算,在校学生有 1000 万,每个学生平均一个学期 20 门课。
在学生层面,这 20 门课要在一个月内考完;在学校层面,这一个月内每天只安排 4 个时间段进行考试(上午考两门,下午考两门)
每门考试 20 判断题,20 选择题,4 道大题。假设判断题和选择题题目描述 100 个字以内,大题描述 200 个字以内,选择题有 4 个答案选择,每个答案 10 个字以内。总共需要:20 * 100 + 20 * 100 + 20 * 4 * 10 + 4 * 200 = 5600 个字。
假设每个中文字存储 3 个字节(UTF-8),5600 * 3 = 16800 字节,计算方便,约 20KB
假设每门课程有 40 人参与考试,这个 40 人是同一份试卷,试卷总存储量为:1000 万 * 20(课) / 40 * 20KB = 100GB
1.2 性能估算
按照模块 4 第 6 课估算,请求试卷 QPS 为 5 万/秒
试卷在考试前一天才需要放上存储,20 天考试,每天试卷数据存储量 100GB / 20 = 5GB
2. 选择存储系统
为应对请求试卷 QPS 为 5 万/秒的要求,采用 Redis Sentinel
每天试卷存储的数据是 5GB,单机的内存存量完全能胜任
最终方案是 Redis Sentinel
3. 设计存储方案
3.1 Redis 数据结构设计
采用散列 Hashmap 的数据结构
Redis 数据的 Key 为学校 ID
Value 为一个 Hashmap
Hash 的 key 为考试 ID,Value 是试卷;通过学校 ID+考试 ID 可以定为到一份试卷
试题采用 JSON 结构保存的 String,评估大约 20KB
老师可预先出好试卷在 MySQL 存储
3.2 存储架构图
采用三台 Redis 机器作一主二从配置
三台 Redis 机器同时起三个 Redis Sentinel 作高可用
3.4 读写流程
考试前一天,试卷加载到 Redis 保存,设置试卷数据保存时间为一天。
学生在考试开始 1 分钟前,通过学校 ID+考试 ID 请求试卷
从 Redis 获取考试数据(JSON 格式),存储在浏览器缓存里
学生提交考试,考试结果存储在 HBase 集群。
3.5 服务器数据及性能
采用三台服务器,每台 4C / 64GB 内存
三台服务器进行接收读请求,每台支持 2 万/s QPS
评论