9种常用的软件容错处理方式
本文重点讨论软件容错的问题。
一个完整的系统在内部是由很多小服务构成,服务之间以及服务与资源之间会存在远程调用,每个系统的可用性不可能达到100%,所以容错处理显得尤为重要!容错的目标是降低或者最小化故障对系统可用性、可靠性、安全性等的影响。
一般而言,系统故障从大的角度看来自两个方面,分别是硬件故障和软件故障,硬件故障通常是不可自恢复的故障,必须人为去检修处理;而软件故障可以通过多种方式去规避预防,最大程度保证系统可用性。
硬件容错常用的方法包括使用冗余多备份技术、增加内存、能源系统冗余等,硬件错误通常能够在两台物理机上进行隔离处理。软件容错的方式更加多样,今天我们重点探讨一下软件容错的问题。
故障的演进
软件系统异常并不是一蹴而就的,毕竟在系统上线前要经过严格的单元测试、集成测试、回归测试等环节,至少会把很多显性的、容易暴露的问题发现并fix掉,没有达到测试标准的系统也不会上线。那么故障到底来自于哪里呢?
说来也简单,就是一个fault(缺陷)到error(错误)到failure(故障)的转换过程,系统缺陷在某种特定环境下被激活,然后系统产生错误,紧接着系统错误运行使得系统发生某种故障。
要注意的是,错误并不一定导致系统故障,可以理解错误是故障的充分条件。一个最简单的例子是发生了网络错误,但这个网络错误可能只是暂时的不可访问状态,并不一定会升级为故障。
故障的由来
在我们日常开发工作中,最常见的故障来自于系统单点故障,单点故障迟迟得不到处理后便升级为系统性故障甚至全面瘫痪。
单一故障点是指没有备用的冗余组件的硬件或软件组件,而这些组件是系统重要的组成部分。该组件出现故障会使系统无法继续提供服务。设计容错系统时,必须确定并消除潜在的单一故障点。
一个典型的故障升级可能是这样的:系统中资金冻结服务存在严重的缺陷,所有部署该服务的机器平均响应速度逐渐慢下来,当大量下单请求进来时,慢慢消耗掉系统所有资源,进而导致整个系统不可用。
故障的常用容错方法
软件故障的容错方法如果用一句话来简单概况的话也简单:通过定义规则来容忍系统缺陷。但这样的定义未免过于大而空,我们需要切实有效可落地的方式。下面介绍9种常用的处理方式。
▐ Process Pairs
也就是最简单的backup方案,保证系统在某一个时刻总能有一个进程来处理客户的输入请求,能处理短暂的软件错误。
▐ Graceful Degradation
就是我们常说的降级,在系统遭遇某个错误之后不提供完整功能,只给用户开放部分基础能力,此解决方案通常是上面的backup方案持续性不work的时候采取的保护措施。
▐ Selective Retry
选择性重试也是可选的方案之一,它主要适用于是突发式高负载资源短缺的场景,例如,网络瞬时打满峰值不可访问或者内存资源短缺,重试能够增加资源分配成功的可能性。
▐ State Handling
在系统不能提供服务后,又要保证client的无状态属性。服务端需要持续保存当前的状态,用于故障后的重试。
▐ Linking Process
有些程序进程是相互依赖的,如果某个进程出错,其他依赖的进程需要侦测到错误,明确做相应的处理,通常是结束全部依赖进程。
▐ Checkpoint
周期性的保存进程的状态。如果需要保证数据正确,回滚到最近保存的状态即可,只是会有部分的数据丢失。
▐ Update Lost
上面方案的补充版,在两个checkpoint之间系统故障,需要保存客户请求,在rollback前一个版本之后重新处理这些请求。
▐ Process Pools
使用资源预分配技术,按照经验设定好某些请求资源的需求量,为程序分配合适的资源。就像我们为某个任务分配线程池大小一样。
▐ Micro reboot
通过解耦系统组件,使得系统在遭遇故障时,只需要重启需要的组件,而不必重启整个系统。核心是组件和数据分离,数据的处理通过持久化存储的方式保证一致。
容错、熔断、隔离?
“隔离”是一种异常检测机制,常用的检测方法是请求超时、流量过大等。一般的设置参数包括超时时间、同时并发请求个数等。
“熔断”是一种异常反应机制,“熔断”依赖于“隔离”。熔断通常基于错误率来实现。一般的设置参数包括统计请求的个数、错误率等。
“容错”是一种异常处理机制,“容错”依赖于“熔断”。熔断以后,会调用“容错”的方法。一般的设置参数包括调用容错方法的次数等。
总结
对可用性的要求达四个或五个九通常要求系统必须是一个容错系统。容错系统必须能够在硬件或软件出现故障时继续运行。通常,容错的实现手段是为提供关键服务的硬件(如 CPU、内存和网络设备)及软件配置冗余组件。
容错系统的实现和维护成本高昂。需要确保先了解业务可用性要求的本质,然后再考虑能够满足这些要求的可用性解决方案的策略和成本。
一定程度上看,代码中的容错处理体现了一个程序员的基本素养。不管是平凡无奇的业务开发还是程序语言本身的设计,无处不体现了容错处理的重要性,在开发过程中需要不断磨炼思考。
团队介绍
我们是阿里巴巴淘系技术部的新品平台技术团队, 依托于淘系大数据正在建立一套完整的涵盖消费者洞察、宏观及细分市场分析、竞争分析、市场策略研究、产品创新机制等的新品研发和创新孵化平台, 为品牌、商家及行业提供规模化的新品孵化和运营能力, 沉淀新品孵化机制和运营策略, 最终建立起一套基于大数据驱动的从市场研究、新品研发到新品投放营销的全链路新品运营平台。发送邮件到tianhang.th#alibaba-inc.com(发送邮件时,请把#替换成@)
✿ 拓展阅读
作者|马刺
编辑|橙子君
出品|阿里巴巴新零售淘系技术
9种常用的软件容错处理方式相关推荐
- php 登录安全认证,介绍几种常用的web安全认证方式
本文为大家介绍了五种常用的web安全认证方式,具有一定的参考价值,希望能对大家有所帮助. 1.Http Basic Auth 这是一种最古老的安全认证方式,这种方式就是简单的访问API的时候,带上访问 ...
- 20种常用的软件测试方法,建议先收藏再观看
软件测试在完整的项目当中算是最后一个环节,也是非常重要的一个环节.通过软件测试,我们才能得知一个程序是否符合标准. 小编整理出20种常见的软件测试方法,建议伙伴们先收藏再看.不敢说史上最全,但我办公室 ...
- 3种常用的防盗链的方式
场景说明:网站访问人数很少,但是网页访问很慢,很有可能被盗链了,如果网页被盗链,web服务器的访问日志里会发现疯狂的访问请求正从四面八方涌过来,web服务器为了迎接这批访客而没有时间处理正常的页面,这 ...
- 五种常用的JavaScript自定义对象方式
一.直接创建方式: 例子: var student = new Object(); student.name="Kate"; student.doSprot= function(n ...
- 几种常用的软件生命周期模型与敏捷开发解读
瀑布式开发和敏捷开发,看过软件工程相关的书籍的同学,对瀑布模型,增量模型 ,喷泉模型,W模型,V模型以及H模型都是知道一些的,那么现在提到更多的敏捷开发它们之间有什么不同和适用的范围,是否敏捷开发适用 ...
- 3种常用的文件上传方式
第一种,使用formData对象 input的type=file选择文件,返回file对象,封装成formData使用ajax上传,HTML代码如下: <input id="choos ...
- c语言中软件去干扰,10种常用的软件滤波方法及示例程序
一.限幅滤波法 A.方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效 如果本次值与上次值之差>A,则本次值无 ...
- 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式
[方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其 ...
- Windows校验文件哈希hash的两种常用方式
大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...
最新文章
- zabbix 监控项自动发现过滤_Zabbix5.2由浅入深之官方自动发现规则初探(网络篇)
- wince mysql吗_wince的数据库操作
- 安卓短信加密_发短信控制车辆!苹果发布ios14,手机可作车钥匙
- [Bash]kill指定的进程名
- 工业机器人工具中心点标定的意义_如何理解工业机器人的工具中心点
- 【Android】Uri和Url和URN
- BATJ一线大公司需要什么样的前端
- PHP笔记-JavaScript中使用Smarty变量
- Mysql开启远程连接方法
- 【转】深度解析 Qt 中动态链接库
- C++刷题——2802: 推断字符串是否为回文
- 语法错误: leftparen 应在 colon 之前
- Linux 返回根目录,返回主目录
- 你认为3D建模是像程序员一样敲代码吗?你太out了
- 2020年IT运维市场大前景到底怎么样
- zzulioj1138: C语言合法标识符
- 微信小程序接入第三方插件腾讯位置服务地图选点
- 517编程3380造素数
- 链新:区块链大赛火热,成为技术与创意的练兵场
- apidoc写php接口文档