目录
干货分享,感谢您的阅读!
在现代软件架构中,尤其是在分布式系统和微服务架构中,服务的可用性与稳定性是至关重要的。随着系统复杂性的增加,服务间的相互依赖和外部环境的变化,容错与故障应对成为了保障系统稳定性和高可用性的核心策略之一。为了应对瞬息万变的系统负载和突发的流量高峰,限流、降级和熔断等机制已成为构建健壮系统的必备工具。
本篇文章将深入探讨如何通过有效的容错设计、隔离策略以及限流降级机制,在微服务架构中实现系统的高可用性与稳定性。我们将从具体的实践案例出发,分析如何在面临各种系统故障和资源瓶颈时,通过一系列策略的组合保障服务不中断、客户体验不受影响。无论你是架构师、开发人员,还是运维工程师,本文的内容都将为你提供有力的指导,帮助你应对日益复杂的系统挑战。
一、服务访问失败的原因和应对策略
(一)服务访问失败的4大原因和分类
1.硬件失败
一旦出现便是灾难性的,一般分为两类:
例如机房失火、机器损害等不可抗力导致的、发生概率极低的情况;
例如由于日志文件过大导致硬盘无法写入、网络路由无效等可以通过调整硬件状态进行恢复的失败情况。
2.分布式环境的固有原因
分布式系统中会由于网络的三态性、异构系统集成等因素导致远程调用发生异常情况,微服务作为分布式系统的延伸这些问题依旧存在并无法完全消除,只能在设计和实现时加以预防,以及在发生时降低其所造成的影响。
3.服务自身失败
由于设计上考虑不周、代码中存在的问题造成的失败,需要深入分析并找到解决问题的方法。
4.服务依赖失败
服务依赖失败相比服务自身失败造成的影响更大且难以发现和处理,是我们重点考虑的失败原因,因为依赖失败的扩散会导致服务访问的雪崩效应。
(二)服务访问的雪崩效应
服务雪崩效应是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程.如果所示:
上图中,A为服务提供者,B为A的服务调用者,C和D是B的服务调用者。当A的不可用,引起B的不可用,并将不可用逐渐放大C和D时, 服务雪崩就形成了。
我把服务雪崩的参与者简化为 服务提供者 和 服务调用者, 并将服务雪崩产生的过程分为以下三个阶段来分析形成的原因:
-
服务提供者不可用
-
重试加大流量
-
服务调用者不可用
服务雪崩的每个阶段都可能由不同的原因造成, 比如造成 服务不可用 的原因有:
-
硬件故障
-
程序Bug
-
缓存击穿
-
用户大量请求
硬件故障可能为硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问.
缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用.
在秒杀和大促开始前,如果准备不充分,用户发起大量请求也会造成服务提供者的不可用.
而形成 重试加大流量 的原因有:
-
用户重试
-
代码逻辑重试
在服务提供者不可用后, 用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单.
服务调用端的会存在大量服务异常后的重试逻辑.
这些重试都会进一步加大请求流量.
最后, 服务调用者不可用 产生的主要原因是:
-
同步等待造成的资源耗尽
当服务调用者使用 同步调用 时, 会产生大量的等待线程占用系统资源. 一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了.
(三)服务访问失败的应对策略
分别站在服务提供者和消费者的角度出发来发现应对服务失败场景的策略和方法,基本原理如下图:
对于服务提供者而言,一旦自身服务发生错误,应该快速返回合理的处理结果;
对于服务消费者而言,重点关注不要被服务提供者所产生的错误影响到自身服务的可用性。
基本策略来看,基本上包括超时、重试和异步解耦。
对于服务消费者而言,为了保护自身服务的可用性,可以使用超时机制降低它所依赖的服务对其造成的影响。同时,设置较短的超时时间有助于解决这个问题。
为降低网络瞬态异常所造成的网络通信问题,可以使用重试机制。
为降低系统耦合度,通过使用一些中间件系统实现服务提供者和服务消费者之间的异步解耦,也能把服务依赖失败的影响分摊到中间件上,从而降低服务失败的概率。
业界一些更为系统的方法和机制确保服务的可靠性有服务容错、服务隔离、服务限流和服务降级。
二、服务容错策略
在分布式系统中,服务可能会遇到各种故障问题,例如网络延迟、服务崩溃等。容错机制的核心思想是通过冗余和重试等手段,确保系统在遇到故障时仍然能够持续运行,并最终恢复到正常状态。冗余可以通过集群来实现,而重试机制则通过不同的策略来解决。以下是几种常见的容错策略,帮助我们根据不同场景来选择最合适的方案
(一)Failover(失效转移)
定义:当一个服务提供者出现故障时,系统会自动将请求转移到另一个可用的服务提供者上,以确保服务的高可用性。同时为防止无限重试,通常对失败重试最大次数进行限制。
实现方式:
- 在集群中保持多个服务实例,通过负载均衡或其他策略来选择健康的实例。
- 重试机制一般会限制最大重试次数,防止因服务长期不可用而无限重试,造成性能浪费。
适用场景:
- 适合对高可用性要求较高的系统,如金融支付、在线购物等。
- 适用于能够容忍一定延迟的场景,因为重试会增加一定的响应时间。
举例说明:利用冗余保障系统高可用性
假设我们有一个在线电商平台,系统的核心部分包括商品查询服务、库存服务和订单服务。为了保证系统的高可用性,我们采用了微服务架构,并且对每个核心服务进行了冗余设计,部署了多个服务实例在不同的节点上。
通过合理设计和部署冗余服务节点,我们可以在服务发生故障时,通过负载均衡和自动恢复机制将流量切换到健康节点,从而确保系统持续高可用。冗余不仅提高了服务的可靠性,还降低了