千万级学生管理系统的考试试卷存储方案
考试试卷存储分析
总储存量= 每张试卷的储存量 * 课程数
课程数= 专业数量 *5 (假设只有 5 门课)
1.试卷的储存量每张试卷
假设 30 道选择题, 10 道简答题.
每道选择题 题干+选项 200 个汉字, utf8 600 字节, 考虑其他元信息, 算 700 字节, 700*30=21KB.
每道简答题 题干 300 汉字, utf8 900 字节, 考虑其他元信息, 算 1KB, 1KB*10=10KB.
所以每张题目试卷占用 31KB, 考虑有一些题目有图片, 图片 url 平均每条 100 字节, 20 张图片, 需要 2KB, 考虑其他一些信息, 每张试卷计为 35KB.
课程数
每年高等教育毕业 800 万人, 所以大学可能共有 3000 多万的在校生需要考试.每个大学的考试试卷都不同. 考虑假设每 200 人一个专业, 且每个专业课程都不同, 每个专业考 5 门课.
那么 需要存储 3000 万/200*5 =75 万份不同的试卷内容.
每份试卷 35KB, 75 万份, 需要 26.6G 的存储空间, 试卷内容因为大多数属于文本, 文本的压缩效果很好, 可以使用压缩算法进行压缩, 压缩比可达到 2 以上, 故可以直接将存储使用降为 13G
考试试卷 QPS 分析
3000 万学生考试, 假设每人有 5 场考试, 一共有 1.5 亿人场次考试需求.
考试周算 3 周左右, 周末不考试, 每天上午 2 场, 下午 2 场, 晚上 1 场, 即每天 5 场, 一共有 5*5*3=75 个考试场次时间. 考虑各地时钟不准, 以及大家动作快慢, 假设大家在开考后 1 min 内请求试卷, 假设请求平均分布在这 75*60=4500s 内,
那么请求 QPS 为 1.5 亿/4500s=3.3 万/s,
3.3 万/s 的请求量, redis 性能问题不大, 考虑流量问题, 这里可以做一个简单的优化, 逻辑服务保存当前场次试题信息作为缓存, 后续不再请求 redis. 总数据量 13G, 分为 75 个时间点, 所以应用缓存需要 200M, 问题不大.
假如部署 10 台逻辑层机器, 则穿透到 redis 的 qps 为 3.3 万/200(200 人一份试卷)/10(10 台机器)=16qps.
但如果直接请求回整个试卷数据给前端, 逻辑服务出口网络流量会比较高, 3.3 万/s*20K(假设为压缩后的试卷)=660M/s, 建议按题请求.
假如首次请求试卷元信息和首题, 1KB, 则逻辑服务出口流量降为 33M/s. 大大减轻系统压力和设备需求.
结论:
使用 32G 的机器跑 redis. 或者使用 redis 集群进行分片存储, 4 个分片, 单分片 8G.
应用层做缓存.
评论