架构训练营 模块三作业
![](https://static001.geekbang.org/infoq/6a/6a8babe4ec91d11867b16b30778021eb.png)
前言
本文档是外包学生管理系统的架构文档, 用于指导开发测试和运维.
1. 业务背景
随着学校的规模的不断扩大,学生数量的增加,需要处理的信息也日趋增大。不仅花费大量的教师资源,处理效率也十分低下。
为提高学生管理的管理水平,优化资源,尽可能降低管理成本成为学生管理的新课题,学生管理系统是从学生管理现状出发,根据学生管理的新要求进行开发设计的,它需要解决学生信息管理数据信息量大修改不方便,对一系列数据进行分析时花费时间长等问题,帮助学生管理人员有效管理学生信息。
因此学生信息管理系统可以通过系统规范化地管理、科学性统计和快速查询、修改、增加、删除等,提高信息的准确度以及日常管理的工作效率。
本系统主要是应用于学生各类信息的管理,总体任务是实现学生信息管理的系统化、规范化和自动化,其主要任务是管理学生相关信息,如学籍、课程、成绩、奖惩。
2. 约束和限制
第一期成本不超过 100 万
质量标准符合 ISO9001-2015 标准
UI 支持多语言, 至少中英文双语
3. 总体架构
3.1 架构分析
作为外包信息管理系统, 数据安全和数据的高可用是首位的, 学校在访问自己的数据的时候要保证任何时候都能提供完整正确的数据. 同时系统也能应付一般的事故而保障数据持续安全的保存. 其次, 各个学校对于学生管理的业务有很多不同, 必然导致业务需求变化, 所以系统在可扩展性也是着重要考虑的. 而各个学校的流量高峰不会相互重叠, 所以在性能上满足可用性即可. 总之, 架构的设计要优先覆盖:
数据高可用
可扩展性
3.2 总体架构
总体架构图:
![](https://static001.geekbang.org/infoq/4e/4e4f74e0aa9a937f80ddfff61542e80c.png)
Nginx 负责流量的负载均衡和路由外部调用到对应的子系统
业务系统内包含模块:
学生子系统 - 处理学生账号信息
课程子系统 - 处理课程考试相关流程和内容
权限子系统 - 处理用户对各个系统功能模块的权限访问控制
数据库服务器以主备形式部署, 主数据库负责所有请求, 备份数据库只保存同步过来的数据
4. 详细设计
4.1 核心功能
采用微内核设计来保证可扩展性. 将基础功能置入核心系统, 比如
数据库访问的抽象
前台 UI 框架
使用 RBAC 模型实现实现权限控制.
4.2 关键设计
4.2.1 学生子系统
1) 账号生成可靠性
学生或者教工的账号生成自动流程, 外接手机 + 短信或微信绑定. 学生和教工都用学校提供的标识 ID 生成账号, 给与默认密码.
2) 用户管理
系统管理员创建基本的用户角色, 如学生, 教师, 教务管理人员. 将各种权限赋予给这些基本角色. 角色可以按照院系组织管理层级嵌套, 从而对应学生的实际院系.
3) 文件上传/下载, 信息查询
此功能针对所有用户开放,学生可以将自己课堂笔记、日常作业等相关信息在线传输,教师通过此功能查询、浏览对应文件. 文件管理使用 Seafile 系统, 运行在 MySQL 服务器, 同样定期同步到备份服务器.
4.2.2 课程子系统
1) 选课流程的高性能
选课过程多集中发生在学期的前期和期末, 而且可能出现大并发的情况. 所以在课程子系统可以做临时队列来缓冲大并发流量. 学生子系统和课程子系统之间的调用多在只读查询过程, 可以将查询过程在课程子系统内用独立的进程分离负载来避免大并发流量产生的干扰.
2) 课程成绩数据的安全性与可靠性
课程最终成绩只能由任课老师填写, 在成绩提交后若出现任何修改过程在课程这个级别要留下历史日志以备后面教务审计. 成绩修改历史保存在单独的 MySQL 表中, 此表只允许添加行数据和查询.
4.2.3 权限子系统
整个系统内的可访问资源都将定义为访问对象, 按照 RBAC 模型将权限操作资源的细节描述到角色一层. 学生账号进入系统试当即计算其权限并缓存, 以避免在大并发流量产生(例如选课阶段)的场景反复访问权限系统.
4.3 设计规范
1) 本系统使用 Sprint Boot + Netty + MyBatis 开发
2) MySQL 使用 Innodb 存储引擎
3) 上传的文件使用 Seafile 系统管理
5. 质量设计
5.1 学生管理系统的后台配置
用 JSON 定义保存配置信息, 待核心功能完成后考虑开发配置界面.
5.2 可维护性
配置信息 JSON 的修改被子系统实时读取生效.
5.3 可观测性
系统日志分两个部分
系统普通日志写到本地文件, 记录代码运行情况, 报警和错误.
业务对象操作日志写入数据库, 比如更新权限, 更改成绩. 此类日志只提供只读视图.
5.4 成本
业务系统代码的构建过程面向容器化. 当需要更高性能的时候可以用多容器实例来提升系统吞吐量.
6. 演进规划
1) 第一期
开发核心共享功能和用户子系统
2) 第二期
开发课程子系统
3) 第三期
开发权限子系统
4) 第四期
后台管理界面和日志管理
评论