如果服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直接提供者响应或超时。在高负载场景下,如果不做任何处理,此类问题可能会导致服务消费者的资源耗竭甚至整个系统的崩溃。这时,就需要进行容错处理
 
雪崩效应:
        ”基础服务故障“导致”级联故障“的现象称为雪崩效应。雪崩效应描述的是提供者不可用导致消费者不可能,并将不可用逐渐放大的过程。
        如图,A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。当A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就           形成了。
        
 
 
如何容错:
        为网络请求设置超时
                正常情况下,一个远程调用一般在几十毫秒内就能得到响应了。如果依赖的服务不可用或网络有问题,那么响应时间就会变得很长
                通常情况下,一次远程调用对应着一个线程/进程。如果相应太慢,这个线程/进程就得不到释放。而线程有对应着系统资源,如果得不到释放的线程越积越多,资源就会逐渐被耗尽,最终导致服务的不可用
        使用断路器模式
                如果对某个微服务的请求有大量超时,再去让新的请求访问该服务已经没有任何意义,只会消耗资源。
                断路器可理解为对容易导致错误的操作的代理。这种代理能统计一段时间内调用失败的次数,并决定是正常请求依赖的服务还是直接返回
 
断路器状态转换图:
        正常情况下,断路器关闭,可正常请求依赖的服务
        当一段时间内,请求失败率达到一定阀值,断路器就会打开,同时不会再去请求依赖的服务
        断路器打开一段时间后,会自动进入半开状态。此时断路器可允许一个请求访问依赖的服务。如果该请求能够调用成功,则关闭断路器;否则继续保持打开状态
 
HsysTrix实现容错:
        Hystrix时由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix主要通过以下几点实现延迟和容错
                包裹请求:使用HystrixCommand(或HystrixObservableCommand)包裹对依赖的调用逻辑,每个命令在单独线程中执行。(命令模式)
                跳闸机制:当某服务的错误率超过一定阀值时,Hystrix可以自动或手动跳闸,停止请求该服务一段时间
                资源隔离:Hystrix为每个依赖都维护了一个小型的线程池。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等候,从而加速失败判定
                监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时以及被拒绝的请求等
                回退机制:当请求失败、超时、被拒绝或断路器打开时,执行回退逻辑。回退逻辑由开发人员自行提供
                自我修复:断路器打开一段事件后,会自动进入”半开“状态。
 
Hystrix断路器状态监控:
        访问http://localhost:8080/health 获得Hystrix状态
        如果执行了回退逻辑,但Hystrix的状态依然是UP,是因为失败率还没有达到阀值(默认5秒内20次失败)
 
execution.isolation.strategy指定隔离策略
Hystrix隔离策略:
        THREAD(线程隔离):HystrixCommand将会在单独的线程上执行,并发请求受线程池中的线程数量的限制
        SEMAPHORE(信号量隔离):HystrixCommand将会在调用线程上执行,开销相对较小,并发请求接受到信号量个数的限制
Hystrix默认并推荐使用线程隔离,因为这种方式有一个除网络超时以外的额外保护层。
一般来说,只有当调用负载非常高时才会需要使用信号量隔离,因为这种场景下使用THREAD开销会比较高。信号量隔离一半仅适用于非网络调用的隔离
如果发生找不到上下文的运行时异常,可以将隔离策略设置为SEMAPHORE,如使用注解@HystrixCommand(fallbackMethod = "testService", commandPropperties = {@HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE")})

Hystrix容错处理的更多相关文章

  1. (四)Hystrix容错保护

    Feign默认是整合了Ribbon和Hystrix这两个框架,所以代码我们在上一篇的基础上进行修改,启动Eureka,service-hello,Feign 所谓的熔断机制和日常生活中见到电路保险丝是 ...

  2. SpringCloud之Hystrix容错保护原理及配置

    1 什么是灾难性雪崩效应? 如下图的过程所示,灾难性雪崩形成原因就大致如此: 造成灾难性雪崩效应的原因,可以简单归结为下述三种: 服务提供者不可用.如:硬件故障.程序BUG.缓存击穿.并发请求量过大等 ...

  3. Hystrix (容错,回退,降级,缓存)

    Hystrix熔断机制就像家里的保险丝一样,若同时使用高功率的电器,就会烧坏电路,这时候保险丝自动断开就有效的保护了电路.而我们程序中也同样是这样.例如若此时数据库压力太大速度很慢,此时还有不断的请求 ...

  4. Hystrix 容错处理

    目录 雪崩效应 容错的基本思想 什么是Hystrix 简单使用 消费端使用Hystrix 注解开启 改造消费方法 @HystrixCommand 详细配置 Hystrix线程隔离策略与传播上下文 Hy ...

  5. SpringCloud学习笔记(4):Hystrix容错机制

    简介 在微服务架构中,微服务之间的依赖关系错综复杂,难免的某些服务会出现故障,导致服务调用方出现远程调度的线程阻塞.在高负载的场景下,如果不做任何处理,可能会引起级联故障,导致服务调用方的资源耗尽甚至 ...

  6. Spring Cloud08: Hystrix 容错机制与数据监控

    一.概述 容错机制是指的是在一个分布式系统中,每个微服务之间是相互调用的,并且他们之间相互依赖,而实际的运行情况中,可能会因为各种原因导致某个微服务不可用,那么依赖于这个微服务的其他微服务就可能出现响 ...

  7. SpringCloud Alibaba实战(9:Hystrix容错保护)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经使用OpenFeign完成了服务间的调用.想一下,假如我们一个服务链 ...

  8. Spring Cloud入门教程-Hystrix断路器实现容错和降级

    简介 Spring cloud提供了Hystrix容错库用以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法.这篇文章将创建一个产品微服务,注册到eureka服务注册中心,然后我们使 ...

  9. 【Dalston】【第四章】容错保护(Hystrix)

    我们在实践微服务架构时,通常会将业务拆分成一个个微服务,微服务之间通过网络进行通信,进行互相调用,造成了微服务之间存在依赖关系.我们知道由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如 ...

随机推荐

  1. UVA 240 Variable Radix Huffman Encoding

    题目链接:https://vjudge.net/problem/UVA-240 题目大意 哈夫曼编码是一种最优编码方法.根据已知源字母表中字符出现的频率,将源字母表中字符编码为目标字母表中字符,最优的 ...

  2. webService服务简单实现

    首先写一个简单的webservice服务 package com.service.impl; import java.util.Date; import javax.jws.WebService; i ...

  3. mysql key分区,分区数制定

    我相信不 太注意的同学肯定会入坑,今天我差点也入坑了,后面自己问自己如果我用key分区,自己问自己 我的分区数应该是多少??? 后面我陷入了沉思......... 我第一次想先随便弄一个分区数,在本地 ...

  4. UVA 11178 /// 向量旋转 两向量夹角

    题目大意: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  5. 应用Dubbo框架打造仿猫眼项目 理解微服务核心思想

    1:传统应用带来的问题 单一业务开发的迭代问题              扩容困难              部署回滚困难2:微服务概述 微服务是一种将业务系统进一步拆分的架构风格          ...

  6. 21-2-substring

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. std::unorder_set你插入元素的顺序不一定就是元素在里面的元素

    去看了下cppreference,里面写了 根据哈希值排序了

  8. input的placeholder颜色修改

    input[type=text]::-webkit-input-placeholder { /* WebKit browsers / color: #999; } input[type=text]:- ...

  9. fping简介及使用方法

    fping命令的官网为:http://fping.org/ 历史版本下载地址:http://fping.org/dist/ 第一步:安装. wget http://fping.org/dist/fpi ...

  10. node---处理post请求

    //nodejs 处理post请求 // 异步 const http =require('http') const server=http.createServer((req,res)=>{ i ...