架构课程第 4 次作业
考试试卷存储
使用 32G 的机器跑 redis. 或者使用 redis 集群进行分片存储, 4 个分片, 单分片 8G.
应用层做缓存.
存储量分析
每张试卷假设 30 道选择题, 10 道简答题.
每道选择题 题干+选项 200 个汉字, utf8 600 字节, 考虑其他元信息, 算 700 字节, 700*30=21KB.
每道简答题 题干 300 汉字, utf8 900 字节, 考虑其他元信息, 算 1KB, 1KB*10=10KB.
所以每张题目试卷占用 31KB, 考虑有一些题目有图片, 图片 url 平均每条 100 字节, 20 张图片, 需要 2KB, 考虑其他一些信息, 每张试卷计为 35KB.
假设 redis 中存储每次考试周的考卷(当然也可以只把 redis 当缓存, db 存储实际数据)
每年高等教育毕业 800 万人, 所以大学可能共有 3000 多万的在校生需要考试.
每个大学的考试试卷都不同. 大学有的专业人多, 500 人, 有的专业人少, 30 人, 大一不少专业共享基础课.
因为共享基础课, 我们将每个专业的平均人数扩大一些, 考虑假设每 200 人一个专业, 且每个专业课程都不同, 每个学期有 10 门课, 每次考试周考 5 门课.
那么 redis 中需要存储 3000 万/200*5=75 万份不同的试卷内容.
每份试卷 35KB, 75 万份, 需要 26.6G 的存储空间, 试卷内容因为大多数属于文本, 文本的压缩效果很好, 可以使用压缩算法进行压缩, 压缩比可达到 2 以上, 故可以直接将存储使用降为 13G.
考虑 redis 自身空间维护, 碎片, bgsave 的内存预留, 操作系统自身的占用等情况, 32G 的机器跑 redis 基本可以 cover. 或者使用 redis 集群进行分片存储, 4 个分片, 单分片 8G.
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 台机器)=1650qps.
但如果直接请求回整个试卷数据给前端, 逻辑服务出口网络流量会比较高, 3.3 万/s*20K(假设为压缩后的试卷)=660M/s, 建议按题请求.
假如首次请求试卷元信息和首题, 1KB, 则逻辑服务出口流量降为 33M/s. 大大减轻系统压力和设备需求.
版权声明: 本文为 InfoQ 作者【听闻】的原创文章。
原文链接:【http://xie.infoq.cn/article/1df0572f9a088d1976c3ce2ee】。未经作者许可,禁止转载。
评论