写点什么

架构实战营模块 4 作业

用户头像
子豪sirius
关注
发布于: 4 小时前

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

1. 估算性能

1.1 场景假设

  1. 按照模块 4 第 6 课的估算,在校学生有 1000 万,每个学生平均一个学期 20 门课。

  2. 在学生层面,这 20 门课要在一个月内考完;在学校层面,这一个月内每天只安排 4 个时间段进行考试(上午考两门,下午考两门)

  3. 每门考试 20 判断题,20 选择题,4 道大题。假设判断题和选择题题目描述 100 个字以内,大题描述 200 个字以内,选择题有 4 个答案选择,每个答案 10 个字以内。总共需要:20 * 100 + 20 * 100 + 20 * 4 * 10 + 4 * 200 = 5600 个字。

  4. 假设每个中文字存储 3 个字节(UTF-8),5600 * 3 = 16800 字节,计算方便,约 20KB

  5. 假设每门课程有 40 人参与考试,这个 40 人是同一份试卷,试卷总存储量为:1000 万 * 20(课) / 40 * 20KB = 100GB

1.2 性能估算

  1. 按照模块 4 第 6 课估算,请求试卷 QPS 为 5 万/秒

  2. 试卷在考试前一天才需要放上存储,20 天考试,每天试卷数据存储量 100GB / 20 = 5GB

2. 选择存储系统

  1. 为应对请求试卷 QPS 为 5 万/秒的要求,采用 Redis Sentinel

  2. 每天试卷存储的数据是 5GB,单机的内存存量完全能胜任

  3. 最终方案是 Redis Sentinel

3. 设计存储方案

3.1 Redis 数据结构设计

  1. 采用散列 Hashmap 的数据结构

  2. Redis 数据的 Key 为学校 ID

  3. Value 为一个 Hashmap

  4. Hash 的 key 为考试 ID,Value 是试卷;通过学校 ID+考试 ID 可以定为到一份试卷

  5. 试题采用 JSON 结构保存的 String,评估大约 20KB

  6. 老师可预先出好试卷在 MySQL 存储

3.2 存储架构图

  • 采用三台 Redis 机器作一主二从配置

  • 三台 Redis 机器同时起三个 Redis Sentinel 作高可用

3.4 读写流程

  1. 考试前一天,试卷加载到 Redis 保存,设置试卷数据保存时间为一天。

  2. 学生在考试开始 1 分钟前,通过学校 ID+考试 ID 请求试卷

  3. 从 Redis 获取考试数据(JSON 格式),存储在浏览器缓存里

  4. 学生提交考试,考试结果存储在 HBase 集群。

3.5 服务器数据及性能

  1. 采用三台服务器,每台 4C / 64GB 内存

  2. 三台服务器进行接收读请求,每台支持 2 万/s QPS

用户头像

子豪sirius

关注

还未添加个人签名 2018.05.03 加入

还未添加个人简介

评论

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