模块三作业
学生管理系统架构设计
前言
本文是学生管理系统详细架构设计文档,用于指导该系统后续的开发、测试和运维。
1. 业务背景
学生管理系统主要解决学生在校期间的生活和学习课程等一系列行为的统一的数据管理。
整个系统功能模块分为:学生管理,课程管理,权限管理三个模块。权限管理模块规定了可以使用前两个模块的角色。学生管理模块和课程模块之间主要通过数据库和 MQ 进行数据交互。
同时系统还需要 NGINX 进行网络隔离,以及风控模块确保数据安全。
2. 约束和限制
整个系统采用 SpringBoot 框架为基础,Java 作为主要开发语言进行开发。数据库采用 MySQL。要求两位后端开发,一位前端开发全职参与,开发周期为 2 个月。同时要求一位产品进行需求的沟通,一位 QA 对系统质量进行测试和保障。后续维护需要投入 2 位开发,兼职进行维护。维护周期为一年。
3. 总体架构
![](https://static001.geekbang.org/infoq/c0/c0affd5a0cae316c216390c7a52422e2.png)
因为学校一般是由校园内网和外网进行隔离,所以使用 NGINX 进行内外网隔离。通过 Nginx 后需要通过风控模块对请求和数据流进行拦截,阻拦不正常的行为。
学生模块负责管理学生的在校期间的日常生活,包括住宿信息,餐饮信息,图书馆借阅信息等。
课程模块负责学生的选课,成绩,以及实验和毕业等信息。
权限模块通过为学生分配不同的角色来进行资源访问控制。
因为是学校内部系统,而且进行的是学生日常和课程管理,所以只会有几个功能会在偶尔出现高 QPS 的情况,比如选课系统,成绩查询系统等。在这些系统的入口需要有流量控制的能力,并且避免慢 SQL 和实时复杂处理逻辑的出现。
数据库采用主从设置。学生数据安全是该系统最重要的部分。从数据库根据 bin log 进行数据更新,同时每天要进行数据和日志的增量备份。
4. 详细设计
4.1 核心功能
风控模块
![](https://static001.geekbang.org/infoq/2d/2de7268342e6f5908f7b34f97a410ef0.png)
基础的风控模块是通过一定规则对进来的请求进行实时判断。首先接到请求后需要做一些数据补全,主要有用户画像,课程信息等。然后通过规则判断该请求是否合法。不合法的请求会被直接拦截。
新建学生
![](https://static001.geekbang.org/infoq/eb/eb7c52ee887d600684deccac155b13ca.png)
新建一名学生时,需要在学生管理系统里面设置一个学生的档案。同时为学生开通相应的权限。之后就可以为学生在课程管理系统里面创建一个课程表。用于日常课程和考试管理。
选课流程
![](https://static001.geekbang.org/infoq/ae/aeb7ed0e0829a7db3bc04c1ecf42b1b0.png)
选课模块会是一个会突然出现针尖式峰值的场景。类似一个小型的秒杀系统。所以需要通过 MQ 进行削峰,在选课前对缓存进行预热。所有的课程信息都要移到缓存里去。不会出现缓存没有数据,去数据库读取的情况。防止缓存雪崩和穿透。缓存没有数据了,那就是该课程没有位置了。在选课结束后,选课模块才会去更新数据库的数据。这里更新的只是最终的选课结果。
4.2 关键设计
数据安全
数据库使用 MySQL。因为学校的学生数量有限,读多余写。所以 MySQL 是够用的。在数据安全方面,采用主备设置。主备之间的数据同步使用 bin log 非实时更新。在主数据库挂了的时候,可以通过主数据库的 bin log 将备份数据库还未同步的数据进行同步,然后将流量切到备份数据库。由于大部分学生的活动不具有高实时性,所以主备数据库的流量切换可以容忍短时间的不一致,只要保证最终一致性即可。
4. 质量设计
可测试性
开发进行单元测试和 Integration 测试。QA 确保功能测试。
可观测性
通过 Kibana,promethues,Cat 进行日志打点。
成本
所以模块都进行双主机的主备冗余设置。所以网关两台,三个模块六台,数据库两台。
开发人员成本:
测试和产品人员成本:
5. 演进规划
系统架构在从单个学校扩到多个学校是需要进行扩展以及分区。
交互的优化。
数据存储,读写性能的优化。
评论