写点什么

架构实战营 - 模块 4- 作业

用户头像
carl
关注
发布于: 2021 年 05 月 18 日

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

【作业要求】基于模块 4 第 6 课的估算结果和 Redis sentinel 的初步方案设计,完善考试试卷存储方案,具体包括:1)完善 Redis 的数据结构设计,明确具体使用哪种 Redis 数据结构 2)设计具体的读写流程(可以文字描述也可以序列图描述,序列图要有文字辅助说明)3)对照模块 4 第 6 课的性能估算结果,计算 Redis sentinel 集群的服务器数量和性能

【提示】1.性能可以有一定冗余 2.如果对 Redis sentinel 不熟悉,请参考官方文档:https://redis.io/topics/sentinel


一. 考试试卷存储方案之 Redis 的数据结构设计

问卷使用 List 结构,存储在 redis 里,结构设计如下:

key: 学校 ID + 科目 + 试卷 ID(试卷 ID 全局唯一)

value: 一道题一个元素, 每个元素的结构:

{

"exam_question_id": 1, // 试题序号

"exam_question_content": "试题问题 1", //试题内容

"exam_question_type": 1, //试题类型: 1:单选题 2:多选题 3: 判断题 4: 主观题

"options": "{"A":"选项 A 内容","B":"选项 B 内容","C":"选项 C 内容","D":"选项 D 内容"}" // 选项,仅 exam_question_type 为 1 或 2 时才出现该元素

},

{

"exam_question_id": 2, // 试题序号

"exam_question_content": "估算的时候不一定要非常精确,有时候为了计算方便,可以四舍五入",

"exam_question_type": 3 //试题类型: 1:单选题 2:多选题 3: 判断题 4: 主观题

},

{

"exam_question_id": 3, // 试题序号

"exam_question_content": "如果考虑分区架构,整体存储架构如何设计?", //试题内容

"exam_question_type": 4 //试题类型: 1:单选题 2:多选题 3: 判断题 4: 主观题

}


二. Redis 的读写流程

读流程

当学生请求试卷的时候,通过 key 从 redis 中取获取试卷的内容,把 list 的内容反序列化出来,返给前端渲染即可


写流程

由教师通过 web 前端编辑试题录入 redis

三. Redis 的 sentinel 集群的服务器数量和性能评估

(图一)

(图二)


读性能分析

由之前分析可知,请求试卷的 QPS 为 5 万/s ,单机 redis 基本可以抗住,但是考虑到高可用,还是需要做 sentinel 集群

存储容量分析

根据教育部的数据,截至 2020 年 6 月 30 日,全国高校共计 3000 所左右,根据图一的推论,假设试卷问题的文字量是答案的 10 倍,那么试卷的每年的存储量为:

全国高校数量(3000) * 20(课) *2(考试次数) *10000(试卷问题)*2(学期)*1(1 年的考试)= 2.4G

以该系统需保持近 4 年的试卷来预估存储量,那么大约需要 9.6G 内存,单机 redis 基本可以抗住,但是考虑到高可用,还是需要做 sentinel 集群,共需 6 台服务器,集群配置如下:


  • Redis sentinel 3 台,保证自身高可用

  • Redis 1 主 2 从 共 3 台, 每台内存配置至少 16G


用户头像

carl

关注

还未添加个人签名 2018.04.27 加入

还未添加个人简介

评论

发布
暂无评论
架构实战营 - 模块 4- 作业