【架构实战营】第 4 模块作业
【作业题目】
设计千万级学生管理系统的考试试卷存储方案
【作业要求】
基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:
1)完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构
2)设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)
2)对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能
【提示】
1. 性能可以有一定冗余
2. 如果对 Redis sentinel 不熟悉,请参考官方文档:https://redis.io/topics/sentinel
【作业内容】
【为什么用 Redis sentinel】
考试试卷存储,主要用于以下两个场景:
1.老师在考试前提交试卷内容;
2.学生在考试前一分钟读取试卷内容;
根据实战案例中的估算:
第一项是写请求,每张卷子只需要上传一次,可以不考虑 TPS;
第二项是读请求,峰值很高,QPS=5 万/s;
由于读请求峰值很高,使用 Redis sentinel 实现读写分离,并能充分利用 Redis 的性能优势。
【数据结构设计】
Redis 的数据结构使用使用 Sorted set,有序但不重复,用提交时的题目序号作为 score。
数据结构设计如下:
Key:学校 ID + 考试 ID
数据类型使用 Sorted set:以题目类型作为 score,如选择题 1, 判断题 2, 大题 3
如:
1.1: 选择题 1 题目
1.2: 选择题 2 题目
2.1: 判断题 1 题目
2.2: 判断题 2 题目
3.1:大题 1 题目
这样做的好处是可以自动排序,并且可以自动扫描去重。
【读写流程】
1. 老师提交试卷内容,新建一个 key,将考试内容写入存储
2. 学生请求试卷内容,通过查询 Key,以 score 升序排列,读取试卷内容。
【服务器数量和性能】
单个 Redis 服务器能承载的 QPS 在 5 万/s 左右,因此需要三台服务器。
一台 Master 主数据节点,一台 slave 从数据节点,一台 Sentinel 监控服务器。
从节点能够分担读请求,如果一个主节点没有按照预期工作,Sentinel 会开始故障转移过程,把一个从节点提升为主节点。
请求试卷峰值:
1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒
Redis sentinel 能够承担 5-10 万/每秒的 QPS。
评论