9种常用的软件容错处理方式

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

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



一个完整的系统在内部是由很多小服务构成,服务之间以及服务与资源之间会存在远程调用,每个系统的可用性不可能达到100%,所以容错处理显得尤为重要!容错的目标是降低或者最小化故障对系统可用性、可靠性、安全性等的影响。一般而言,系统故障从大的角度看来自两个方面,分别是硬件故障和软件故障,硬件故障通常是不可自恢复的故障,必须人为去检修处理;而软件故障可以通过多种方式去规避预防,最大程度保证系统可用性。硬件容错常用的方法包括使用冗余多备份技术、增加内存、能源系统冗余等,硬件错误通常能够在两台物理机上进行隔离处理。软件容错的方式更加多样,今天我们重点探讨一下软件容错的问题。

故障的演进


软件系统异常并不是一蹴而就的,毕竟在系统上线前要经过严格的单元测试、集成测试、回归测试等环节,至少会把很多显性的、容易暴露的问题发现并fix掉,没有达到测试标准的系统也不会上线。那么故障到底来自于哪里呢?

image.png

说来也简单,就是一个fault(缺陷)到error(错误)到failure(故障)的转换过程,系统缺陷在某种特定环境下被激活,然后系统产生错误,紧接着系统错误运行使得系统发生某种故障。

要注意的是,错误并不一定导致系统故障,可以理解错误是故障的充分条件。一个最简单的例子是发生了网络错误,但这个网络错误可能只是暂时的不可访问状态,并不一定会升级为故障。


故障的由来


在我们日常开发工作中,最常见的故障来自于系统单点故障,单点故障迟迟得不到处理后便升级为系统性故障甚至全面瘫痪。

单一故障点是指没有备用的冗余组件的硬件或软件组件,而这些组件是系统重要的组成部分。该组件出现故障会使系统无法继续提供服务。设计容错系统时,必须确定并消除潜在的单一故障点。

image.png

一个典型的故障升级可能是这样的:系统中资金冻结服务存在严重的缺陷,所有部署该服务的机器平均响应速度逐渐慢下来,当大量下单请求进来时,慢慢消耗掉系统所有资源,进而导致整个系统不可用。


故障的常用容错方法


软件故障的容错方法如果用一句话来简单概况的话也简单:通过定义规则来容忍系统缺陷。但这样的定义未免过于大而空,我们需要切实有效可落地的方式。下面介绍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(发送邮件时,请把#替换成@)



相关文章
|
2月前
|
消息中间件 缓存 监控
在FaaS中,如何设计无状态的函数来确保数据处理的一致性?
在FaaS中,如何设计无状态的函数来确保数据处理的一致性?
|
5月前
|
编译器 调度 C++
协程问题之机制保障中提到的早值班机制和稳定性周会机制分别是什么
协程问题之机制保障中提到的早值班机制和稳定性周会机制分别是什么
|
2月前
|
运维 监控 安全
自动恢复机制在哪些情况下可能无法正常工作,有哪些替代方案?
自动恢复机制在哪些情况下可能无法正常工作,有哪些替代方案?
|
4月前
|
负载均衡 NoSQL 调度
异步任务处理系统问题之任务执行子系统实现任务的可靠执行的问题如何解决
异步任务处理系统问题之任务执行子系统实现任务的可靠执行的问题如何解决
|
4月前
|
弹性计算
异步任务处理系统问题之哪些级别的系统支持任务流控能力
异步任务处理系统问题之哪些级别的系统支持任务流控能力
|
4月前
|
存储 Kubernetes 中间件
软件环境管理问题之保证环境的一致性如何解决
软件环境管理问题之保证环境的一致性如何解决
|
4月前
|
监控 Java API
分布式链路监控系统问题之对Java应用实现字节码增强的方式的问题如何解决
分布式链路监控系统问题之对Java应用实现字节码增强的方式的问题如何解决
|
5月前
|
负载均衡 中间件 定位技术
中间件故障转移和容错实现方法
【7月更文挑战第24天】
67 2
|
5月前
|
存储 数据中心 开发者
交易链路设计原则&模式问题之协调者在系统中的知名度对开发的影响如何解决
交易链路设计原则&模式问题之协调者在系统中的知名度对开发的影响如何解决
|
7月前
|
存储 缓存 负载均衡
软件容错技术和方法在系统中的具体应用
软件容错技术和方法在系统中的具体应用
142 0
下一篇
无影云桌面