惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
Jina AI
Jina AI
Stack Overflow Blog
Stack Overflow Blog
量子位
博客园_首页
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Forbes - Security
Forbes - Security
IT之家
IT之家
N
News and Events Feed by Topic
S
Security Affairs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Webroot Blog
Webroot Blog
Recorded Future
Recorded Future
L
LangChain Blog
Y
Y Combinator Blog
AI
AI
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Know Your Adversary
Know Your Adversary
AWS News Blog
AWS News Blog
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google Online Security Blog
Google Online Security Blog
V2EX - 技术
V2EX - 技术
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
PCI Perspectives
PCI Perspectives
I
Intezer
T
Tenable Blog
G
Google Developers Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
云风的 BLOG
云风的 BLOG
C
CXSECURITY Database RSS Feed - CXSecurity.com
有赞技术团队
有赞技术团队
O
OpenAI News
P
Proofpoint News Feed
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Last Week in AI
Last Week in AI
S
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
Blog — PlanetScale
Blog — PlanetScale

博客园 - 光辉飞翔

台东海域纳入常态化治理推动国土规划准备工作 信息技术 数字孪生 第2部分:数字实体 《过松源晨炊漆公店》杨万里 关系运算及元组演算 论文素材-无服务架构serverless “4+1”视图模型 曾国藩遗嘱 今将永别,特立四条以教汝兄弟。 徐霞客的《青云志》 oracle 常用命令:查看数据库和表命令 【转】Docker和Containerd 软考 架构 超键、候选键、主键、外键的区分 浏览器打开网页提示:证书链是由不受信任的颁发机构颁发的 何为著相?凡所有相皆为虚妄,若见诸相非相,则见如来。 Barra风格因子模型 明朝那些事作者石悦讲顿悟天道 什么是信创 MS银行 主成分分析与因子分析的区别 慈不带兵、义不经商,下半句更狠!(深度) python logger打印两次解决办法
N版本程序设计(N-Version Programming, NVP) -软件容错技术
光辉飞翔 · 2025-12-25 · via 博客园 - 光辉飞翔

软件容错技术 是指在软件系统中通过特定的设计方法和技术手段,使系统在出现故障或错误时仍能继续正常运行或提供降级服务,从而提高系统的可靠性和可用性。软件容错技术广泛应用于对可靠性要求较高的领域,如航空航天、金融系统、医疗设备等。

以下是软件容错技术的主要分类和实现方法:

1. N版本程序设计(N-Version Programming, NVP)


N版本程序设计是一种静态冗余系统设计的方法。所谓静态冗余,就是利用冗余资源把故障的后果屏蔽掉,而不对原有系统结构进行改变称之为静态冗余。

有多个独立的团队进行开发相同版本的独立系统。将N个版本的运行结果进行汇总到表决器中,利用表决机制得到一个最终结果。通常应用在信号领域、硬件系统中,比如高铁信号系统,航空系统。假设有3个版本的同时运行,当一个系统运行出的结果偏差较大,利用少数服从多数的表决机制得到正确的结果。这样可以避免系统业务的突然中断,以及结果准确。

N版本程序设计与通常的软件开发过程不同的是,它新增了三个新的阶段:相异成分规范评审,相异性确认,背对背测试。N版本程序设计中需要关注的问题是,不同版本间的程序同步,版本程序之间的通信,表决算法(全等表决、非精确表决,Cosmetie表决)、一致比较问题、数据相异性等。

N 版本程序的设计思想是用N个具有相同功能的程序同时执行一项计算,结果通过多数表决来选择。其中#个版本的程序必须由不同的人(小组)独立设计,使用不同的方法、不同的设计语言、不同的开发环境和工具来实现,目的是减少#个版本的程序在表决点上相关错误的概率。

备注:

类似公司的决策部门的投票,避免因为一人的错误导致整个系统的风险。

一个人的决策总会有偏差、误差和错误。

1 . 与 通 常 软 件 开 发 过 程 的 区 别
与通常软件开发过程不同的是, N 版本程序设计增加了三个新的阶段,分别是相异成分规范评审、相异性确认和背对背测试。

(1) 相异成分评审。

每个版本的工作组均接收到一份相同的 S R S需求规格说明书 。

为了保证相异性,这些工作组之间不允许进行任何形式的交流,有关 S R S 的问题只能在工作组和项目管理人员之间进行交换,这种交换是通过问题单的形式进行的。对于各工作组提出的问题,由项目管理人员组成的 S R S 评审委员会对每个问题单进行研究。若是对 S R S 理解不正确,则向有关工作组进行解释;若是 S R S 本身问题,则修改 S R S , 并通知所有工作组。

(2) 相异性确认。

相异性确认在相异成分详细设计后进行,其目的是对相异性进行评估。

(3) 背对背测试。

使用同样的测试数据对 N 版本程序进行测试,将 W 个版本程序的运行结果进行比较,用以发现版本中的软件故障。

N版本程序设计是一种通过开发多个独立版本的软件模块来提高系统可靠性的技术。

核心思想:
开发多个功能相同但实现方式不同的软件版本(通常由不同的团队独立开发)。

在运行时,多个版本同时执行相同的任务,并通过投票机制(如多数表决)决定最终结果。

优点:
通过多样性减少共因故障(Common Cause Failure)的风险。

提高系统的容错能力。

缺点:
开发成本高,需要多个团队独立开发。

运行时开销较大,需要额外的计算资源。

应用场景:
航空航天系统、核电站控制系统等高可靠性领域。

2. 恢复块技术(Recovery Blocks)
恢复块技术是一种通过备用模块替换故障模块来实现容错的技术。

它采取的是后向恢复策略,后恢复策略就是,从当前出错时刻往回走,走到一个无错误的点。

其主要方式是多重模块待机储备,当系统检测到某工作模块出现错误时,就用一个备用的模块来替代它并重新运行。
各备用模块在其待机时,可与主模块一样工作,也可以不工作(一般来说是不工作的)。前者叫热备份系统(双重系统),后者叫冷备份系统(双工系统、双份系统)。

恢复块设计是一种动态冗余系统设计的方法。所谓动态冗余,就是在发现故障之后,利用冗余资源对有故障的部件进行替换,或对系统进行重构和恢复。

在恢复块设计中,有N个业务功能相同的独立系统。将一个系统定为主块,其他系统定为备用块。当主块正常运行时,备用块停机。将主块的结果进行验证,如果发现结果质量不合格,那么就启用备用块1进行重新计算,如果还不行就启用备用块2,直到结果合格。

比如一个人口年龄分布情况统计,由3个冗余系统组成,主块率先进行计算,其他后备块不运行,对主块的统计结果进行验证。数据验证逻辑要求每个年龄段的占比在0%~100%之间,所有年龄段占比之和为100%。如果统计结果中80岁以上的人群占比120%,那么验证出主块计算结果有误,启用后备块1重新计算。以此类推。

恢复块设计应保证实现主块和后备块之间的独立性,避免相关错误的产生,使主块和备份块之间的共性错误降到最低程度。当然,恢复块设计必须保证验证测试程序的正确性。

1. 核心思想
恢复块设计的基本思想是:

将系统功能划分为多个独立的模块(块)。

每个块包含一个主模块和多个备用模块。

主模块执行任务后,通过验收测试检查结果是否正确。

如果验收测试失败,则切换到备用模块重新执行任务,直到找到一个能够通过验收测试的模块。

2. 工作流程
恢复块设计的工作流程通常包括以下步骤:

主模块执行:主模块执行任务并生成结果。

验收测试:对主模块的结果进行验证,检查其是否正确。

如果结果正确,则继续执行后续任务。

如果结果错误,则进入恢复流程。

恢复流程:

切换到第一个备用模块,重新执行任务。

对备用模块的结果进行验收测试。

如果备用模块的结果正确,则继续执行后续任务。

如果备用模块的结果错误,则继续切换到下一个备用模块,直到找到一个能够通过验收测试的模块。

失败处理:如果所有备用模块都无法通过验收测试,则系统进入失败处理状态(如记录错误日志、触发告警等)。

3. 关键组件
恢复块设计的关键组件包括:

主模块:负责执行主要任务。

备用模块:在主模块失败时提供备用功能。

验收测试:用于验证模块执行结果的正确性。

恢复管理器:负责管理主模块和备用模块的切换。

4. 优点
简单易实现:恢复块设计基于模块化思想,易于实现和维护。

运行时开销小:只有在主模块失败时才会切换到备用模块,运行时开销较小。

适用于实时系统:由于恢复块设计的快速恢复特性,适用于对实时性要求较高的系统。

5. 缺点
备用模块设计复杂:备用模块需要与主模块功能相同但实现方式不同,设计和测试工作量较大。

验收测试设计困难:验收测试需要能够准确判断模块执行结果的正确性,设计难度较高。

备用模块可能失效:如果备用模块也存在问题,恢复块设计的容错效果会降低。

6. 应用场景
恢复块设计适用于以下场景:

实时系统:如航空航天、工业控制系统等对实时性要求较高的领域。

嵌入式系统:如智能设备、汽车电子等资源受限但可靠性要求较高的场景。

关键任务系统:如金融交易系统、医疗设备等对可靠性要求极高的领域。

7. 示例
假设有一个控制系统,负责计算并输出某个关键参数。恢复块设计的实现如下:

主模块:使用算法A计算参数。

备用模块1:使用算法B计算参数。

备用模块2:使用算法C计算参数。

验收测试:检查计算结果的合理性(如是否在预期范围内)。

恢复流程:

如果主模块的结果未通过验收测试,则切换到备用模块1重新计算。

如果备用模块1的结果也未通过验收测试,则切换到备用模块2重新计算。

如果所有模块都无法通过验收测试,则触发告警并记录错误日志。

8. 与其他容错技术的对比
特性 恢复块设计 N版本程序设计 检查点与回滚
核心思想 主模块失败时切换到备用模块 多个独立版本同时执行并投票 保存状态并在故障时回滚
运行时开销 较小 较大 中等
适用场景 实时系统、嵌入式系统 高可靠性系统(如航空航天) 长时间运行的任务(如数据库)
设计复杂度 中等 高 中等
3. 检查点与回滚(Checkpointing and Rollback)
检查点与回滚是一种通过保存系统状态并在故障发生时恢复到之前状态的技术。

核心思想:
在系统运行过程中定期保存状态(检查点)。

当检测到故障时,系统回滚到最近的检查点并重新执行。

优点:
适用于长时间运行的任务。

可以有效减少故障导致的数据丢失。

缺点:
保存检查点会占用额外的存储空间。

回滚和重新执行会带来一定的性能开销。

应用场景:
分布式系统、数据库系统等。

4. 冗余设计(Redundancy)
冗余设计是通过增加额外的硬件或软件资源来提高系统可靠性的技术。

核心思想:
硬件冗余:增加额外的硬件设备(如备用服务器、磁盘阵列等)。

软件冗余:增加额外的软件模块或数据副本。

优点:
提高系统的可用性和容错能力。

硬件冗余可以实现无缝切换。

缺点:
成本较高,需要额外的资源。

软件冗余可能增加系统的复杂性。

应用场景:
服务器集群、云计算平台等。

5. 异常处理(Exception Handling)
异常处理是一种通过捕获和处理运行时错误来提高系统可靠性的技术。

核心思想:
在代码中预定义异常处理逻辑。

当发生错误时,系统捕获异常并执行相应的处理逻辑(如重试、日志记录、降级服务等)。

优点:
实现简单,适用于各种规模的系统。

可以有效防止系统崩溃。

缺点:
需要开发人员对可能的错误有充分的预见性。

过度使用异常处理可能影响代码的可读性。

应用场景:
所有类型的软件系统。

6. 故障注入测试(Fault Injection Testing)
故障注入测试是一种通过人为引入故障来测试系统容错能力的技术。

核心思想:
在系统中人为引入故障(如网络延迟、内存错误等)。

观察系统的反应,验证其容错能力。

优点:
可以提前发现系统的潜在问题。

帮助优化系统的容错设计。

缺点:
需要额外的测试工具和环境。

可能对系统造成不可预知的影响。

应用场景:
高可靠性系统的测试阶段。

7. 自修复系统(Self-Healing Systems)
自修复系统是一种通过自动检测和修复故障来提高系统可靠性的技术。

核心思想:
系统能够自动检测故障(如通过监控和日志分析)。

自动执行修复操作(如重启服务、切换备用模块等)。

优点:
减少人工干预,提高系统的可用性。

适用于大规模分布式系统。

缺点:
实现复杂,需要先进的监控和修复机制。

修复操作可能引入新的问题。

应用场景:
云计算平台、微服务架构等。

总结
软件容错技术是提高系统可靠性和可用性的重要手段,主要包括N版本程序设计、恢复块技术、检查点与回滚、冗余设计、异常处理、故障注入测试和自修复系统等。不同的技术适用于不同的场景,开发人员需要根据系统的需求和特点选择合适的容错方法。在实际应用中,通常会结合多种容错技术以达到最佳效果。

真题内容
题目:
N版本设计较传统设计多了哪三个步骤?
选项:
A. 相异成分规范评审、相异性确认、背对背测试
B. 相同成分规范评审、面对面测试、背对背测试
C. 相异成分规范评审、面对面测试、背对背测试
D. 相同成分规范评审、相异性确认、背对背测试

正确答案:
A. 相异成分规范评审、相异性确认、背对背测试

解析
N版本设计(N-Version Programming)是一种软件容错技术,通过开发多个独立版本的软件模块来提高系统的可靠性。与传统设计相比,N版本设计多了以下三个步骤:

相异成分规范评审:对多个版本的软件模块进行独立的规范评审,确保每个版本的设计和实现都是独立的。

相异性确认:验证不同版本之间的差异,确保它们在实现上具有足够的多样性,以减少共因故障的风险。

背对背测试:对多个版本进行独立的测试,确保它们在相同输入条件下能够产生一致且正确的结果
————————————————
版权声明:本文为CSDN博主「薛定谔的猫1982」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sadfasdfsafadsa/article/details/145014986