一文读懂容错机制

一文读懂容错机制

随着分布式、微服务项目的快速发展,各个服务之间的通讯,难免出现依赖关系,若某一个单元出现故障,就很容易因依赖关系而发生故障的蔓延,为了解决这样的问题,容错作为其中一项很重要的技术也广为人知。

导语:

容错机制广义的理解,就是包含了很多处理错误的机制,如:熔断机制、降级机制、补偿机制、隔断机制等等。我们针对经常使用的机制进行讨论,说明这么多容错机制设计的思路,熟悉了这些之后,也许你对设计分布式项目会有所裨益。

隔离机制

0.png

隔离设计思路

如上图所示(图来源于网络),隔离来自单词隔板(Bulkheads),隔板作用就是如果某一边船舱漏水,不会导致整条船装满水而导致整条船下沉于水中。

分布式项目中,我们通过技术实现隔板的作用,做到故障隔离,一般来说,一种是通过合适的业务线拆分项目,进行业务服务种类隔离,另一种是通过用户群体来区分用户访问哪台服务器,可以是城市划分(北京的访问北京服务器)或其他形式。

隔离设计重点

  1. 定义好需要隔离业务的大小和粒度
    2.隔离模式需要配置一些高可用、重试、异步、消息中间件等设计的方式配套使用
  2. 设计过程考虑运维的复杂度,要能驾驭的话,考虑自动化运维等监控系统(重要、重要、重要)

补偿机制

补偿机制的本质

针对补偿机制的出现,本质上是解决ACID和BASE理论而设计的一个机制,关于ACID和BASE理论网上有很多知识,可以说是汗牛充栋.
有了对 ACID 和 BASE 的分析,你就可以发现,BASE理论容许系统处于短暂的不可用和不一致的状态,那么在设计的时候怎么去保证最终的可用和一致状态呢?这就需要引入补偿机制。
比如: 如果你如打印东西,电子文件拷入u盘,带到打印店,打印店老板开始打印,但是由于你拷错了文件,导致我们文件打印就是不可用的,那这也不会阻止我们要打印的文件,因为我们可以借用打印店老板电脑登陆邮箱下载下来,退一步来讲,如果邮箱没有,那我就取消本次打印,回家整理好,之后再来.这也就说明了业务流程必须执行回滚操作.
如果一个事务失败了或是超时了,我们需要不断地重试,努力地达到我们想要的结果,然而如果不能达到这个结果, 我们要把整个业务线状态恢复之前的状态, 如果有部分业务变化, 我们要把变化的数据更新回原来的状态.

一个好的补偿机制要做以下几个方面:

  1. 要清楚的知道这个机制执行后要达到什么状态
  2. 当补偿机制的代码运作起来,我们可以进行并行或串行
  3. 对完成的事务进行修改,可以考虑加一个修改事务

看到这里相信你知道补偿机制主要做什么了,补偿机制主要做以下两件事:

  1. 努力把一个业务执行完成
  2. 如果执行不完成,将会启动一个补偿机制,回滚业务流程

补偿设计重点

  1. 因为补偿机制是为了努力执行一个业务流程,需要这个流程中所设计的方法或接口支持幂等性,并且在上游有重试机制
  2. 如果业务流程有问题,一定要帮我们回滚和补偿
  3. 必须明白,业务补偿和业务逻辑是强业务关联的,很难通用
  4. 针对不同业务考虑不同细节(很多细节上,是根据业务考虑,望大家一定要考虑好再开工)

熔断机制

熔断器设计思路

设想一个场景,用户的请求调用服务A,服务A调用服务B。我们可以把B称作A的下游服务。服务B前面有负载均衡器。
后端服务可能因为各种原因出问题。例如:数据库慢查询,网络波动,或者内存争用。在这个情况下,如果服务A超时或者报错,用户很可能会重试。在如此混乱的情况下我们可以做什么来保护下游服务呢?
熔断机制目的是为了解决资源和失败率提供更多的控制,这个机制最重要的部分是熔断器能够快速对下游服务作出一些响应。线程池不会因为慢请求而阻塞,没有超时,而且也可能会给终端用户更有意义的返回数据。熔断器也给了下游服务足够的时间恢复正常。完全避免报错是很困难的,但是减少错误的影响完全可行。
在熔断机制中有3种主要的状态:
0.jpeg

  1. 关闭(closed):让请求通过的默认状态。如果请求成功/失败但低于阈值,则状态保持不变。可能出现的错误是超过最大并发数和超时错误。
  2. 打开(open):当熔断器打开的时候,所有的请求都会被标记为失败;这是故障快速失败机制,而不需要等待超时时间完成。
  3. 半开(half-open):定期的尝试发起请求来确认系统是否恢复。如果恢复了,熔断器将转为关闭状态或者保持打开。

熔断器设计重点

  1. 错误的类型 (针对不同的错误,开启不同的容错机制,有时候需要多个机制配合使用)
  2. 测试服务是否可用(利用心跳来检测远程服务的健康接口)
  3. 并发问题(针对同一时刻断路器请求调用的负担,一般来说会有一个共享数据结构,会导致有锁情况,我们需要改成无所的数据接口,这样会更好)
  4. 手动重制(失败操作的恢复很难确定,如果断路器保护的服务长时间不能用,管理员能够强制改成断开状态)
  5. 资源分区(针对下游数据层,我们可能做多库多表,我们要对根据那些数据区域进行熔断,而不是整条业务线)
  6. 监控系统(日志监控系统,重要的性质不用多强调)

重试机制

重试机制的思路

对上面的熔断器模型,如果B服务减小它的实例数量,将发生什么?许多A发起的请求可能遇到5XX报错。这将触发熔断器的失败报警。这就是为什么我们需要重试以避免间歇性网络抽风。
所以,我们需要一个重试的机制。但是,我们需要明白的是,“重试”的语义是我们认为这个故障是暂时的,而不是永久的,所以我们会去重试.
重试机制设计重点

  1. 要缺点错误类型,再做是否需要重试
  2. 重试的抖动数要根据业务缺点,不同的业务有不同的考量
  3. 如果超过指定次数和时间,重试机制就失去了意义

小结

好了,关于容错机制的多种机制就简单介绍到这里了,还有很多机制需要大家去通过业务场景进行使用,比如:降级机制、限流机制等等,针对容错技术上,可以选容错框架(比如:hystrix,虽然已经不再维护,但足够业务场景使用)或者是其他的容错框架.你应该明白了容错机制的重要性和必要性,之后再探讨其他技术切入点.

# 架构师 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×