上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: 李恒道 - 

【论文随笔】论软件可靠性设计及应用

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-11-2 12:52:50 | 显示全部楼层 | 阅读模式

    摘要

    2021年10月,笔者所在的公司研发了《企业资源计划管理系统》,主要用于企业内部与外部信息的统筹及企业日常活动的管理与计划,主要模块有:成员管理模块、权限管理模块、物料管理模块、计划审批模块、资源采购模块、供应链管理模块、财务管理模块等。该本项目中笔者担任系统架构师一职,主要负责系统架构。

    以该项目为例,论述了软件可靠性设计及具体应用,我们通过N版本容错技术避免单一模块出现问题而影响业务功能的正常运转,同时在无法使用容错技术或错误要求较高的模块采用了检错技术,并通过良好的架构设计减少复杂度来提高系统的可靠性,搭建预警系统进行监控并即时采用人员进行介入处理,最终系统按计划如期进行交付并顺利通过验收,获得了用户的一致好评。

    正文

    2021年10月,由于企业的业务发生转变,原有的企业资源计划管理系统已不再适用于企业的当前日常运作,同时由于其架构设计较差,原有维护人员的逐渐流失,且文档维护较差,但由于其技术水平较低,目前的业务价值较高,所以经过系统的根据团队的分析和调研,最终决定采用继承演化策略,对遗留系统的功能模型和数据模型进行继承,并在此基础上进行架构演化,以适应于当前的企业信息活动与日常管理,在该本次项目过程中,笔者担任架构设计师一职,负责架构设计。

    该系统主要用于企业内部与外部信息的统筹及企业日常活动的管理与计划,主要模块有:成员管理模块、权限管理模块、物料管理模块、计划审批模块、资源采购模块、供应链管理模块、财务管理模块等。同时管理内外部信息流需要与其他应用进行集成,所以开发了数据维护与转换工具及二次应用开发相关工具,帮助企业内的其他系统在不改变自身功能的情况下只需拓展相关的标准接口即可实现与企业资源计划管理系统的相互通信,帮助用户可以从单一入口实现跨应用事务的运作。

    该系统的软件可靠性设计采用了N版本程序设计,减低复杂度设计,以及检错设计三种方法。其中N版本程序设计通过设计多个相同模块的不同版本,采用投票表决的方式来进行容错处理。减少复杂度设计是通过合理的架构设计来减少程序的复杂度,提高软件的可靠性。检错设计通常适用于无法使用容错技术或对错误的容忍度较低的业务中,对软件的故障问题进行检测并上报,以便于开发人员的即时处理。

    在本次项目中,经过开发团队的商议和研讨,最终决定采用微服务架构,以功能进行划分,将系统划为为小且可独立部署的服务并由不同的小组进行开发。

    N版本程序设计

    N版本程序设计是在一个相同模块中采用设计不同但功能相同的一系列模块,属于一种容错技术,在N版本程序设计中会对所有表决模块进行相同的数据流出,并且对数据流出进行表决以实现容错,我们在企业流程的计划审批模块中应用了N版本程序设计,保证了单一模块的出错不会影响整个流程的正常运转,同时对出错的信息进行上下文收集并上报至预警系统,开发及运维人员在后续对其异常输出进行排查是否存在逻辑问题等,同时为了确保N版本程序设计的正常运行,应当编写大量的单元测试,在开发和上线之前进行集成测试、单元测试、模拟测试等多种,以确保N版本程序设计的正确定,在对异常问题进行程序的演化的过程中也需要进行回归测试,保证了程序的正常运转。

    检错程序设计

    检错程序设计同样应用在应用系统无法使用N版本程序设计的地方或对错误较为敏感的业务功能中,其中我们的财务管理模块就属于这种类型的业务功能,对此我们决定采用检错技术,对财务模块的输入和输出编写了中间件,采用切面编程的模式对输入输出程序进行监控,并编写了对应的业务检查规则,通过解释器进行解析后对输入输出的数据进行规则匹配检查异常,通过解释器模式来编写检查规则优点在于如果希望拓展规则无需重新编写业务代码,只需重新根据语法编写拓展的检查规则,并通过外部加载或配置变更等方法重新加载规则,即可实现检错规则的重新配置,当检错规则发现程序异常时,同样会对其异常的程序部分收集上下文范围信息,同时上报至异常系统并将该业务的信息进行相应的持久化存储,以便于后续开发和运维人员对异常的处理,处理完成后手动会自动对业务进行后续运行。

    减少复杂度的设计

    一个系统的可靠性也与架构的复杂度密切相关,所以保证系统的层次清晰,架构合理是一个保证可靠性,减少复杂度的有效方法。在本次的系统开发过程中,我们采用了OOA方法,通过识别参与者,合并需求获得用例,细化用例描述,调整用例需求。来获得系统的参与者,用例,以及相互之间的通信关联。在架构设计的过程中,为了保证清晰的架构层次设计,采用了UML模型的4+1视图对系统以不同的视角进行全面建模。在场景视图中,使用用例图表示系统为参与者所提供功能,即参与者为了使用系统的某一完整功能而与系统发生的一段对话。在逻辑视图中采用包图进行建模,描述了系统的软件架构,为了减少复杂度,我们采用了微服务架构进行设计,将整个系统以功能进行划分,划分为小且独立的微服务,每个微服务专注于自身所提供的功能,注重功能的暴露与服务的组合,功能简单明确。同时微服务自身相对独立,存储部分既可以选择中央存储结构,也可以选择独立存储结构,不同微服务之间只需要对数据转换进行处理,建立通信直接的数据转换管道,即可实现不同服务之间采用不同存储数据库。同时微服务之间的通信可以采用同步,异步,工作流三种方式。部署视图注重软件到硬件的映射,我们采用了Docker容器技术进行快速部署,同时使用集群进行容器的批量管理,解决单点故障及峰值流量问题。

    总结

    该系统目前已经上线一年多,受到了使用用户的一致好评,但中途也出现了一些问题,例如进行数据迁移由于历史遗留问题导致部分数据的编码错误,我们开发了数据转换工具,并在用户显示的时候进行预检测,在用户端进行埋点检测乱码和白屏自动进行上报由开发人员进行处理,最终解决了数据编码不一致问题。

    实践证明,系统能够如期交付并通过验收,与良好的软件可靠性设计及应用密不可分,在本次的结构设计过程中,也让我认识到了我个人存在许多不足,在今后的日子里,我会认真学习相关知识及积累经验,完善本架构,在今后的架构设计过程中做到更加完善。

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 709 天

    [LV.9]以坛为家II

    5

    主题

    39

    回帖

    501

    积分

    荣誉开发者

    积分
    501

    新人报道油中2周年荣誉开发者生态建设者油中3周年挑战者 lv2

    发表于 2023-11-5 11:05:05 | 显示全部楼层
    昨天,我可靠性就按这个写的,可能跑题了,不知道会不会给过
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表