雪崩效应
"基础服务故障"导致"级联故障"的现象称为雪崩效应,雪崩效应描述的是提供者不可用导致消费者不可用,并将不可用逐渐放大的过程
A作为服务提供者(基础服务),B为A的服务消费者,C和D是B的服务消费者. 当A不可用引起了B的不可用,并将不可用滚雪球一样放大到C和D时,雪崩效应就形成了.
如何容错
要防止雪崩效应,就要有一个强大的容错机制,该机制需实现至少两点
-
为网络请求设置超时
通常情况下,一次远程调用读经着一个线程/进程. 如果相应太慢,这个线程/进程就得不到释放.而线程/进程又对应着系统资源,如果得不到释放的线程/进程越积越多,资源就会逐渐耗尽,最终导致服务的不可用,因此,每个网路请求必须设置超时,让资源尽快释放.
-
使用断路器模式
如果对某个为服务的请求有大量超时(说明该服务已经不可用),再去让新的请求访问该服务已经没有任何意义,只会无谓消耗资源.
断路器的实现
断路器可理解为对容易导致犯错的操作的代理,这种代理能够统计一段时间内调用失败的次数,并决定是正常请求还是直接返回,断路器可以实现快速失败,即不再请求失败的服务.这样,应用程序就无须在浪费CPU时间去等待长时间的超时.断路器也应该可自动诊断服务是否已经恢复正常,如果发现服务已经恢复正常,那么就会恢复请求该服务,以实现服务的“自我修复”
简单的设计方案
- 正常情况下,断路器关闭,可正常请求依赖的服务
- 当一段时间内,请求失败率达到一定阈值(占比或频率等),断路器就会打开,此时,不会再去请求服务
- 当断路器打开一段时间后,会自动进入一个“半开”状态,此时断路器可放开一个请求去访问服务,如果该请求能攻调用成功,则关闭断路器,否则继续保持打开状态