服务容错模式

一、服务容错

前言

随着框架和服务治理体系的逐步成熟,服务化已成为公司内部系统设计的趋势。业务复杂度的增加,依赖的服务也逐步增加,出现了不少由于服务调用出现异常问题而导致的重大事故。

系统出现故障的可能因素:

(1)系统依赖的某个服务发生延迟或者故障,数秒内导致所有应用资源(线程,队列等)被耗尽,造成所谓的雪崩效应 (Cascading Failure),导致整个系统拒绝对外提供服务。

(2)系统遭受恶意爬虫袭击,在放大效应下没有对下游依赖服务做好限速处理,最终导致下游服务崩溃。

服务雪崩案例:
单个实例出现故障时,处理请求缓慢或者没有响应,导致上层调用它的服务实例变慢,请求开始堆积,负载升高。进一步导致上层调用他的服务实例故障。

最后导致整个架构大面积出现服务实例故障,如同雪崩,突然全部崩溃。这种由单个服务事例引发的级联故障称为服务雪崩。
服务雪崩
服务容错的设计有个基本原则,就是“Design for Failure”。为了避免出现“千里之堤溃于蚁穴”这种情况,在设计上需要考虑到各种边界场景和对于服务间调用出现的异常或延迟情况,同时在设计和编程时也要考虑周到。这一切都是为了达到以下目标:

1)一个依赖服务的故障不会严重破坏用户的体验。

2)系统能自动或半自动处理故障,具备自我恢复能力。

基于这个原则和目标,衍生出一些模式,能够解决分布式服务调用中的一些问题,提高系统在故障发生时的存活能力。

超时:

最简单的容错方式,在调用方为服务调用设置一个超时时间,避免无限制的等待下游系统造成的线程堆积。

重试:

一般和超时模式结合使用,适用于对于下游服务的数据强依赖的场景(不强依赖的场景不建议使用!),通过重试来保证数据的可靠性或一致性,常用于因网络抖动等导致服务调用出现超时的场景。与超时时间设置结合使用后,需要考虑接口的响应时间分布情况,超时时间可以设置为依赖服务接口99.5%响应时间的值,重试次数一般1-2次为宜,否则会导致请求响应时间延长,拖累到整个系统。

限流:

在提供方一端限制进入的流量,保证服务不会因为超负荷流量而崩溃。

仓壁模式:

资源隔离手段。在调用方进行资源隔离,比如使用线程池,保证消耗的资源有上限,避免无限量调用资源占用其他请求的资源。

熔断器:

在调用方进行控制,根据策略定义失败情况,失败数字达到阈值时打开熔断器,不再调用底层服务,熔断窗口(一段时间过后)达到时,释放一个请求进入底层,如果请求执行成功则关闭熔断器,正常调用,如果请求失败则继续保持熔断器打开直到下一个熔断窗口达到。

二、解决方法:Sentinel

Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。

1、流量控制

流量控制
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

限流

流量控制有以下几个角度:
  • 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
  • 运行指标,例如 QPS、线程池、系统负载等;
  • 控制的效果,例如直接限流、冷启动、排队等。
  • Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。
流控模式

快速失败:
直接拒绝方式。该方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出异常。这种方式适用于对系统处理能力确切已知的情况下。
warm up(预热):
冷启动方式。该方式主要用于系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮的情况。
排队等待:
匀速器方式。需要设置将阈值模式设置为QPS才能生效。这种方式严格控制了请求通过的间隔时间,也即是让请求以均匀的速度通过。

2、熔断

熔断
什么是熔断
除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。这个问题和 Hystrix 里面描述的问题是一样的。
Sentinel 和 Hystrix 的原则是一致的:
当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。
在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。

Hystrix 通过线程池的方式,来对依赖(在我们的概念中对应资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本,还需要预先给各个资源做线程池大小的分配。
RT 慢调用比例 (SLOW_REQUEST_RATIO):
选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
慢的标准:
慢调用的比例达到什么数值才会熔断 : 默认1=100%。 1.7时 默认的慢调用1秒内次数为5时触发降级。5是默认值,也就是说必须达到1秒5次请求以上的情况下再熔断。这是前提条件。
熔断的时间窗口:
异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

3、降级

通过响应时间对资源进行降级
Sentinel 还可以通过响应时间来快速降级不稳定的资源(提供一个后备服务)。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。

4、其他功能

  • 热点参数限流
    一种特殊流控规则。根据某个请求参数进行限流。适用于存在某些参数的QPS非常高。
  • 系统规则
    系统规则主要是以服务器整体为单位进行限流保护,保证系统在不被拖垮的情况下保持最大的吞吐量。
  • 主要监控
    应用负载、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个指标。
    授权规则
    授权规则,可以配置允许或者不允许来自某个来源的请求调用。主要通过获取 来源(origin)来区别来源,然后依据 规则执行允许或者拒绝的操作。
  • 区分提示
    熔断和降级的提示都是一致的,“Blocked by Sentinel(flow limiting)” 代码, 我们可以提供一个自定义的方式来覆写这个提示。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值