本文重点讨论软件容错的问题。

一个完整的系统在内部是由很多小服务构成,服务之间以及服务与资源之间会存在远程调用,每个系统的可用性不可能达到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种常用的软件容错处理方式相关推荐

  1. php 登录安全认证,介绍几种常用的web安全认证方式

    本文为大家介绍了五种常用的web安全认证方式,具有一定的参考价值,希望能对大家有所帮助. 1.Http Basic Auth 这是一种最古老的安全认证方式,这种方式就是简单的访问API的时候,带上访问 ...

  2. 20种常用的软件测试方法,建议先收藏再观看

    软件测试在完整的项目当中算是最后一个环节,也是非常重要的一个环节.通过软件测试,我们才能得知一个程序是否符合标准. 小编整理出20种常见的软件测试方法,建议伙伴们先收藏再看.不敢说史上最全,但我办公室 ...

  3. 3种常用的防盗链的方式

    场景说明:网站访问人数很少,但是网页访问很慢,很有可能被盗链了,如果网页被盗链,web服务器的访问日志里会发现疯狂的访问请求正从四面八方涌过来,web服务器为了迎接这批访客而没有时间处理正常的页面,这 ...

  4. 五种常用的JavaScript自定义对象方式

    一.直接创建方式: 例子: var student = new Object(); student.name="Kate"; student.doSprot= function(n ...

  5. 几种常用的软件生命周期模型与敏捷开发解读

    瀑布式开发和敏捷开发,看过软件工程相关的书籍的同学,对瀑布模型,增量模型 ,喷泉模型,W模型,V模型以及H模型都是知道一些的,那么现在提到更多的敏捷开发它们之间有什么不同和适用的范围,是否敏捷开发适用 ...

  6. 3种常用的文件上传方式

    第一种,使用formData对象 input的type=file选择文件,返回file对象,封装成formData使用ajax上传,HTML代码如下: <input id="choos ...

  7. c语言中软件去干扰,10种常用的软件滤波方法及示例程序

    一.限幅滤波法 A.方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效 如果本次值与上次值之差>A,则本次值无 ...

  8. 【方法整理】Oracle 获取trace跟踪文件名的几种常用方式

    [方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其 ...

  9. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

最新文章

  1. zabbix 监控项自动发现过滤_Zabbix5.2由浅入深之官方自动发现规则初探(网络篇)
  2. wince mysql吗_wince的数据库操作
  3. 安卓短信加密_发短信控制车辆!苹果发布ios14,手机可作车钥匙
  4. [Bash]kill指定的进程名
  5. 工业机器人工具中心点标定的意义_如何理解工业机器人的工具中心点
  6. 【Android】Uri和Url和URN
  7. BATJ一线大公司需要什么样的前端
  8. PHP笔记-JavaScript中使用Smarty变量
  9. Mysql开启远程连接方法
  10. 【转】深度解析 Qt 中动态链接库
  11. C++刷题——2802: 推断字符串是否为回文
  12. 语法错误: leftparen 应在 colon 之前
  13. Linux 返回根目录,返回主目录
  14. 你认为3D建模是像程序员一样敲代码吗?你太out了
  15. 2020年IT运维市场大前景到底怎么样
  16. zzulioj1138: C语言合法标识符
  17. 微信小程序接入第三方插件腾讯位置服务地图选点
  18. 517编程3380造素数
  19. 链新:区块链大赛火热,成为技术与创意的练兵场
  20. apidoc写php接口文档

热门文章

  1. 多租户积分系统功能清单
  2. 用ENSP华为模拟器做图书馆得网络配置和设计
  3. RouterOS 常用命令、用法及官方资料
  4. vue3 + element-plus组件的国际化
  5. 如何删除和添加word的脚注那个横线
  6. 网络安全态势感知研究综述、MD5C#实现
  7. java 用遗传算法解决图像二值化问题 找阈值
  8. 使用jdbc创建一张员工表 员工表字段:编号,姓名,性别,年龄,职位,邮箱,电话
  9. 【VRP系统你了解多少呢?】
  10. 装逼必备:大型分布式网站术语分析