架构训练营模块四作业
前言
设计千万级学生管理系统的考试试卷存储方案
1. 业务背景
作为学生管理系统的配套子系统,考试子系统允许老师为每门学科创建新的考试试卷,学生在同一时间登陆系统下载试卷并作答,结束时,上传答卷到系统内。
2. 约束和限制
系统需要支持 1000w 学生的考试需求
每名学生每年学习 20 门课,每门课有 2 次考试
每次考试有 20 道判断题,20 道选择题,4 道大题(答案在 200 字以内)
3. 总体架构
系统边界白盒图
考试系统架构图
3.1 架构分析
考试试卷存储系统主要由 Redis 系统实现。
3.1.1 高性能
假设 1000 万学生都在同一时间考试,老师必须在考试前一天完成试卷准备。考试开始前 1 分钟允许下载试卷,学生普遍在考试结束前 5 分钟内提交答卷。
从老师上传试卷到学生下载试卷中间间隔大于 24 小时,Redis Master 到 Slave 复制延迟不会造成读写不一致的情况发生
请求试卷的峰值:1000 万 / 60 秒 = 17 万/秒,根据网上Redis QPS的测试结果,2 个 Redis 节点可以满足 17 万/秒的读请求。
提交试卷的峰值:1000 万 / 300 秒 = 4 万/秒,根据课件资料里的数据单台 Redis 支持 5~10 万的 TPS。1 台 Redis 节点就可以满足所有的试卷提交请求。
根据以上的数据,一台 master 加两台 slave 的 Redis 系统,在任意一台服务器 down 机的情况下,仍然能满足试卷下载和答卷上传的峰值请求。
3.1.2 高可用
考试时,无论是试卷下载,还是答卷上传都必须保证高可用性,不然所有的学生都会受到影响。
存储系统采用 Redis Sentinel 体系来保证高可用性。如果 Redis master 服务器 down 机,Redis Sentinel 系统可以迅速发现问题,并将一台 Redis Slave 升级为新 master 服务器。
客户端通过查询 Redis Sentinel 的配置信息可以第一时间获得最新的 Master 服务器地址。
Redis Sentinel 本身也是服务器集群,保证本身的高可用性。
3.2 总体架构
一台 Master 和两台 Slave 组成的 Redis 存储系统
Master 支持读写,Slave 只能读取
Master 与 Slave 之间采用数据复制的方式进行同步
Redis Sentinel 系统保证存储系统的高可用性,Sentinel 系统本身由三台服务器组成
客户端每次读取 Sentinel 的配置信息获得最新的 Redis 服务器地址
4. 详细设计
4.1 核心功能
4.1.1 试卷读取
学生请求下载试卷
考试微服务查询 Redis Sentinel 获得最新的 Redis 服务器地址
考试微服务选择一台 Redis Slave 服务器请求下载试卷
4.1.2 答卷上传
学生请求上传答卷
考试微服务查询 Redis Sentinel 获得最新的 Redis Master 服务器地址
考试微服务连接 Master 服务器上传答卷
Master 服务器通过数据复制将新上传答卷同步到所有的 Slave 服务器
4.2 关键设计
4.2.1 考试试卷数据结构
Redis 采用 String 的数据结构
Key:试卷_<课程序列号>_<考试序列号>
Value: Json 格式的 String
Json 例子
4.2.2 学生答卷数据结构
Redis 采用 String 的数据结构
Key:答卷_<课程序列号>_<考试序列号>_<学号>
Value: Json 格式的 String
Json 例子
4.3 设计规范
服务器端和 Redis 的通信使用 Spring + Jedis
评论