考试试卷存储方案
仅考虑试卷存储和访问,不考虑学生考试成绩存储方案。已确定使用 Redis 方案。
性能估算
请求试卷:1000 万 * 20(课)/ 20(周末不考试) / 4(每天 4 堂考试)/ 1 分钟 = 250 万请求/分钟 ≈ 5 万/每秒。
写入试卷:读写比 1000 万 :1,写入性能要求忽略不计
数据大小:假设 1000 个学校,每个学校 20 个专业,每个专业一学期 50 次考试,每套试卷 1MiB
1000*20*50*1MiB ≈ 1TiB(每学期更换试卷,暂不考虑数据增长)
数据结构设计
总体结构
Redis 支持的 String value 大小可以达到 512 MiB。虽然本方案中试卷大小约 1MiB 可以直接存储 JSON String,但大对象意味着单个请求需要传输更多数据量,网络等因素可能引起错误概率提升。所以,本方案中将试卷拆分为 3 个模块,判断题,选择题和问答题。
降低单个请求数据量,减少错误概率。
试卷除首页外,其他页的数据请求分散开,降低峰值。
数据结构
key:学校 id+试卷 id+试卷模块
value:- 判断题和问答题采用 Lists
- 择题分题目和选项,Redis 不支持嵌套复杂对象。20 道选择题不适合拆分 key,因为会急速增加请 求数量,所以就直接存 JSON String
业务流程
试卷写入:考试前老师讲试卷录入系统(持久化存储),同时讲试卷按上述结构写入 Redis 集群
试卷读取:开始考试后,所有考试电脑读取试卷首页判断题/选择题。然后根据考试答题速度再依次请求后续题目。
服务器集群
Redis 单机 QPS 在 5-10 万,本方案中对试卷模块进行了 key 拆分,理论峰值 5*3=15 万。从 QPS 和试卷数据量看,单台 Redis 服务基本无法提供可靠服务。所以采用 Redis Cluster 方案做数据 sharding。
版权声明: 本文为 InfoQ 作者【极客土豆】的原创文章。
原文链接:【http://xie.infoq.cn/article/f936a02c7e23c68c1589b6f33】。文章转载请联系作者。
评论