论软件可靠性设计技术的应用

20250430-作

题目

随着软件的日益普及,系统中软件成分不断增加,使得系统对软件的依赖越来越强。软件的可靠性对系统可靠性的影响越来越大。而实践证明,保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制,为此提出了软件可靠性设计的概念。
软件可靠性设计就是在常规的软件设计中,应用各种方法和技术,使软件设计在兼顾用户功能和性能需求的同时,全面满足软件的可靠性要求。软件可靠性设计应和软件的常规设计紧密结合,贯穿于软件设计过程的始终。
请围绕“软件可靠性设计技术的应用”论题,依次从以下三个方面进行论述。
1.概要叙述你参与管理和开发的软件项目以及你在其中所承担的主要工作。
2.结合项目实际,论述你在项目开发过程中,进行软件可靠性设计时遵循的基本原则;论述你在该项目中所采用的具体可靠性设计技术。
3.阐述你在具体的可靠性设计工作中,是如何应用基本原则和设计技术的效果如何。-------------阐述你在具体的可靠性设计工作中,为了分析影响软件可靠性的主要因素,所采用的可靠性分析方法。


摘要

    某省预约挂号系统以下简称预约挂号系统,是我司自主研发的医疗系统,旨提高医疗服务效率,为广大患者提供一站式、便捷化的服务体验,自推广以来受到广大用户的热爱,随着用户量的逐年增加,系统面临着性能瓶颈和可靠性的严峻挑战,严重阻碍了系统服务质量的进一步提升,为了让系统持续稳定的运行下去,我司决定在2023年3月启动预约挂号系统的全面升级工作,我担任系统架构设计师,主要工作就是系统整体架构的设计。为了提高系统的性能和可靠性,我们进行了可靠性和性能的设计,设计时规避原则冲突、提高可靠性、控制可靠性目标等众多原则,又通过使用容错、检错和降低复杂度的技术来保障系统的可靠性,又通过负载均衡、分布式缓存加持很好的提高了系统的性能,系统开发完成,名医抢号时期,轻松处理万级的并发,项目组成员和领导给予了高度的认可。

背景

    随着信息化时代的到来,各大医院纷纷拥抱线上系统,我司顺应时代潮流,开发了一款集预约挂号、体检预约、报告查询和名医抢号等众多的核心功能于一体的医疗系统,旨提高医疗服务质量和就诊效率,为患者提供一站式、便捷化的医疗服务体验。自推广以来受到广大用户的欢迎,随着用户基数的逐年增加,系统面临着性能瓶颈和可靠性的严峻挑战,为了保障预约挂号系统持续稳定的运行下去,我司毅然决定在2023年3月开始对预约挂号系统进行全面升级工作,计划一年,投资800万,目标是提高性能和可靠性,我担任系统架构设计师,主要工作涵盖了系统架构的整体设计、技术栈精准选型和各个核心阶段的评审工作。为了解决系统目前面临的问题,我们在分析和设计阶段分别进行了可靠性和性能方案分析和设计,通过遵循规避原则冲突、提高可靠性、控制可靠性目标的原则,使用容错、检错和降低复杂度的技术来提高可靠性,又通过使用负载均衡和分布式缓存等技术提高性能,完美的解决了系统对性能和可靠性的要求,系统也如期的平稳运行到现在。

理论

    在开发系统时遵循规避原则冲突、提高可靠性、控制可靠性目标等可靠性设计原则,以及使用容错、检错和降低复杂度的技术。
    1.原则方面:1)遵循规避原则冲突,开发时期预先定义好设计的原则,在进行系统优化时严格按照预先定义好的设计原则进行优化,以保障系统可靠性设计不会受到破坏。2)提高可靠性,系统的升级迭代离不开可靠性,每次的版本迭代对于系统来说可靠性应该有所提高,至少不能降低,需要预先考虑功能模块的开发是否影响系统的可靠性,规避破坏可靠性的设计。3)控制可靠性目标,项目设计时不能因追求可靠性而扩大了系统对可靠性要求的范围,要依据需求控制控制可靠性,或者以循序渐进方式合理的升级和实施技术。
    2.可靠性技术方面:1)容错技术,容错技术有三种实现方式。一种:是N版本程序,通过使用不同开发技术的程序对一个处理结果进行投票,来确定处理结果的准确性,例如在集群选主过程中需要遵循多数表决通过的策略。二种:恢复块设计,设计多个实现的恢复块,让系统程序出现问题,可以通过下一个恢复块解决,以此类推,直至解决问题。三种:冗余设计,系统可以通过提供不同的实现方式冗余更多资源来容错,一种资源出现问题,可以切换资源进行处理。

实践

    预约挂号系统的升级阶段有需求分析、设计、实现、运行与维护、演化等几个阶段,我们在分析阶段通过业务范围拆分出了机构服务、用户服务、订单服务、支付服务和三方医院服务,经过项目组讨论决定采用面向服务的架构设计,在设计阶段对系统的性能和可靠性进行了设计,具体的应用和效果如下。
    1.容错技术:预约挂号系统预约挂号在分析时期根据业务分析出了众多的服务,服务之间沟通难免会出现异常,例如名医抢号功能,用户首先访问的是机构服务拉去号源,然后下单,再进行支付,这一操作就涉及了三个服务的调用,如果其中一个服务异常会直接影响其他服务的使用,那将严重影响系统的可靠性和可用性。为此,我们选择了冗余技术,一个服务中采用多个副本进行部署,然后使用Spring提供的OpenFeign技术负载均衡、容错和服务降级,再加上分布式缓存技术,名医抢号时直接与缓存沟通、消息队列同步关系型数据库,即提高了系统的可靠性也提高了系统请求的并发处理能力。
    2.检错技术:预约挂号系统由于组件众多,某一个组件的运行环境和自身出现问题很难及时的发现并处理,所以系统急需自动的检测和告警功能。我们使用prometheus这个监控组件,它既是开源的,也提供了可视化的监控组件,即节省了项目的开发成本,也提高了项目的进度和可靠性,通过prometheus监控预约挂号系统的服务、服务器和网络等,当系统出现超出监控阈值时会通过我们配置的告警方式进行发邮件、通信设备告警,使工程师有解决问题的反映时间,例如,机构服务的某节点CPU、内存水位已达到80%需要告警或自动限流。
    3.降低复杂度:预约挂号系统结构复杂,如果不降低复杂度那将对后期的维护工作制造大量的问题,可靠性和性能肯定会受到影响,我们从结构和运维等方面优化。1)我们首先排除的是结构的复杂度,在设计交互图时我们发现系统各个服务之间调用成网状型,很容易形成环路,我邀请了系统分析师和项目经理一起探讨,经过多轮讨论决定采用我提出的聚合器微服务观点,原理就是将现有的服务层级下沉形成基础组件只提供业务领域内的处理,基础服务之间禁止沟通,具体的业务处理放在聚合器微服务里,虽然有网络性能的损耗,但是整个架构的清晰度是可见的,避免了循环调用的风险,对以后的维护工作也有很大的帮助。2)其次运维方面,我们使用了容器编排技术部署项目中的各个组件,运维只需使用命令的方式即可拉起整个系统,且每个外部组件都有容器化的资源,对自动化集成部署很有帮助。
    4.在可靠性设计之后,我们又优化了高频访问的服务,我们发现系统的机构中心是预约挂号系统的高频访问服务,我们使用多副本的同时为了提高访问的响应速度,我们增加了ES数据检索引擎,把医院、科室和医生等信息存储了ES,其提供了倒排索引、位置计算等技术可以很好的解决用户查询附近医院和拉取医院等相关信息,又加快了项目进度,提高了性能。

结尾

    我们成功的在2024年3月上线,得益于可靠性和性能的分析设计,预约挂号系统在名医抢号功能上表现突出,轻松应对了万级的并发量,现在用户已经突破至千万级别,且深度对接了11个市的500多家医院,平稳运行至今,得到了组员的赞誉和领导的高度认可。在开发之初,项目组部分成员对可靠性设计有理解偏差之处,一度阻碍了项目进度的顺利进行,针对这一问题,我们快速行动,通过项目组间人员的灵活调配完美解决了这一短板,我也深刻的吸取了教训。下一步,我们准备对历史数据进行迁移工作,经过这次项目的成功升级,我们接下来的升级工作充满信息,我也将以更高的要求和标准应对这次工作。经过这次的实施,我对可靠性设计又有了更深刻的认识,这对我的工作和经验都有显著的提高,我也将以更高的心态面对接下来的挑战,让自己在架构师之路上走的更远。

总结
    原则:规避原则冲突、提高可靠性、控制可靠性目标。
    设计技术:
        容错技术:N版本、恢复块、冗余设计(容灾多活)
        检错技术:监控告警。
        降低系统复杂度:提高模块化程度。
    可靠性分析方法:故障树分析方法、故障预防分析法。
经验
    磨刀不误砍柴工,先整理一下思路在写论文,至少可以保障思路断开时有参考依据。
    理论写了啥,实践也跟着些啥
    控制字数。

你可能感兴趣的:(架构,系统架构,可靠性设计)