摘要
正文
1. 架构需求
??在此阶段遇到的主要问题是OJ平台需要支撑全校编程课程的教学活动,这就需要有效、快速地全面获取需求。在需求的前期阶段,我们采用了用户访谈和调查问卷结合的方式,把需求调研团队分成了几组,分别进行需求收集。通过与课程教学组长的详细沟通,我们对OJ系统的主要业务功能、用户角色等有了整体、全面的了解。之后又制作了调查问卷表格,下发给各位任课教师,经过统计整理后,我们获悉了编程课程的教学活动、过程细节。在需求的中期阶段,我们在课程教学组长的协助和安排下,跟随任课教师,前往学校的计算机实验室,对目前编程课程的实验教学现场进行了观摩,了解了在传统实验教学方式中,学生和教师们的具体操作流程。在需求的后期阶段,我们基本上已经完成了大部分业务需求的收集,通过快速原型法构造出了一个仿真的OJ系统,供用户试用与反馈,让用户也参与到设计中,提供了工作流程方面、业务领域方面不可或缺的经验,也为以后项目通过验收提供了有力支持。
2. 架构设计
??在此阶段遇到的主要问题是如何合理设计与描述软件架构。我们以UML模型中的4+1视图来对架构建模。场景视图使用UML模型中的用例图来进行建模,结合用户需求,在系统中划定了在校学生、任课教师、系统管理员、校外人员四类用户角色,并分别为这些角色标识了相应用例。逻辑视图使用UML模型中的包图来进行建模,我们经过分析,决定采用微服务架构风格开发,将系统分为前端Web服务、平台保障服务、业务服务三部分。前端Web服务由负载均衡与服务器集群结合;平台保障服务分为API 关、服务注册中心、监控平台,用以实现基础服务框架;业务服务分为多个微服务,实现具体业务功能。物理视图使用UML模型中的部署图来进行建模,系统微服务采用分布式的部署方法,每个微服务根据实际情况可在同一台物理机器或多台物理机器上同时部署多个实例。集群通过负载均衡做统一访问,部署为路由模式,系统内部 络与外部 络分属于不同的逻辑 络。在负载均衡算法的选择上,使用了最小连接法。
3. 架构实现
??在此阶段遇到的主要问题是系统构件如何实现和组装。构件实现分为两种方式:获取现有构件、开发新构件。OJ系统需要与教务管理和OA系统对接,我们使用开发商提供的SDK实现;微服务架构的基础框架,如Spring Cloud、Eureka,以及评测机调用的编译器等,直接集成第三方软件实现。对于常见信息系统共同具备的用户管理、角色权限管理、日志记录、内容维护、消息中心等基本功能,通过取用单位过往项目开发中所积累的相应构件来实现。对于OJ系统专属功能构件,需要专门开发,我们使用了多种设计模式,例如通过装饰器模式来实现同一试题在实验作业、比赛、考试等多种使用场景下的扩展功能,通过策略模式来实现评测机对C语言、Java、Python等多种编程语言的不同编译方法。构件实现完成后,我们根据不同业务类型,采用了不同的构件组装方式。例如考试服务从题库获取试题信息,采用同步消息方式;程序评测服务属于耗时操作,采用异步消息方式;涉及审批流程的业务,采用基于工作流的组装方式。
总结
??系统自2019年10月正式上线已运行一年有余,在学校的日常教学考试和竞赛培训中投入使用,截至目前已有3000名以上的学生用户、评测了70000份以上的程序代码,获得了单位同事领导和学校教师们的一致好评。在使用中系统也出现了一些问题,比如评测机服务需要执行用户提交的代码,部分用户短时间内提交了大量不安全代码,导致评测机集群中所有实例全部宕机。这是由于早期在可靠性方面的需求分析不够周全,系统没有进行充分的容错设计。我们引入心跳机制、快照回滚机制,以及基于机器学习技术的预判断机制,使评测服务宕机时能够在10秒内自动重置恢复运行,最终解决了该问题。
??实践证明,OJ系统项目能够顺利上线,并且稳定运行,与系统采用了合适的设计方法密不可分。经过这次基于架构的软件设计方法和实施的效果后,我也看到了自己身上的不足之处,在未来还会不断地更新知识,完善本系统在各方面的设计,使整个系统能够更加好用,更有效地服务于高校师生。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!