微服务实现容错手段

一 介绍
如果服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直到提供者响应或超时。在高负载场景下,如果不作任何处理,此类问题可能会导致服务消费者的资源耗尽甚至整个系统崩溃。例如,曾经发生过一个案例——某电子商务网站在一个黑色的星期五发生了过载。过多的并发请求,导致用户支付的请求延迟很久都没有响应,在等待很长时间后最终失败。失败又导致用户重新刷新页面再次尝试支付,进一步增加了服务器的负载,最终整个系统都崩溃了。
当依赖的服务不可用时,服务自身会不会被拖垮?这是我们要考虑的问题。
二 雪崩效应
微服务架构的应用系统通常包含多个服务层。微服务之间通过网络进行通信,从而支撑起整个应用系统,因此,微服务之间难免存在依赖关系。我们知道, 任何微服务并非100%可用,网络往往也很脆弱,因此难免有些请求会失败。
我们常把“基础服务故障”导致“级联故障”的现象称为雪崩效应。雪崩效应描述的是提供者不可用导致消费者不可用,并将不可用逐渐放大的过程。
如下图,A作为服务提供者(基础服务),B作为A的服务消费者,C和D是B的服务消费者。当A不可用引起B不用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。
三 如何容错
要想防止雪崩效应,必须有一个强大的容错机制。该容错机制需实现以下两点。
1 超时机制
通过网络请求其他服务时,都必须设置超时,正常情况下,一个远程调用一般在几十毫秒内就返回了。当依赖的服务不可用,或者因为网络问题,响应时间就会变得很长(几十秒)。而通常情况下,一次远程调用对应一个线程/进程,如果响应太慢,那这个线程/进程就会得不到释放。而线程/进程都对应了系统资源,如果大量的线程/进程得不到释放,并且越积越多,服务资源就会被耗尽,从而导致微服务不可用。所有,必须为每个请求设置超时。
2 断路器模式  
试想一下,家庭里如果没有断路器,电流过载了(例如功率过大、短路等),电路不断开,电路就会升温,甚至烧断电路,起火。有了短路器之后,当电流过载时,会自动切断电路(跳闸),从而保护了整条电路与家庭安全,当电流过载的问题被解决后,只要关闭断路器,电路就又可以工作了。
同样的道理,当依赖的服务有大量超时时,再让新的请求去访问已经没有太大的意义,只会无谓的消耗现有的资源。譬如我们设置超时时间为1秒,如果短时间内有大量的请求(例如50个)在1秒内都得不到响应,就往往意味着异常,此时就没有必要让更多的请求访问这个依赖了,我们应该使用断路器避免资源浪费。
断路器可以实现快速失败,如果它在一段时间内侦测到许多类似的错误(例如超时),就会强迫其以后的多个调用快速失败,不再请求所依赖的服务,从而防止应用程序不断地尝试执行可能会失败的操作,这样应用程序可以继续执行而不用等待修正错误,或者浪费CPU时间等待长时间的超时。断路器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。
断路器模式就像是那些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定是否运行操作继续,或者立即返回错误。
四 断路器要实现的功能
1 监控:总共请求多少次,有多少次失败,假设失败率达到10%,断路器打开。
2 断路器的状态
3 分流
4 自我修复(断路器状态的切换)

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/80752045