论软件的可靠性设计
摘要
2021年6月,我所在的公司中标某集团保险大数据平台一体化研发项目,该项目总投资2000万人民币,项目周期为2年,通过该项目,搭建该集团保险大数据平台,一方面将全国所有保险业务全部入库并保存,另一方面将全国使用该集团的网站系统、app客户的行为日志全部入湖并保存,通过分析用户的行为日志以及购买记录,为集团业务人员提供精准营销、挖掘潜在客户,帮助集团实现保险业务的快速增长。我有幸作为此次项目的负责人以及架构师参与了项目的搭建以及开发过程。该项目时间紧、任务重、涉及人员组织多,直接相关集团保险公司内部40个部门共计400多人。该项目于2023年5月完成系统上线,2023年6月通过最终验收,得到了用户的一致好评,顺利达成了既定目标。本人重点结合项目实际经验,以该项目为例,主要论述软件的可靠性设计在项目中的实际运用。
正文
2021年6月,我作为项目负责人以及架构师,主持了某集团全国保险大数据搭建项目。该项目历时2年,时间紧、任务重,具有相当大的挑战。一是需要配合改造的部门多,所有保险种类的平台都要接入我们大数据平台,任何用户的操作行为以及产生的订单都需要入湖并进行保存,我们需要定义统一的数据格式以及规范,还要跟集团各个保险应用沟通,沟通成本大大提高。二是技术含量高。该集团保险数据每年都在进行递增,且有些数据入湖之后还要进行大量的解析,并且这些数据也需要存储,用户操作行为的日志每天都是几百个G,极限的情况下每天的处理量能达到1000G左右。这对于数据存储来说是极大的挑战。所以,对于该系统来说,如何保证系统的可靠性成为该系统的一个主要技术难点。
查阅大量的资料得知,目前业界比较主流的软件可靠性设计主要有软件容错技术、检错技术、降低复杂度设计等技术。
常用的软件容错技术主要有3种,分别是恢复块设计、N版本程序设计、冗余设计。恢复块设计就是选择一组操作作为容错单元设计,从而把普通的程序块变成恢复块。一个恢复块包含若干个功能相同、设计差异的程序块文本,每一时刻有一个文本处于运行状态。一旦该文本出现故障,则用备份文本加以替换,从而构成“动态冗余”。N版本程序设计是一种静态的故障屏蔽技术,其设计思想是用N个具有相同功能的程序段同时执行一项计算,结果通过多数表决来执行。其中N个版本的程序必须由不同的人独立设计,使用不同的方法、开发语言、开发环境和工具来实现,其目的是减少N个版本在表决点上相关错误的概率。冗余设计实现的原理是在一套完整的软件系统之外,设计一种不同路径、不同算法或不同实现方法的模块或系统作为备份,在出现故障时可以使用冗余的部分进行替换,从而维持软件系统的正常运行。
检错技术实现的代价一般低于容错技术和冗余技术,但有一个明显的缺点,就是不能自动解决故障,出现故障后如果不进行人工干预,将最终导致软件系统不能正常运行。检错技术常见的实现方式,最直接的一种实现方式时判断返回结果,如果返回结果超出正常范围,则进行异常处理;计算运行时间也是一种常用技术,如果某个模块或函数运行时间超过预期时间,可以判断出现故障;还有置状态标志位等多种方法,自检的实现方式需要根据实际情况来选用。
降低复杂度设计的思想就是在保证实现软件功能的基础上,简化软件结构,缩短程序代码长度,优化软件数据流向,降低软件复杂度,从而提高软件可靠性。
参照上面主流的软件可靠性设计技术,结合项目实际情况,我们在项目中主要使用了以下措施来提高软件的可靠性:
1.采用集群容错技术。
为了提高系统的可靠性,我们在系统中大量的采用了集群容错技术。这里的集群容错技术应用到了多个组件当中,包括负载均衡nginx集群技术、前端服务器集群、后端服务器集群(因为我们采用的是前后端分离项目)、中间件kafka集群技术等,基本上每种组件我们都提供了集群,以确保某一个节点挂了之后,另外一个节点可以马上接管,提供程序24小时不间断运行。
2.数据库采用了多主多从容错技术。
我们在大数据平台对数据进行解析之后,会将一些有用的数据存储在mysql中,供业务人员使用、分析、查询和修改,当业务发现某些解析的数据不对时,可以支持手动修改该笔数据。在面对大量业务人员操作的场景,我们使用了多主多从的架构,即多个主节点,多个从节点,并在多主多从的架构上,实现了读写分离,主节点主要负责写入数据,从节点主要负责读数据,节点之后不相互影响。当系统在运行时,如果某一个主节点或从节点挂掉时,可以由另外一个主节点或从节点替换,从而提高系统的可靠性。
3.冗余技术。
在具体的数据湖接入框架中,我们引入了Hadoop框架,利用Hadoop的高容错性,提高了系统的可靠性。HDFS(Hadoop分布式文件系统)是Hadoop的核心组件之一,也是Hadoop的默认文件系统。Hadoop是一个分布式计算框架,而HDFS则是Hadoop用于存储和管理大规模数据集的分布式文件系统。在本次项目实施过程中,我们使用到了HDFS的纠删码技术。纠删码技术是一种数据保护技术,最早用于通信行业中数据传输中的数据恢复,是一种编码容错技术。他通过在原始数据中加入新的校验数据,使得各个部分的数据产生关联性。在一定范围的数据出错情况下,通过纠删码技术可以进行恢复。默认的纠删码策略可以节省50%的存储空间,同时还可以承受更多的存储故障。同时,对于一些重要的数据,我们也使用了数据备份技术,将数据备份到云服务端,保障系统在发生不可抗力的时候数据丢失的情况。运用这两种技术,成功提高了分布式存储系统的可靠性,使得系统更加稳定、高效的运行。
4.降低复杂度设计
在项目具体实施过程中,我们使用了降低复杂度设计,将一些模块进行合理的划分,尽量保证软件的各个模块之间实现高内聚、低耦合,优化软件结构,并通过具体的异步、批处理、多线程等技术手段实现某些复杂的功能,从而提高软件的可靠性。
经过我和团队的不懈努力,历时2年,项目终于于 2023年6月顺利通过了验收,并得到了一致好评,运行至今,用户反馈良好,集团公司的再保险业务运营水平得以提升。但是,在实施过程中,也暴露了一些具体问题,例如HDFS上面存储过多的小文件,一方面会大量占用NameNode的内存空间,另一方面就是元数据文件过多,使得寻址索引速度变慢,影响机器性能等等,这些问题通过应急处理和协调,都得到了妥善解决,没有影响到项目的总体进度。我们已经把这些经验和教训,总结到了工作总结里面,向其他技术人员分享,为今后系统架构设计提供帮助。相信通过不断持续学习改进,加强自己的系统分析与设计能力,努力工作,提升工作水平,为社会和公司多贡献一点自己的价值。
相关文章:
论软件的可靠性设计
摘要 2021年6月,我所在的公司中标某集团保险大数据平台一体化研发项目,该项目总投资2000万人民币,项目周期为2年,通过该项目,搭建该集团保险大数据平台,一方面将全国所有保险业务全部入库并保存࿰…...

AG35学习笔记(一):debug串口抓取模组log、debug串口测试AT指令、echo命令通过串口发送16进制数据
目录 一、概述二、抓取模组log2.1 硬件接口2.2 用户登录2.3 相关指令 三、测试AT指令3.1 查看端口3.2 进入模式 四、串口发16进制echo使用 一、概述 二、抓取模组log 在之前记录了通过USB,使用移远工具Qwinlog来抓取log(3.3 抓取模组log)。…...

Python进阶学习----一闭三器
目录 编辑 前言 一.三器 1. 迭代器(Iterator) 1.1 什么是可迭代对象 1.2什么是迭代器 1.3案例演示: 以下是一个简单的迭代器示例,遍历一个列表并打印每个元素: 1.4迭代器总结 2. 生成器(Generat…...
C/S架构学习之TCP客户端
TCP客户端的实现流程:一、创建套接字(socket函数):通信域选择IPV4网络协议、流式套接字; int sockfd socket(AF_INET,SOCK_STREAM,0); 二、填充服务器的网络信息结构体(struct sockaddr_in serveraddr&…...

系统集成|第十二章(笔记)
目录 第十二章 沟通管理12.1 沟通的基本概念12.2 主要过程12.2.1 规划沟通管理12.2.2 管理沟通12.2.3 控制沟通 12.3 常见问题 上篇:第十一章、项目人力资源管理 第十二章 沟通管理 沟通管理在项目计划、执行、监控过程中具有重要的作用,项目经理应该拿…...

图神经网络(GNN)最新顶会论文汇总【附源码】
得益于强大的建模和分析能力,图神经网络(GNN)在社交网络分析、推荐系统、知识图谱、文本分析、等诸多领域得到了广泛的应用,目前已成为了人工智能领域的热门研究方向。 在今年的各大顶会获奖论文中,图神经网络相关的论…...

【算法】算法设计与分析 课程笔记 第二章 递归与分治策略
2.1 递归 直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。 2.1.1 阶乘 首先得想到一个求阶乘的函数: 这个函数的下面那个式子就用到了调用自身,所以可以用递归来实现,将主问题拆分成若干层的子问题&am…...

Java客户端_Apache Curator操作Zookeeper
Curator是 Netflix公司开源的一套ZooKeeper客户端框架。和ZkClient一样,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和 NodeExistsException异常等,目前已经成为了Apache的顶级项目,是全世界范围…...

14:00面试,14:07就出来了,问的问题有点变态
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%,…...

《你好,C语言》:从另一个视角学习并重新审视C语言的意义
《你好,C语言》:从另一个视角学习并重新审视C语言的意义 尽管C语言诞生了这么多年,但是它依然活跃在开发者一线,不可否认的是C语言的确有它独特的魅力。本文将从一个全新的视角,重新带领大家学习领悟C语言的奥秘&#…...

信创之国产浪潮电脑+统信UOS操作系统体验1:硬件及软件常规功能支持情况介绍
一、引言 由于公司要求支持国产信创,最近办公的笔记本电脑换成了软硬件全国产,由于国产操作系统是在开源linux基础上演进的,在换之前,非常担心操作不方便,周边应用软件少,功能差,内心是比较抗拒…...

JAVA学习-全网最详细
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...

基于物联网的农村地区智能微电网系统(Simulink)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

JavaScript系列从入门到精通系列第九篇:JavaScript中赋值运算符和关系运算符以及Unicode编码介绍
一:赋值运算符 1: 右侧的值可以赋值给左侧的变量。 var a 123; console.log(a);//123 2: var a 10; a a 5; a 5; 上边这两个写法是一样的。 3:- var a 10; a a-5; a - 5; 上边这两个写法是一样的。 4:* …...
租用独立服务器有哪些常见的误区?
租用独立服务器有哪些常见的误区? 如今,租用独立服务器的市场随着idc行业良好的发展趋势而变得越来越广泛,其最明显的地方在于出现了许多的代理商,而成为代理商的门槛非常低,这样一来就会出现许多问题,导致…...
【学习笔记】POJ 3834 graph game
点这里 结论题😅 ,图一乐 结论:如果原图中存在两个边集不交的生成树,那么 Bob \text{Bob} Bob必胜;否则 Alice \text{Alice} Alice必胜 证明有点难😅 首先,考虑维护两颗 不存在红边 的生成树…...
无监督学习算法Kmeans
1. 有监督学习和无监督学习 在机器学习算法中,常把算法分为有监督学习和无监督学习两种。他们之间的区别主要在于输入数据集类型和学习目标。 (1)有监督学习:训练输入的数据需要带有标签,以便算法能够学习输入和输出…...

区块链(4):区块链技术模型介绍
1 区块链白皮书中的公有链,私有链,联盟链概念介绍 区块链系统根据应用场景和设计体系的不同,一般分为公有链、联盟 链和专有链(私有链)。其中: 公有链的各个节点可以自由加入和退出网络,并参加链上数据的读 写,运行时…...

go语言 rune 类型
ASCII 码只需要 7 bit 就能完整地表示,但只能表示英文字母在内的 128 个字符,为了表示世界上大部分的文字系统,发明了 Unicode ,它是 ASCII 的超集,包含世界上书写系统中存在的所有字符,并且为每个代码分配…...

DS18B20温度传感器
DS18B20简介 DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器 这种一线总线就是 三线制 SPI DS18B20的 配置寄存器: TM 是测试位,出厂设置就被设置为0,不需要改动, R1、R…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...