Hystrix能解决的问题

Hystrix
问题产生
  • 雪崩效应: 一种因为服务提供者的不可用导致服务调用者不可用,并将不可用情况逐渐放大的过程

  • 形成过程:

    • 服务提供者不可用:
      • 硬件故障,硬件损坏,服务器宕机,网络硬件故障,造成不可用
      • 程序bug
      • 缓存击穿:大量请求同一个key此处key过期,导致loder到DB造成服务提供者过载导致不可用
      • 用户大量请求:
    • 重试加大流量:
      • 用户重试:用户不断刷新页面
      • 代码逻辑重试:服务调用端存在服务异常之后的重试逻辑
    • 服务调用者不可用:
      • 同步调用等待造成资源耗尽,服务调用者此时也不可用,造成服务雪崩
  • Hystrix工作原理

    • 线程池隔离:Hystrix隔离方式采用线程/信号量的方式,通过隔离限制依赖的并发量和阻塞扩散
      • 线程隔离: hystrix在每一个依赖调用分配了一个线程池,单线程池满了调用将会立即被拒绝,默认采用不排队,加速失败判定,线程数是可以被设定的。
      • 原理: 用户请求将不直接依赖于服务本身,而是通过线程池中空闲线程来范文服务,如果线程池已满,择进行降级处理,用户请求不会被阻塞,至少可以有一个执行结果,例如友好的提示,而不是无休止的等待知道系统奔溃
    • 信号隔离:类似信号量的一个使用,用于限制并发访问,反正阻塞扩散,与现场隔离最大不同在于执行依赖代码的线程依然是请求线程(改线程需要通过信号申请,如果客户端是可以信的且可以快速放回,可以使用信号隔离代替线程隔离,降低开销),信号量大小可以动态调整
  • 熔断器:circuit Breaker

    • 熔断器是位于线程池之前的组建,当用户请求某一个服务之后,hystrix会先经过熔断器,此时如果熔断器的状态是打开,说明已经熔断的,这时将直接进行降级处理,不会继续发送请求到线程池,熔断器相当于线程池之前的一层屏障,每个熔断器默认维护十个bucket,美妙创建一个bucket,每个bucket记录成功,失败,超时,拒绝次数,当新的bucket被创建,旧的bucket被抛弃,依照bucket的记录来决定是否打开或者关闭断路器。
    • 熔断器状态机:
      • closed:熔断器关闭状态,调用失败次数累计到了阀值,或者一定比例,择启动熔断机制。
      • open:熔断打开状态,下游调用直接返回错误,不走网络,不进入线程池,进入这个状态之后,设计了一个时钟选型,默认时间达到一定时间(一般设置成平均故障处理事件也就是MTTR)会进入半熔断状态
      • half-open:半熔断状态,允许定量的服务请求(也就是一部分请求尝试)如果调用都成功,或者一定比例成功,则认为恢复,关闭断路器,否则认为还没好,有回到熔断打开状态。
  • 熔断流程:

    • 将请求request封装成一个HystrixCommend,或者HystrixObservableCommand对象
    • 执行execute(),queue()方法来做同步或者异步调用
    • 如果Hystrix缓存中有数据,则读取缓存数据,之后返回
    • 检查熔断器,circuit-breaker是否打开,如果打开,择直接执行getFallback方法降级处理
    • 判断线程池,信号量,队列是否被占满,如果满直接执行getFallBack方法降级处理
    • 执行HystrixObservableCommand.construct()或者HystrixCommand.run()
    • 如果调用超时,执行getFallback方法
    • 如果调用异常抛出HystrixBadRequestException,也直接执行getFallback方法
    • 调用成功返回成功结果
    • getFallBack降级逻辑,以下情况执行
      • 断路器已经打开
      • 线程池,队列,信号量满
      • run方法执行抛出HystrixBadrequestException
      • run方法超时
    • 没有实现getFallBack方法直接抛出异常信息
    • 降级逻辑失败,也直接抛异常
  • Hystrix执行方式:刚才说的HystricCommend中的run方法,Hystrix可以有不同的执行策略

    • execute为代表的同步执行:一旦开始执行,当前线程就得阻塞一直等到命令返回结果
    • queue座位代表的异步执行:命令执行开始返回一个future对象,不阻塞后面的逻辑,开发者更具自己需求获取结果
    • 响应式执行,HystrixObservableCommand中使用的模式:命令会返回一个Observable对象,开发可以给Observable对象注册上Observable,通过Rxjava的方式响应式的处理命令执行过程中的不同阶段,比如HystrixCommand中的Observer方法去消费observable中生产的事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ class实现邻接矩阵存储的图(完整代码)

代码如下: #include <iostream> #include <queue> using namespace std; typedef int VertexType; typedef int EdgeType; const int MaxVertexNum 30;class MGraph { public:MGraph(){CreatGraph();};void CreatGraph();void Visit(int v);void BFS(int v);void…

二叉搜索树(创建,插入,删除):基础篇,适合新手观看。

1.1 二叉搜索树的插入 二叉搜索树的概念相信大家都很清楚&#xff0c;无非就是左小右大 创建二叉搜索树&#xff0c;其实就是多次调用二叉搜索树的插入方法&#xff0c;所以首先我们来讲讲如何插入节点到二叉搜索树里&#xff0c;假设一颗二叉搜索树如下&#xff0c;现在要插入…

.NET 的过去、现在和未来

作为一名使用了十多年.NET 开发平台的开发者来说&#xff0c;多年来笔者鲜少在各类博客媒体推广布道 .NET平台&#xff0c;但也默默地关注着 .NET 平台的发展变化&#xff0c;为每一次新技术的出现欢呼&#xff0c;为近年来 .NET 的沉默感到惋惜&#xff0c;也为开放开源的 .NE…

Redis数据结构以及对应存储策略

redis数据结构&#xff1a; String 可以是字符串也可以是数字&#xff0c;以及浮点数List&#xff0c;一个链表&#xff0c;链表上每一个节点都包含一个字符串set 包含字符串的无序手机其&#xff0c;特点是每一个字符都是唯一的hash&#xff0c;包含键值对的无序散列&#xf…

AVL树(平衡二叉树)讲解,入门篇,适合新手观看

1.1 概念 平衡二叉树就是为了让二叉搜索树的平均查找长度更短&#xff0c;时间复杂度更靠近logN,如果一个二叉搜索树不平衡了就会出现图1情况&#xff0c;完全变成一个数组&#xff0c;时间复杂度也变为了O(N)。 平衡因子&#xff1a;平衡因子就是针对于树中某一结点&#xff…

读源码,对开发者重要吗?

.NET 5.0 Peview 2发布4月2日&#xff0c;微软发布了.NET 5.0 Preview 2&#xff0c;带来功能和性能方面的改进。这一版本包括.NET 5.0.0 Preview 2与.NET SDK 5.0.100 Preview 2。.NET 5是.NET Framework和.NET Core的未来&#xff0c;最终将成为一个统一平台&#xff0c;.NET…

Redis和DB数据一致性解决方案

问题出现原因 并发时候无法保证读写的先后顺序&#xff0c;如果删掉了缓存还没来得及写库&#xff0c;另外一个县城就多来读取&#xff0c;发现缓存为空就去读取数据库并且写入缓存&#xff0c;这时候缓存中就是脏数据如果先写库&#xff0c;在删除缓存前&#xff0c;写库的线…

数据结构堆的时间复杂度(最大堆,最小堆)

创建堆的方式有两种&#xff0c;一种是一边插入结点&#xff0c;一边调用堆的插入方法调整堆&#xff0c;这样的时间复杂度就是 O(NlogN)&#xff0c;而第二种方式就把时间复杂度缩减到了O(N)&#xff0c;它是采用先把结点插入好了&#xff0c;然后再来调整堆&#xff0c;并不是…

中国速度之二神山建设(3):有力的技术保障,基建世界里的云原生缩影 | IDCF DevOps案例研究...

内容来源&#xff1a;DevOps案例深度研究第4期 – 火神山雷神山 DevOps实践研究战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;全程视频请移步文末&#xff09;本案例内容贡献者&#xff1a;赖泽薇、张扬、邓茜芸、韦一、刘德权、候利涛、冯利娟、常相宇、张力、韩丰…

Rx2.0后台开发分享

Rxjava2.x 微软的一个函数库&#xff0c;Rx是一个编程模型&#xff0c;模板是提供一致的编程接口&#xff0c;帮助开发者更方便的处理异步数据流&#xff0c;现在Rx已经支持几乎全部的流行编程语言。比较流行的有Rxjava&#xff0c;RxJs&#xff0c;Rx.NET&#xff0c;社区网站…

中国速度之二神山建设(4):全能运维,召之即来,来之即战 | IDCF DevOps案例研究...

内容来源&#xff1a;DevOps案例深度研究第4期 – 火神山雷神山 DevOps实践研究战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;全程视频请移步文末&#xff09;本案例内容贡献者&#xff1a;赖泽薇、张扬、邓茜芸、韦一、刘德权、候利涛、冯利娟、常相宇、张力、韩丰…

JAVA两类比较器的区别(Comparable,Comparator)

内部比较器Comparable 一个类实现了Comparable接口&#xff0c;那么它就有了一个内部比较器&#xff0c;实现了Comparable的类可以调用Collections工具类或Arrays的sort方法进行比较 外部比较器Comparator 一个类实现了Comparator接口&#xff0c;那么它就是一个外部比较器&…

Spring Cloud部分源码分析Eureka,Ribbon,Feign,Zuul

Eureka SpringCloud Eureka使用NetFlix Eureka来实现的&#xff0c;它包括了服务端组件和客户端组件&#xff0c;并且都是用java 编写的。 Eureka服务端就是服务注册中心&#xff0c;Eureka客户端主要处理服务的注册发现&#xff0c;通过注解和参数配置的方式&#xff0c;客户…

C++ class实现邻接表存储的图(完整代码)

代码如下: #include <iostream> #include <queue>using namespace std; const int MaxVertexNum 30; typedef int InfoType; typedef int VertexType;class Node {friend class VNode;friend class ALGraph; private:int adjvertex;InfoType info;Node *next; };…

世界上首个被数学证明安全的OS微内核seL4成立基金会

Linux 基金会正在与澳大利亚国家科学机构 CSIRO 合作&#xff0c;打造 seL4 操作系统微内核生态。近日 Linux 基金会宣布托管 seL4 基金会&#xff0c;该基金会以澳大利亚国家科学机构 CSIRO 的数字机构 Data61 创建的 seL4 操作系统微内核为基础项目。seL4 是一个安全操作系统…

数据结构(哈夫曼树,哈夫曼编码)入门篇,JAVA实现

什么是哈夫曼树 哈夫曼树就是一种最优判定树&#xff0c;举个例子&#xff0c;如下一个判断逻辑 if(s<60) g1; else if(s<70) g2 else if(s<80) g3 else if(s<90) g4 else g5; 分数概率图如下 如果按照代码从上到下顺序构造判定树&#xff0c;那么如下图所示&am…

C++ class实现十字链表存储的图(完整代码)

代码如下: #include <iostream> #include <queue> using namespace std; typedef int InfoType; typedef int VertexType; const int MaxVertexNum 30;class ArcNode {friend class OLGraph;friend class VertexNode; private:int tailvertex, headvertex;ArcNod…

hystrix隔离策略对比

hystrix隔离策略 zuul的隔离实现是基于hystrix实现的&#xff0c;hystrix支持线程池隔离和信号量的隔离 # 信号量隔离&#xff1a; it executes on the calling thread and concurrent requests are limited by the semaphore count --引自官网单每次调用线程&#xff0c;当…

中国速度之二神山建设(1):坚强的领导核心,“小团队大后台”组织结构 | IDCF DevOps案例研究...

内容来源&#xff1a;DevOps案例深度研究第4期 – 火神山雷神山 DevOps实践研究战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;全程视频请移步文末&#xff09;本案例内容贡献者&#xff1a;赖泽薇、张扬、邓茜芸、韦一、刘德权、候利涛、冯利娟、常相宇、张力、韩丰…

通过Java编写一个服务器理解动态Web,静态Web

静态Web 说到Servlet自然就要说到Web,Web分为静态Web和动态Web&#xff0c;之前我一直都傻傻分不清两者的区别&#xff0c;直到用JAVA编写了一个服务器后才明白二者的区别&#xff0c;所谓静态Web&#xff0c;实际上就是指&#xff0c;客户端要请求的资源文件&#xff0c;服务器…