如果服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直接提供者响应或超时。在高负载场景下,如果不做任何处理,此类问题可能会导致服务消费者的资源耗竭甚至整个系统的崩溃。这时,就需要进行容错处理
 
雪崩效应:
        ”基础服务故障“导致”级联故障“的现象称为雪崩效应。雪崩效应描述的是提供者不可用导致消费者不可能,并将不可用逐渐放大的过程。
        如图,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. 洛谷P1860——新魔法药水

    传送门:QAQQAQ 题意:商店里有N种药水,每种药水都有一个售价和回收价.小S攒了V元钱,还会M种魔法,可以把一些药水合成另一种药水.他一天可以使用K次魔法,问他一天最多赚多少钱? N<=60 ...

  2. 2019 牛客多校第一场 A Equivalent Prefixes

    题目链接:https://ac.nowcoder.com/acm/contest/881/A 题目大意 定义 RMQ(u, L, R) 为 u 数组在区间 [L, R] 上最小值的下标. 如果有 2 ...

  3. 第三天:字典表dict、元组tuple、文件与类型汇总

    1.字典表dict 声明 {键: 值,...} dict(键=值) d = {'isbn':'13123','title':'python入门'} #字典表中的键不能使用诸如列表这种可以改变的,只能使 ...

  4. 树形结构_红黑树:平衡2X 哈夫曼树:最优2X

    红黑树:平衡2X 哈夫曼树:最优2X 红黑树 :TreeSet.TreeMap 哈夫曼树 1. 将w1.w2.…,wn看成是有n 棵树的森林(每棵树仅有一个结点): 2. 在森林中选出根结点的权值最小 ...

  5. 以 Ubuntu 为例:清理 linux 系统的"垃圾"文件

    clean 命令删除所有的软件安装包. 在网络连接正常的情况下,我们执行软件安装命令,软件安装结束后,以 .deb 为后缀的软件包就不再需要了.这种情况和 Windows 平台.手机的安卓平台上的情况 ...

  6. Java Lambda map返回部分属性

    通过map,返回部分属性. MyUser,作为源数据 MyUserS,作为返回的新数据. @Test public void Test1() { List<MyUser> ulist=ne ...

  7. win10安装mysql__艰难的心路历程

    俺是新系统,嘿嘿嘿 首先,把下载好的压缩包解压到安装目录中,哪个盘可以. 第二,先创建my.ini文件,不然待会忘了.在文件中添加以下内容: [mysqld] port = basedir=C:\Wi ...

  8. The Battle of Chibi

    The Battle of Chibi 给出一段长度为n的序列\(\{a_i\}\),求其中长度为m的严格上升子序列个数\(mod\ 10^9+7\),\(n\leq 10^3\). 解 不难想到设\ ...

  9. QQ空间批量删除说说

    按下F12,贴下如下代码 var delay = 1000; function del() { if (document.querySelector(".app_canvas_frame&q ...

  10. thinkphp empty标签

    empty标签用于判断某个变量是否为空,用法: 大理石平台检验标准 <empty name="name"> name为空值 </empty> 如果判断没有赋 ...