声明:本文为本人在软考系统架构设计师备考期间的练手写作,不保证内容的原创性与正确性,仅供参考,请勿照抄和用于学术论文等正规场合,因不当使用产生后果一律自负。

摘要

  2019年3月,我单位联合某高校研发了《程序在线评测比赛考试系统》。系统以程序代码在线提交自动评测功能为核心,分为题库模块、评测机模块、实验作业模块、考试模块、比赛模块、抄袭判定模块、用户管理模块等,支持对接教务平台。在项目中我担任系统架构师,负责架构设计工作。
  本文以该平台的评测功能、数据库功能、自动出卷功能为例,主要论述了软件容错技术和方法在项目中的具体应用。系统通过采用集群化的形式进行应用部署,通过主备形式的数据库部署进行软件容错,通过程序设计方面进行软件的容错与避错。以上措施对提高系统的可用性、安全性和可扩展性方面起到了很好的效果,满足了系统的性能需求,保证了系统的稳定运行,获得了用户的一致好评。

正文

  笔者在一个专为高校建设计算机专业智能教学一体化平台的单位任职,过往成果有《计算机组成原理仿真实验系统》等。2019年3月,我单位联合某大学研发了《程序在线评测比赛考试系统》项目(以下简称为“OJ系统”),以取代原有传统的编程上机考试平台。
  系统以程序代码的在线提交自动评测功能为核心,主要分为题库模块、评测机模块、实验作业模块、考试模块、比赛模块、抄袭判定模块、用户管理模块等。题库模块主要负责试题和测试用例的管理,用户根据试题要求编写程序代码提交到系统,系统将测试用例与程序代码发送给评测机模块,由评测机自动编译、执行、判分,并将结果发送给其他相关模块进行统计;实验作业模块用于在线布置作业,从题库中选取试题,设置截止日期等要求;考试模块用于学生在线考试,按教师预先设置的参数自动从题库随机抽题生成试卷,以及向教务平台上传考试成绩;比赛模块主要用于ACM竞赛的培训;抄袭判定模块用于鉴定代码与他人代码雷同率;用户管理模块负责用户信息的管理。在这个项目中,我担任了系统架构师的职务,主要负责系统的架构设计相关工作。
  OJ平台以微服务架构作为基本架构风格,基于Spring Cloud框架,采用Java语言开发,将平台服务划分为三类,分别为核心服务、平台Web服务、平台保障服务。其中核心服务主要分为程序评测服务、试卷判分服务、比赛判分服务、代码相似度比对服务等。平台Web服务主要提供给用户使用的界面。平台保障服务主要包括WebAPI框架、平台报警服务、MQ消息中间件服务等。对于核心服务、平台Web相关的服务必须要能保证在考试、竞赛期间的稳定运行,对软件的可靠性要求非常高,所以在OJ平台中的这些核心服务就必须具备一定的容错能力,在某个服务运行时出错的情况下不能影响到整个系统的正常运行,这就要求在软件架构设计中必须考虑到软件容错技术的应用。
  提高软件系统可靠性的技术主要分为:容错技术、避错技术。容错技术主要通过冗余实现,分为结构冗余、时间冗余、信息冗余、冗余附加。结构冗余又分为静态冗余、动态冗余和混合冗余。软件避错技术主要有N版本程序设计、恢复块方法和防卫式程序设计。结合Web软件的性质,我主要采用了集群技术、数据库主从方式和程序设计方面来进行软件的容错与避错处理。下面就从以上三方面详细讨论我所采用的容错技术和方法。

1. 集群技术

  平台中各服务如果在运行时部署在一台服务器上,那么当服务器故障,整个平台将不能再提供任何服务,所以一般规模的应用需要采取集群的部署方式。以OJ系统中的评测机模块为例,程序评测属于耗时操作,用户提交的程序需要统一存入MQ队列中排队,然后由评测机依次进行读取和判分。如果评测机只部署了单个应用,那么当评测机因执行用户提交的不安全代码导致宕机时,后续所有待评测程序都将被阻塞。通过多机同时部署相同功能的评测机集群,再结合服务管理中心的软负载均衡功能,在系统正常运转时,多个评测机并行工作,可提高评测效率,在部分评测机宕机时,评测工作交由其他正常评测机分担,以留出供故障评测机重置恢复的时间,防止了因单台评测机宕机致整个平台不可用的问题出现,保证了业务的连续性,提高了系统的可靠性。

2. 数据库主从部署

  对于OJ平台来说,后端数据库存储的稳定性是极其重要的,所有的程序提交记录、考试答题记录、成绩统计记录都将存储到数据库中。如果数据库在运行过程中频繁宕机,那么带来的问题是不可容忍的。这里就要求数据库存储有非常高的可靠性,同时有很强的容错性,在这里主要采用主从式方法部署数据库结构,实现读写分离的架构。在不出问题的情况下,对于一些时效性要求不高的场合,从库可以分担一部分读流量,当主库发生读写问题时,可快速由其他的从库升级为主库,继续服务,达到容错的效果。此外,OJ系统还增加了数据库宕机报警的功能,防止宕机的数据库实例过多以至于并发高的情况下没有可用的从库可升级为主库,提高了平台的可靠性。数据库所依赖的硬件存储采用了基于RAID6的磁盘阵列,最高可容许两块硬盘同时发生故障,降低数据文件丢失的可能性。

3. 程序设计方面

  根据以往的设计经验,系统的不可靠大部分是由于程序内部的设计、网络请求参数的配置或者连接池参数的配置不当所导致的。所以通过程序设计方面进行软件的容错是非常重要的。最普遍的就是防卫式程序设计,例如平台中的考试服务,需要根据预设的试卷规格,调用题库服务中的题目信息来自动生成试卷。当大量考生同时进入考试功能时,题目服务在被调用的一刻如果出现网络拥塞或者丢包,这时候考试服务必然会收到抛出的错误信息,如果没有通过恰当的容错处理,那么一定会给考生显示进入考试失败的错误。这里我采用了try-catch机制加10次重试的容错处理机制,就解决了进入考试时因网络原因导致进入考试失败的问题。

总结

  通过采用了以上容错技术的方法和措施后,评测机模块达到了六余度,数据库达到了四余度,考试出卷功能等待时间控制在了5秒内,使整个系统达到了可靠性和实时性的要求。
  系统自2019年10月正式上线已运行一年有余,在学校的日常教学考试和竞赛培训中投入使用,截至目前已有3000以上的学生用户、评测了70000条以上的程序代码,获得了单位同事领导和学校教师们的一致好评。
  然而在使用过程中,系统还是出现了可靠性方面的故障。比如评测机虽然使用了集群部署,但由于提交作业的学生初次学习编程、对试题理解有误,短时间内提交了大量不安全代码,导致所有评测机实例全部宕机。我们对问题分析和试验后,将原部署在物理机上的评测机改为部署在虚拟化平台,结合心跳机制,自动回滚快照重置失效实例,省去了物理机系统重启的时间,将单个评测实例的恢复时间缩短到了10秒内。另外,我们使用了机器学习技术,对代码进行预判断,有宕机风险的代码将会被分流和延后处理。最终这个问题得到了解决。
  实践证明,OJ系统项目能够顺利上线,并且稳定运行,与系统的可靠性设计密不可分。经过这次软件容错技术的方法和实施的效果后,我也看到了自己身上的不足之处,在未来还会不断地更新知识,完善本系统在可靠性方面的设计,使整个系统能够更加好用,更有效地服务于高校师生。

论高可靠性系统中软件容错技术的应用相关推荐

  1. 2023系统分析师---论高可靠性系统中软件容错性技术的应用(付费资料)

    范文: 摘要: 2020年3月,我所就职的国内某知名互联网公司组织研发了一套分布式支付平台,该支付平台主要满足公司快速发展和各业务线业务流量日益增加支付需求,用于支撑个业务的支付功能,我有幸被定为该平 ...

  2. 软件定义的容错计算机体系,1.4 软件容错技术 - 计算机系统容错技术方法

    1.4 软件容错技术 由于硬件系统的故障主要来自生产和使用阶段,因此容错可以通过相同部件的重复,即相同资源的累积设置来实现;而软件故障主要来自说明.设计和实现阶段,因此程序的简单重复不能实现容错,它只 ...

  3. [架构之路-181]-《软考-系统分析师》-19- 系统可靠性分析与设计 - 2-容错性: 软件容错技术

    目录 前言: 1 9 . 4 软件容错技术 19.4.1 N 版本程序设计 1 . 与 通 常 软 件 开 发 过 程 的 区 别 2 . 其 他 需 要 注 意 的 问 题 19.4.2 恢复块方法 ...

  4. 先进机器人系统中的关键技术

    先进机器人系统中的关键技术 Key technologies coalesce in advanced robotic systems 就在机器人设计进入商业领域,服务于制造业.物流业和服务业之际,概 ...

  5. Paper:《Hidden Technical Debt in Machine Learning Systems—机器学习系统中隐藏的技术债》翻译与解读

    Paper:<Hidden Technical Debt in Machine Learning Systems-机器学习系统中隐藏的技术债>翻译与解读 导读:机器学习系统中,隐藏多少技术 ...

  6. 高并发系统中的限流应该如何做?

    缓存 缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪. 使用缓存不单单能够提升系统访问速度.提高并发访问量,也是保护数据库.保护系统的有效方式.大型网站一般主要是 ...

  7. 高并发高可靠性系统思考1

    CPU不是瓶颈,网络才是: 墨菲定律:任何事情都没表面看起来那么简单:会出错的总会出错: 可靠性: 集群:无状态集群:有状态集群,很难处理,尽量剥离出状态部分做集中式部署,其他做无状态部署: mate ...

  8. Linux系统中软件的“四”种安装原理详解:源码包安装、RPM二进制安装、YUM在线安装、脚本安装包...

    一.Linux软件包分类 1.1 源码包 优点: 开源,如果有足够的能力,可以修改源代码: 可以自由选择所需的功能: 软件是编译安装,所以更加适合自己的系统,更加稳定.效率更高: 卸载方便: 缺点: ...

  9. 高精地图中地面标识识别技术历程与实践

    导读:本文将主要介绍高德在高精地图地面标识识别上的技术演进,这些技术手段在不同时期服务了高精地图产线需求,为高德地图构建高精度地图提供了基础的技术保证. 1.面标识识别 地面标识识别,指在地图道路中识 ...

最新文章

  1. Android 在本地程序res/raw中读取数据操作
  2. 产品 电信nb接口调用_电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程)...
  3. 一直以为Python没有自带四舍五入的函数
  4. 光脚丫学LINQ(005):数据表之间的联接查询
  5. oracle 如何筛选重复,求sql--筛选A字段相同,B字段不同且不重复的记录
  6. 使用ngModel创建组件
  7. 读他:男人最怕听的十句话
  8. react echarts 绘制带有滑块柱图
  9. MySQL数据操作:增删改查
  10. SVN客户端服务器搭建与使用(一)
  11. 软考(计算机软件水平考试)程序员介绍
  12. Java中List使用Comparator.comparing进行排序
  13. saas系统和php mysql的区别_saas系统和传统erp的区别是什么?
  14. 以太坊+IPFS+WEB 电商平台开发讲解
  15. php如何判断emoji字符串,PHP实现识别带emoji表情的字符串
  16. 使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL
  17. IELTS writing skills——学习笔记
  18. java aes ebc_Delphi XE2+标准AES加解密算法(AES/EBC,CBC/PKCS5Padding-base64)
  19. 什么是语义网络知识表示?给出这种表示方法的优缺点?
  20. 2010年《杨卫华谈微博架构》视频摘抄

热门文章

  1. 外网开发必备软件-划词翻译
  2. MySQL第七讲:MySQL分库分表详解
  3. centos安装apche
  4. 当过服务员、快递员,现在年薪30W,历尽山河叛逆少年终会成长
  5. 达奇机器人编程学院_培养孩子创造力的Wonder达奇智能机器人
  6. 异构数据库迁移的曲折之路
  7. C/C++语言优秀书籍清单,新手入门必看
  8. 【爬虫系列】用Python爬取网抑云(music)评论
  9. 【EI检索_AMM】第二届工业设计与机械动力(ICIMDP2013)征稿中 距离截稿日期仅有八天
  10. 拆机 短接 触点 线刷 斐讯 N1_美炸了!北美N1放大1000倍圣诞水晶球登场,惊艳了整个华北!...