什么是服务雪崩?

lili_lu 发表于 2021/01/26 20:57:19 2021/01/26
【摘要】 服务雪崩效应的定义很简单,是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程。可以结合下图进行理解:服务雪崩上图中,A作为基础的服务提供者,为B和C提供服务,D、E、F是B和C服务的调用者,当A不可用时,将引起B和C的不可用,并将这种不可用放大到D、E、F,从而可能导致整个系统的不可用,服务雪崩的产生可能导致分布式系统的瘫痪。服务雪崩效应的产生一般有三个流程,服务提供...

服务雪崩效应的定义很简单,是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程。

可以结合下图进行理解:

服务雪崩

上图中,A作为基础的服务提供者,为B和C提供服务,D、E、F是B和C服务的调用者,当A不可用时,将引起B和C的不可用,并将这种不可用放大到D、E、F,从而可能导致整个系统的不可用,服务雪崩的产生可能导致分布式系统的瘫痪。

服务雪崩效应的产生一般有三个流程,服务提供者不可用 -> 重试加大流量 -> 服务调用者不可用

服务提供者不可用的出现的原因有很多,可能是因为服务器的宕机或者网络故障,也可能是因为程序存在的Bug,也有可能是大量的请求导致服务提供者的资源受限无法及时响应,还有可能是因为缓存击穿造成服务提供者超负荷运行等等,毕竟没有人能保证软件的完全正确性。

在服务提供者不可用发生之后,用户可能无法忍受长时间的等待,不断地发送相同的请求,服务调用者重新调用服务提供者,同时服务提供者中可能存在对异常的重试机制,这些都会加大对服务提供者的请求流量。然而此时的服务提供者已经是一艘破船,它也无能无力,无法返回有效的结果。

最后是服务调用者因为服务提供者的不能用导致了自身的崩溃。当服务调用者使用同步调用的时候,大量的等待线程将会耗尽线程池中的资源,最终导致服务调用者的宕机,无法响应用户的请求,服务雪崩效应就此发生了。

断路器

在分布式系统中,不同服务之间发生的调用非常常见,当服务提供者不可用时就很有可能发生服务雪崩的效应,导致整个系统的不可用。所以为了预防这种请求的发生,可以通过断路器模式进行预防(类比电路中的断路器,在电路过大的时候自动断开,防止电线过热损害整条电路)。

断路器模式背后的思想很简单,将远程函数调用包装到一个断路器对象中,用于监控函数调用过程的失败。一旦该函数调用的发生失败的次数在一段时间内到达一定的阀值,那么这个断路器将会跳闸,然后接下来时间里对该被保护函数调用的线程将会被断路器直接返回一个错误,而不再发生该函数的真实调用。这样子就避免了服务调用者在服务提供者不可用时发送请求,从而减少线程池中资源的消耗,保护了服务调用者。

断路器时序图

虽然上面的断路器在打开的时候避免了被保护的函数调用,但是当情况恢复正常时,需要外部干预来重置断路器,使得函数调用可以重新发生。所以合理的断路器应该具备以下的开关转化逻辑,它需要一个机制来控制它的重新闭合,图6-3中是通过一个重置时间来决定。


断路器状态图
  • 关闭状态: 断路器处于关闭状态,统计调用失败次数,在一段时间内到达一定的阀值后断路器打开。
  • 打开状态: 断路器处于打开状态,对函数调用直接返回失败错误,不发生真正的函数调用。设置了一个重置时间窗,在重置时间窗结束后,断路器来到半开状态。
  • 半开状态: 断路器处于半开状态,此时允许进行函数调用,当调用都成功了(或者成功到达一定的比例),关闭断路器,否则认为服务没有恢复,重新打开断路器。

断路器的打开能保证服务调用者在调用异常服务时,快速返回结果,避免大量的同步等待,减少服务调用者的资源消耗。并且断路器能在打开的一段时间后继续侦测请求执行结果,提供断路器关闭的可能,恢复服务的调用。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。