写点什么

[架构实战营] 模块三作业

用户头像
xyu
关注
发布于: 21 小时前

前言

本文是学生管理系统的详细架构设计文档,用于指导学生管理系统的开发、测试和运维。

词汇表

None

1. 业务背景

随着学校的规模的不断扩大,学生数量的增加,需要处理的信息也日趋增大。不仅花费大量的教师资源,

处理效率也十分低下。

为提高学生管理的管理水平,优化资源,尽可能降低管理成本成为学生管理的新课题,学生管理系统是从

学生管理现状出发,根据学生管理的新要求进行开发设计的,它需要解决学生信息管理数据信息量大修改

不方便,对一系列数据进行分析时花费时间长等问题,帮助学生管理人员有效管理学生信息。因此学生信息管理系统可以通过系统规范化地管理、科学性统计和快速查询、修改、增加、删除等, 提高信息的准确度以及日常管理的工作效率。

本系统主要是应用于学生各类信息的管理,总体任务是实现学生信息关系的系统化、规范化、自动化,其

主要任务是统计学生各类信息进行日常管理,如查询、修改、增加、删除、以及学生选课、成绩的查询等

功能设计的管理系统。

2. 约束和限制

  • 确保系统的可用性,请求应答在 1s 以内,满足全校 5000 名师生的使用需求;

  • 确保数据安全,防止信息泄漏;

  • 后台服务使用 golang 进行开发;

  • 开发成本控制在 50W 以内;

3. 总体架构

学生管理系统将包含学生管理、课程管理以及权限管理这三大基础功能模块,以下将从这三个方面入手来对学生管理系统进行分析与设计。

3.1 架构分析

3.1.1 高可用

学生管理系统的使用方包括老师、学生以及教务处管理人员,系统的可靠性将直接影响日常的教学活动,比如学生选课、课程安排、成绩考核等; 综合看来,需要保证学生管理系统的高可用性。

3.1.2 高性能

学生管理系统供 5000 人规模的学校师生使用时,主要的流量峰值发生在学生选课以及成绩查询的时候,其峰值在 5000 TPS/QPS 上下,对于这个量级的处理能力,只要做好单机高性能的相关措施即可。

3.1.3 可扩展

考虑到学生管理系统后续可能会引进教师管理、实验室管理以及宿舍管理等功能,所以我们需要考虑系统可扩展性的需求。

3.1.4 安全

学生管理系统的安全性主要包括数据安全以及通信安全两个方面; 数据安全主要是防止由于服务器故障导致数据永久丢失的情况发生;通信安全是为了确保每一个用户在使用系统的过程中通信数据不会被劫持、修改甚至删除。

3.2 总体架构


  1. Nginx 作为反向代理,http 缓存服务器,负责把特定请求的请求映射到对应的业务子系统上;

  2. 三个功能模块分别对应三个独立服务,它们是:学生子系统、课程子系统以及权限子系统;

  3. 数据库采用 mysql 主备架构,一台主 MySQL 和一台备 MySQL; 正常情况下,主数据库服务器对外提供数据写入和读取服务,备服务器不对外提供服务;异常情况下,可以从备份数据库中恢复出数据;

4. 详细设计

4.1 核心功能

1)权限子系统

负责账号分配/系统登录/权限管理功能;

mysql 负责存储用户的账户信息包括密码,身份信息,权限信息。由权限子系统的 API 服务层负责增删查改这些信息。并以拦截器形式拦截整个系统的所有请求,确认用户身份权限符合后,再进行下一步的操作。

由于这部分信息相对比较固定,可以通过本地缓存 caffiene 对用户信息进行缓存。并且在信息同步时候同步更新缓存。


2)课程子系统

负责课程管理,考试管理;

mysql 负责存储课程信息包括教材信息,课程排课信息,课程的考试信息,平时成绩,以及学生的考试成绩。课程子系统通过 Restful http API 提供相关的增删查改功能。学生抢课需要注意,每个课程的容量限制的校验。通过权限子系统去判断用户是否有权限去设置课程,考试等。


3)学生子系统

负责学生选课,以及学生上传/下载文件;

mysql 负责存储学生的选课信息,学生上传的文件路径,具体文件直接存储在业务服务器上。通过权限子系统识别用户是否有权限去选课等。通过调用课程子系统的 API 来得到课程和考试的基础信息。学生子系统主要负责上传/下载文件,以及学生的选课功能。

4.2 关键设计

为了应对峰值流量压力,在单机高性能方面需要做相应提升,使用协程池能达到我们的目的;以下为协程池的设计细节。

4.2.1 协程池的优势

1)降低系统资源消耗,通过重用已存在的协程,降低协程创建和销毁造成的消耗;

2)提高系统响应速度,当有任务到达时,通过复用已存在的协程,无需等待新线程的创建便能立即执行;

3)方便协程并发数的管控。因为协程若是无限制的创建,可能会导致内存占用过多而产生 OOM,并且会造成 cpu 过度切换(cpu 切换线程是有时间成本的(需要保持当前执行协程的现场,并恢复要执行协程的现场));

4)通过协程池合理控制系统负载;

4.2.2 协程池的总体设计

协程池内部有一个任务队列用于缓存各类任务,各个子协程负责从任务队列中取出任务并执行。

4.2.3 协程池的管理

初始化一个协程池,这个协程池中需要维护一个类似栈的 LIFO 队列 ,用来存放空闲的 worker,,每个 worker,接收一个 tast 进行协程操作,此外给每个 worker 设置了老化时间,方便定期回收过期的 worker,通过定时清理过期 worker,可以进一步节省系统资源;对于没有过期的 worker 会回收复用,因为复用,规避了无脑启动大规模 goroutine 的弊端,可以节省大量的内存。

当一个 client 端提交 task 到协程池中之后,在协程池内部,接收 task 之后的核心操作是:

1)检查空闲 worker 队列中是否有可用的 worker,有的话,拿出最近执行任务的那个 worker,即从队列的 末尾拿最后一个;

2)当没有空闲的 worker 时,判断当前正在 running 的 worker 数量是否已经达到协程池容量,没有的话,新 建一个新的 worker;已经达到的话阻塞等待,等待一个新的 worker 被回收;

3)每个 worker 完成任务后,回收到空闲的 worker 队列中,并更新入队时间,按照执行时间的先后,放入 到队列中;

4)定时任务来扫描空闲的 worker 队列中的最近的完成任务时间与当前时间之差是否大于定义的老化时间,是的话,释放掉该 worker,节省内存资源;

4.3 设计规范

整个系统使用 Gin 作为 web 框架,GORM 作为 mysql 的 DAO 层, 使用 Restful API 来请求各个服务的数据。

5. 质量设计

为了提高系统的质量,从以下几个方面进行相关设计:

  • 可测试性:引入专有 log 包,可用于跟踪错误情况下的堆栈信息; 核心功能接口封装,以方便书写及实施测试用例;

  • 可维护性:系统的相关参数从配置文件中读取,以方便业务控制;

  • 可观测性:在学生管理后台中引入信息展示模块,以实现对相关数据的聚合、统计、分析;

  • 安全性:所有 Restful API 基于 HTTPS 进行调用;

6. 演进规划

  1. 二期:进行微服务化的改造,引入服务治理相关的基础设施,并实现云端部署;

  2. 三期:使用 k8s 进行服务编排,引入服务集群,以实现供全省甚至全国高校师生使用;


发布于: 21 小时前阅读数: 7
用户头像

xyu

关注

还未添加个人签名 2018.03.06 加入

还未添加个人简介

评论

发布
暂无评论
[架构实战营]模块三作业