写点什么

架构实战营-模块四作业

用户头像
fazinter
关注
发布于: 2 小时前
架构实战营-模块四作业

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

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

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

Redis 的数据结构设计


使用 redis 的 hash 结构存储。

存储试卷准确来说应该是存储考题,使用 redis 作为存储,是因为学生在线上考试时读取试卷试题的时候访问量很大,为了防止数据库崩溃,使用 redis 作为缓存。所以 redis 里存储当时考试时用的考题即可,考试过后就可以清空了。

考试页面应该是每页显示一道题,学生答完之后点下一道这种形式。

使用 hash 结构的原因是试题会有多种,有选择、判断、问答、填空几种形式,选择、判断、填空可以线上直接完成答题结果判断,redis 的数据里的 value 要存试题内容,答案,选择题要存选项,最好是分开存储,在后台程序调用的时候会比较方便,所以使用 hash 这种复合结构存储。

key 里要存的内容有试卷编号、题目编号,中间用分隔符分隔,比如试卷编号_题目编号,后端可以封装一个接口,传入试卷编号+题目编号从 redis 里查询考题。

例子

hset 001_001 topic XXXXXX     //插入题目hset 001_001 option XXXXXX    //插入选项hget 001_001 answer XXXXXX    //插入答案
复制代码


具体的读写流程



1. 开始考试后先从 redis 里读取考题,然后返回考题到页面上。

2. 然后学生填写答案,如果是选择题、判断题等固定答案的考题,学生点交卷后可以直接读 redis 里的答案进行比对,比对结果写入 HBASE。

3. 交卷后问答题等主观题的学生答题结果写入 HBASE,后续老师进行批阅。

Redis sentinel 集群的服务器数量和性能

第 6 课评估的考试时的 QPS、TPS 数据如下:

试卷请求 QPS:5 万/s

提交试卷 TPS:1700/s

提交试卷时非主观题可以直接读 redis 里的正确答案出结果,可以使用异步的方式实现,对 redis 不会有特别大的读取 QPS。所以只考虑请求试卷的 5 万/s 的 QPS。

redis 单机性能测试

在本机(CPU:2.4 GHz 四核,内存:16G)上执行性能测试命令,能支持 8 万左右的 qps。


集群数量

所以 Redis sentinel 集群服务器使用 1 主 1 从就可以支持试卷读取的 qps,了解到一般节点和 sentinel 都用奇数个节点,有利于防止脑裂。所以使用 3 节点哨兵集群,1 主 2 从,3 个哨兵分别和主从节点部署在一起。共需要 3 台服务器。

集群的性能

考试读取试卷的场景都是读的 qps,写时候是同步试卷的时候 qps 不会很高,可以不用读写分离。1 主 2 从都可以承载读请求。如果每台服务器和我本机一致用 4 核 16G,每台支持 8 万 qps,整体应该可以支持 24 万左右的 qps。

用户头像

fazinter

关注

卓有成效 2019.02.19 加入

烂的开始是成功的一半!

评论

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