hystrix容错(笔记)

hystrix容错

rabbion

1.Ribbon 是一个客户端负载均衡器(Nginx 为服务端负载均衡),它赋予了应用一些支配 HTTP 与 TCP 行为的能力,可以得知,这里的客户端负载均衡也是进程内负载均衡的一种。

2.它在 Spring Cloud 生态内是一个不可缺少的组件,少了它,服务便不能横向扩展,这显然是有违云原生12要素的。

3.此外 Feign 与 Zuul 中已经默认集成了 Ribbon, 在我们的服务之间凡是涉及调用的,都可以集成它并应用,从而使我们的调用链具备良好的伸缩性。

4.它是一个经过了云端测试的IPC库,可以很好地控制HTTP和TCP客户端的一些行为。 Feign已经默认使用了Ribbon。

  • 负载均衡
  • 容错
  • 多协议(HTTP,TCP,UDP)支持异步和反应模型
  • 缓存和批处理

Ribbon的负载均衡策略

  • andomRule (随机策略): 随机选择 Server

  • RoundRobinRule (轮训策略): 按顺序循环选择 Server

  • RetryRule (重试策略): 在一个配置时问段内当选择 Server 不成功,则一直尝试选择一个可用的 Server

  • BestAvailableRule (最低并发策略): 逐个考察 Server,如果 Server 断路器打开,则忽略,再选择其中并发连接最低的 Server

  • AvailabilityFilteringRule (可用过滤策略): 过滤掉一直连接失败并被标记为 circuit tripped 的
    Server,过滤掉那些高并发连接的 Server(active connections 超过配置的网值)

  • ResponseTimeWeightedRule (响应时间加权策略): 根据 Server 的响应时间分配权重。响应时间越长,权重越低,被选择到的概率就越低;响应时间越短,权重越高,被选择到的概率就越高。这个策略很贴切,综合了各种因素,如:网络、磁盘、IO等,这些因素直接影响着响应时间

  • ZoneAvoidanceRule (区域权衡策略): 综合判断 Server 所在区域的性能和 Server 的可用性轮询选择 Server,并且判定一个 AWS Zone 的运行性能是否可用,剔除不可用的 Zone 中的所有 Server

核心

现在我们假设一下,服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直到服务返回.

在高负载场景下,如果不做任何处理,这种问题很可能造成所有处理用户的请求的线程都被耗尽.
而不能响应用户的进一步请求.
如果是微服务工程,则很有可能出现服务雪崩效应

什么是雪崩效应:

在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用,在spring cloud 可以用RestTemplate + ribbon 或feign来调用.
为了保证其高可用,单个服务通常会集群部署,由于网络原因或者自身原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,
此时如果有大量请求涌入,servlet容器的线程资源会被消耗完毕,导致服务瘫痪.服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,
这就是服务故障的雪崩效应.
在这里插入图片描述
而此时,A服务的流量波动很大,流量经常突然性增加.那么在这种情况下,就算A服务能扛得住请求,B服务和C服务未必能扛得住这突发的请求.
此时,如果C服务因为扛不住请求,变得不可用,那么B服务的请求也会阻塞,慢慢耗尽B服务的线程资源,B服务就会变得不可用.紧接着,A也会不可用,
这个过程用图来说明,如下:

如上图所示,一个服务失败,导致整条链路的服务都失败的情形,我们称之为服务雪崩.

如何解决:

超时机制

通过网络请求其他服务时,都必须设置超时,征程情况下,一个远程调用一般在几十毫秒被就返回了,

当依赖的服务不可用或者因为网络问题,响应时间将会变的很长,而通常情况下,一次远程调用对应了一个线程,

如果响应太慢,那么这个线程得不到释放,而线程对应了系统资源,如果大量的线程得不到释放,并且越积越多.

服务资源就会被耗尽,从而导致资源服务不可用,所以必须为每个请求设置超时时间,如果超时,则释放线程资源.

熔断器模式

试想一下,家庭如果没有断路器,电流过载了(例如:功率过大,电线短路),电路不断开的话,电路就会升温,甚至是烧断电路,起火,有了断路器之后,当电流过载时,会自动切断电路(跳闸)从而保护了整条电路与家庭的安全当电流过载的问题解决后,只要将断路器关闭,电路就又可以工作了,

同样的道理,当依赖的服务有大量超时时,再让新的请求去访问已经没有太大意义,只会无畏的消耗现有的资源,譬如我们设置了超时时间为1秒,如果短时间内有大量请求,在1秒内都得不到响应,就往往意味着异常,此时就没有必要让更多的请求去访问这个服务了,我们应该使用断路器避免资源浪费.

断路器可以实现快速失败,如果它在一段时间内侦测到许多类似的错误(比如超时),就会强迫其后续的多个调用快速失败,不再请求所依赖的服务,从而方式应用程序不断的尝试执行可能失败的操作.这样因应用程序可以继续执行而不用等待修正错误,或浪费CPU时间去等待长时间的超时.断路器可以使用因共用程序能够诊断错误是否已修正,如果已经修正,则应用程序会再次尝试
调用操作.
断路器模式就像是那些容易导致错误的操作的一种代理,这种代理能够记录最近调用发生错误的次数,然后决定适用于需操作继续或立即返回错误.

如何实现断路器:

监控 监控总共请求多少次,有多少次失败,假设失败率为多少,断路器打开
状态 打开,关闭,断开
分流
自我修复(状态的切换)

隔离

  1. Hystrix的隔离策略两种: 分别是线程隔离和信号量隔离。
  2. THREAD(线程隔离):使用该方式,HystrixCommand将会在单独的线程上执行,并发请求受线程池中线程数量的限制。
  3. SEMAPHORE(信号量隔离):使用该方式,HystrixCommand将会在调用线程上执行,开销相对较小,并发请求受到信号量个数的限制。
  4. Hystrix中默认并且推荐使用线程隔离(THREAD),因为这种方式有一个除网络超时以外的额外保护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值