架构训练营 week3 作业
1. 业务背景
随着学校的规模的不断扩大,学生数量的增加,需要处理的信息也日趋增大。不仅花费大量的教师资源,
处理效率也十分低下。主要有以下几个问题:
学生信息管理数据信息量大,查询、修改、删除等不方便
学生信息维护是纯手工的,维护不规范
学生选课过程操作繁杂,效率低下
大量工作需要人工进行操作,费时费力
对一系列数据进行分析时花费时间长
成绩查询还是通过打印成绩单的方式,浪费人力物力
基于以上问题,我们要引入学生管理系统来帮助学生管理人员有效管理学生信息,帮助学生更好的进行成绩的查询和课程的选择。
2. 约束和限制
学生、课程、考试数据不能发生大量丢失(多于 100 条)的情况
有较好的可扩展性,因为学校方面的技术人员会介入后续的开发和维护工作
系统需要支持 2000 人同时在线选课
系统为内部系统,仅在学校内部可以访问,不对公网开放
开发人员全体熟悉 java,熟悉 mysql,开发人员一共 3 人
3 个月内完成开发、测试和上线
3. 总体架构
3.1 架构分析
高可用:因为约束中要求不能大量丢失学生、课程、考试信息,所以至少需要做数据库层面的高可用,使用 MySQL 主备结构来处理这方面的问题。主数据库负责数据库的写入和读取,备数据库负责将数据从主数据库复制过来,以便在主数据库崩溃或者数据丢失的时候,可以及时地恢复数据或者干脆将备库切为主库
可扩展:因为从需求看,业务还有些复杂度,并且之后要交给校方的技术人员维护,那么在可扩展方面就有一定的要求。将系统拆分为 3 个系统,子系统间用接口相互调用,可以降低每个模块的内部复杂度,以便于分别进行单个子系统的开发工作。
3.2 总体架构
系统入口处用 nginx 进行请求的分发,根据访问路径分发到不同的子系统。同时用复杂均衡的算法选择一个子系统的实例进行请求
学生子系统主要负责学生个人信息、履历的增删改查等操作
课程子系统主要负责课程的增删改查、学生选课、成绩信息、考试安排等功能
权限子系统主要负责学生、老师、管理员的登录,以及登录之后操作的权限控制等功能
三个子系统可以各自用两个子系统实例保证一定的可用性
数据库采用主备的模式,主数据库接受读写,备服务器仅仅作为备份,不对外提供服务,从数据库复制数据。当主数据库宕机的时候,被数据库切换成为主数据库,继续提供数据读写服务。
4. 详细设计
4.1 核心功能
用户注册、登录
学生选课、查看成绩
辅导员维护学生信息
教师上传试题、修改成绩
4.2 关键设计
数据库的高可用:使用 MySQL 主备来实现数据库的高可用。平时主数据库提供读写服务,备数据库只是复制主数据库的数据信息,万一主数据库发生崩溃等异常,备数据库就会转为主数据库,继续提供服务。这样可以有效避免数据的丢失或者数据库写服务异常。
系统的可扩展:将整个系统拆分为 3 个子系统,分模块进行开发,实现了一定程度的业务解耦,每个子系统内部逻辑更加高内聚,更容易理解以及后续的维护
4.3 设计规范
业务子系统使用 Spring Boot、Spring Cloud 进行开发
子系统的配置和服务注册与发现用 nacos 进行统一管理
子系统之间的相互调用使用阿里的 dubbo 实现
MySQL 使用 Innodb 存储引擎
子系统的日志使用 ELK 进行管理
5. 质量设计
所有的日志通过 ELK 进行管理,可以在测试和进行问题定位的时候,在 kibana 界面进行关键字搜索,保证了可观测性、可测试性、可维护性
如果要降低成本,每个子系统可以只有一个服务实例,因为学生管理系统对于系统整体可用性要求并不是这么高,即使宕机一小时,也不会有非常大的影响
6. 演进规划
第一期:实现课程、学生基础信息维护、学生选课、系统排课、权限管理功能
第二期:实现教材选择、考试管理、成绩查看等功能
第三期:实现例如自动排课,自动生成试卷等自动化功能
版权声明: 本文为 InfoQ 作者【红莲疾风】的原创文章。
原文链接:【http://xie.infoq.cn/article/a8e9a994cb424e1c1c61b3145】。未经作者许可,禁止转载。
评论