架构实战营 模块三作业 外包学生管理系统架构设计
前言
本文是学生管理系统的详细架构设计文档,用于指导该系统的开发、测试和维护。
1. 业务背景
随着学校的规模的不断扩大,学生数量的增加,需要处理的信息也日趋增大。不仅花费大量的教师资源,处理效率也十分低下。
为此,需要有工具解决学生信息管理数据信息量大修改不方便,对一系列数据进行分析时花费时间长等问题,帮助学生管理人员有效管理学生信息。 因此学生信息管理系统可以通过系统规范化地管理、科学性统计和快速查询、修改、增加、删除等,提高信息的准确度以及日常管理的工作效率。
故引入学生管理系统,旨在提高学生管理的管理水平,优化资源,尽可能降低管理成本。
2. 约束和限制
在 2023.3.31 前交付。
项目造价不能高于 100000 元,每月运维成本不能高于 5000 元。
系统数据需要至少有冷备,系统宕机数据不能丢失。
要支撑 10000 个在校学生使用,1000 个学生的并发抢课。
3. 总体架构
3.1 架构分析
3.1.1 可扩展
根据预测认为学生管理系统业务基本不会发生大的变化,各角色间权限设计相对比较稳定,学生、课程两个业务模块基本只存在相关信息增删改查的变化,所以将系统内部封装成权限、学生、课程三个模块,分别支撑以下功能:
权限:登录管理,权限管理,拒绝非法访问
学生:学生信息查询、修改,成绩查询
课程:课程信息录入、查询;学生选课、教务排课、教材选择
3.1.2 高可用
该系统部署在学校机房,通过校园网连接。
主要保证数据高可用,学生、课程数据不能丢失,宕机后要可以在一天内恢复访问,所以需要设计主从数据库,故障后手动恢复数据即可。
3.1.3 高并发
从需求得知需要支撑共 10000 名在校学生的使用,1000 名学生的并发访问抢课,根据分析认为 Nginx 可以支撑该量级的访问,同时各模块也足够支撑该量级的访问,不存在性能问题。
3.2 总体架构
系统采用 Nginx 实现负载均衡,分发请求到相关的服务
系统按照功能拆分为学生、课程、权限三个子服务
使用 MySQL 进行数据的存取,主数据库负责日常数据读写,实时同步数据到备数据库;当主数据库故障时,切换主备数据库,备数据库对外提供数据读写并同步到主数据库。
4. 详细设计
4.1 核心功能
4.1.1 登录 &鉴权功能
使用 JWT 进行鉴权。
登录成功后权限服务返回按照指定规则生成的 JWT。
后续客户端直接在请求头中携带 JWT,功能模块自行验证 JWT 有效性。
4.2 学生选课
学生选课分为课程状态查询、选课申请两个功能。
4.3 ...
4.2 关键设计
4.2.1 学生选课高并发
由于实际业务中,会向同一批学生开放一个时间窗口进行选课,经常性有抢课的情况,对于服务的查询并发压力较大。
选课业务中,同一批学生的课程基本是相同的,鉴于此情况,可以在 SQL 之上设计一层本地缓存以提升系统吞吐量。
4.2.2 存储可扩展
由于学生、课程、考试数量会随着使用不断递增,为了优化查询写入性能,数据库的设计可以按照学生的学年,课程、考试创建日期等进行水平分表。
4.3 设计规范
开发框架:使用 Spring boot 进行业务模块开发
交互协议:业务服务以 Restful API 的形式向客户端提供功能访问
数据格式:JSON,标准如下
5. 质量设计
5.1 可测试性
单元测试:模块业务较简单,暂不设计单元测试。
API 测试、压力测试:使用 jmeter 进行接口测试、压力测试。
5.2 可维护性
功能降级:高负载情况下,支持降级非必要功能,如图片加载、信息修改等。
5.3 可观测性
日志系统:通过日志跟踪请求相应情况和内部模块间调用情况。
支持服务负载、存储负载监控,负载持续较高时触发维护告警信息。
5.4 安全性
为防止有学生选课时进行脚本刷课,造成大量不必要的请求导致业务故障,在模块中添加限制访问频次的中间件,频繁请求直接拒绝。
6. 演进规划
外包项目,一次性交付,暂无演进规划。
评论