【Spring Cloud系列】Hystrix应用详解

news2024/11/25 12:24:09

【Spring Cloud系列】Hystrix应用详解

文章目录

  • 【Spring Cloud系列】Hystrix应用详解
    • 一、概述
    • 二、什么是Hystix
    • 三、Hystrix作用
    • 四、Hystrix设计原则
    • 五、Hystrix实现原理
      • 5.1 隔离
      • 5.2 熔断
      • 5.3 降级
        • 服务降级主要用于什么场景呢
        • 实现服务降级需要考虑几个问题
        • 降级分类
      • 5.4 缓存
        • 请求缓存介绍
        • 开启hystrix功能
        • 缓存删除
      • 5.5 服务合并监控
    • 五、Hystrix总结

一、概述

在一个分布式系统中,每个服务都可能会调用其它的服务器,服务之间是相互调用相互依赖。假如微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务。这就是构成所谓“扇出”。

如果扇出的链路上某个微服务的调用响应的时间过长或者不可用,对微服A的调用就会占用越来越多的系统资源,进而引起系统崩溃,即"雪崩效应"。

对于高流量的应用来说,单一的后端依赖可能会导致所有的服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

所以,通常当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩。

为应对微服务器系统出现“雪崩”事故,使用微服务Hystrix能避免级联故障,以提高分布式系统的弹性。

二、什么是Hystix

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,可以保证一个服务出现故障时,不会导致整个系统出现雪崩效应,以提高分布式系统弹性;

作为“断路器”,在一个服务出现故障时,可以通过短路器监控,返回一个可以处理的响应结果,保证服务调用线程不会长时间被占用,避免故障蔓延。

三、Hystrix作用

  1. 对调用其他服务造成的异常和超时提供保护和控制。
  2. 在复杂的分布式系统中防止级联失败。
  3. 快速失败和迅速恢复。
  4. 当必要时fallback和优雅的降级。
  5. 提供实施监控,警告和可选择的控制。

四、Hystrix设计原则

  1. 防止单个依赖耗尽容器内所有用户线程
  2. 降低系统负载,对无法及时处理的请求快速失败(fail fast)而不是排队
  3. 提供失败回退,以在必要时让失效对用户透明化
  4. 使用隔离机制降低依赖服务对整个系统的影响
  5. 针对系统服务的度量、监控和报警,提供优化以满足近实时性的要求
  6. 在 Hystrix 绝大部分需要动态调整配置并快速部署到所有应用方面,提供优化以满足快速恢复的要求
  7. 能保护应用不受依赖服务的整个执行过程中失败的影响,而不仅仅是网络请求

五、Hystrix实现原理

5.1 隔离

Hystrix的隔离模式有两种分别是:信号量模式和线程池模式。

信号量不支持超时,当被调服务发生问题时,有少部分用户会长时间无法得到响应。另外使用线程池模式无法获取传递Header。

  • 信号量和线程池有如下区别

    线程切换支持异步支持超时支持熔断开销大小支持限量
    信号量
    线程池
  • 信号量隔离

    信号量的使用如图(信号量示意图),当n个并发请求去调用一个目标服务接口时,都要获取一个信号量才能真正去调用目标服务接口,但信号量有限,默认是10个,可以使用maxConcurrentRequests参数配置,如果并发请求数多于信号量个数,就有线程需要进入队列排队,但是排队队列也有上限,默认是5,如果排队队列也满,则必定有请求线程会fallback流程,从而达到限流和防止雪崩的目的。

    信号量模式从始至终都只有请求线程自身,是同步调用模式,不支持超时调用,不支持直接熔断,由于没有线程的切换,开销非常小。

  • 线程池隔离

    线程池的使用示意图如下图所示,当n个请求线程并发对某个接口请求调用时,会先从hystrix管理的线程池里面获得一个线程,然后将参数传递给这个线程去执行真正调用。线程池的大小有限,默认是10个线程,可以使用maxConcurrentRequests参数配置,如果并发请求数多于线程池线程个数,就有线程需要进入队列排队,但排队队列也有上限,默认是 5,如果排队队列也满,则必定有请求线程会走fallback流程。

    线程池模式可以支持异步调用,支持超时调用,支持直接熔断,存在线程切换,开销大

  • 线程池隔离优点

    1. 使用线程池隔离可以完全隔离第三方应用,请求线程可以快速放回。
    2. 请求线程可以继续接受新的请求,如果出现问题线程池隔离是独立的不会影响其他应用
    3. 当失败的应用再次变得可用时,线程池将清理并可立即恢复,而不需要一个长时间的恢复。
    4. 独立的线程池提高了并发性。

    尽管线程池隔离是由一个单独的线程提供,客户端代码(异常方法里面的请求)应该也 有超时机制,不能让响应的线程无限期等待,应该适时去中断它,阻止 Hystrix 线程池的饱和。

    线程池隔离缺点:

    线程池隔离的主要缺点是它们增加计算开销(CPU)。每个命令的执行涉及到排队、调度和上 下文切换都是在一个单独的线程上运行的。

  • 应用场景:

    线程池隔离:第三方应用或者接口和并发量大。

    信号量隔离:内部应用或者中间件(redis)和 并发需求不大

5.2 熔断

熔断这一概念来源于电子工程中的断路器(Circuit Breaker)。在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。

服务熔断指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。很多时候刚开始可能只是系统出现了局部的、小规模的故障,然而由于种种原因,故障影响的范围越来越大,最终导致了全局性的后果。

  • 基于自反馈调节熔断状态的算法原理

    熔断器来源电子工程中的保险丝,一般在所有的家电系统连接外部供电的线路中间都会加一个保险丝,当外部电压过高,达到保险丝的熔点时候,保险丝就会被熔断,从而可以切断家电系统与外部电路的联通,进而保障家电系统不会因为电压过高而损坏。

    Hystrix提供的熔断器就有类似功能,当在一定时间段内服务调用方调用服务提供方的服务的次数达到设定的阈值,并且出错的次数也达到设置的出错阈值,就会进行服务降级,让服务调用方之间执行本地设置的降级策略,而不再发起远程调用。但是Hystrix提供的熔断器具有自我反馈,自我恢复的功能,Hystrix会根据调用接口的情况,让熔断器在closed,open,half-open三种状态之间自动切换。

    open状态:说明打开熔断,也就是服务调用方执行本地降级策略,不进行远程调用。
    closed状态:说明关闭了熔断,这时候服务调用方直接发起远程调用。
    half-open状态:则是一个中间状态,当熔断器处于这种状态时候,直接发起远程调用。

在这里插入图片描述

  • 三种状态的转换

    • closed->open:正常情况下熔断器为closed状态,当访问同一个接口次数超过设定阈值并且错误比例超过设置错误阈值时候,就会打开熔断机制,这时候熔断器状态从closed->open。
    • open->half-open:当服务接口对应的熔断器状态为open状态时候,所有服务调用方调用该服务方法时候都是执行本地降级方法,那么什么时候才会恢复到远程调用那?Hystrix提供了一种测试策略,也就是设置了一个时间窗口,从熔断器状态变为open状态开始的一个时间窗口内,调用该服务接口时候都委托服务降级方法进行执行。如果时间超过了时间窗口,则把熔断状态从open->half-open,这时候服务调用方调用服务接口时候,就可以发起远程调用而不再使用本地降级接口,如果发起远程调用还是失败,则重新设置熔断器状态为open状态,从新记录时间窗口开始时间。
    • half-open->closed: 当熔断器状态为half-open,这时候服务调用方调用服务接口时候,就可以发起远程调用而不再使用本地降级接口,如果发起远程调用成功,则重新设置熔断器状态为closed状态。

系统设计时候要使用一定的熔断策略,来保证当服务提供方服务出现异常访问时,能及时截断访问里量,减少不必要的宕机达到服务的高可用,Hystrix作为熔断器组件使用范围还是很广泛。

5.3 降级

服务降级是指当服务器压力剧增的情况下,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心接口和服务请求,而直接返回一个提前准备好的fallback(退路)错误处理信息。这样虽然提供的是一个有损的服务,但释放了服务器资源以保证核心业务正常运作或高效运作,保证了整个系统的稳定性和可用性。其实尽可能的把系统资源让给优先级高的服务。
资源有限,而请求是无限的。如果在并发高峰期,不做服务降级处理,一方面肯定会影响整体服务的性能,严重的话可能会导致宕机某些重要的服务不可用。所以,一般在高峰期,为了保证核心功能服务的可用性,都要对某些服务降级处理。比如当双 11 活动时,把交易无关的服务统统降级,如查看快递单,查看历史订单等等。

  • 服务降级主要用于什么场景呢

    当整个微服务架构整体的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务能正常运行,可以将一些不重要或不紧急的服务或任务进行服务的延迟使用 或暂停使用。
    降级的方式可以根据业务来,可以延迟服务,比如延迟给用户增加积分,只是放到一个缓存中,等服务平稳之后再执行;或者在粒度范围内关闭服务。

  • 实现服务降级需要考虑几个问题

    1. 那些服务是核心服务,哪些服务是非核心服务
    2. 那些服务可以支持降级,那些服务不能支持降级,降级策略是什么
    3. 除服务降级之外是否存在更复杂的业务放通场景,策略是什么?
  • 降级分类

    • 超时降级:主要配置好超时时间和超时重试次数和机制,并使用异步机制探测回复情况;
    • 失败次数降级:主要是一些不稳定的 api,当失败调用次数达到一定阀值自动降级,同样要使用异步机制探测回复情况;
    • 故障降级:如要调用的远程服务挂掉了(网络故障、DNS故障、http服务返回错误的状态码、rpc服务抛出异常),则可以直接降级。降级后的处理方案有:默认值(比如库存服务挂了,返回默认现货)、兜底数据(比如广告挂了,返回提前准备好的一些静态页面)、缓存(之前暂存的一些缓存数据)
    • 限流降级:秒杀或者抢购一些限购商品时,此时可能会因为访问量太大而导致系统崩溃,此时会使用限流来进行限制访问量,当达到限流阀值,后续请求会被降级;降级后的处理方案可以是:直接转到Tip提示。

服务降级就是指服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提示 fallback。

5.4 缓存

Hystrix提供的请求缓存是一个本地缓存,在分布式环境下不适用,并且实际开发中,也不会使用hystrix的请求缓存功能,因为这个功能太多余了,Hystrix的请求缓存只能够在同一个request请求作用域下才生效,下一次的request请求,会将上一次request的请求缓存给清空。

5.5 服务合并监控

通常微服务架构中的依赖通过远程调用实现,而远程调用中最常见的问题就是通信消耗与连接数占用。在高并发的情况之下,因通信次数的增加,总的通信时间消耗将会变的不那么理想。同时,因为对依赖服务的线程池资源有限,将出现排队等待与响应延迟的情况。为了优化这两个问题,Hystrix提供了HystrixCollapser来实现请求的合并,以减少通信消耗和线程数的占用。

HystrixCollapser实现了在HystrixCommand之前放置一个合并处理器,它将处于一个很短时间窗(默认10毫秒)内对同一依赖服务的多个请求进行整合并以批量方式发起请求的功能(服务提供方也需要提供相应的批量实现接口)。通过HystrixCollapser的封装,开发者不需要去关注线程合并的细节过程,只需要关注批量化服务和处理。下面我们从HystrixCollapser的使用实例,对其合并请求的过程一探究竟。

五、Hystrix总结

Hystrix的设计目的就是为了提高系统的弹性和高可用。弹性主要体现在Hystrix的熔断、降级、快速恢复和实时监控的功能,当设置了Hystrix的熔断和降级,由于某种原因导致服务熔断后,时间段内之间返回fallback,时间段之后Hystrix成半打开状态,检测服务是否可用,如果可用,熔断关闭,接收请求,否则,时间段内继续保持熔断开启。

虽然现在Hystrix官网宣布进入维护模式,停更了,也是很老的微服务技术,现有很多的技术取而代之,但是,Hystrix的思想一直在,现在很多的技术仍然是借鉴的Hystrix理论知识,学习Hystrix,能让我们更好的学习其他的微服务知识。

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

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

相关文章

使用Hugging Face预训练Bert处理下游任务显存占用过多

在使用HuggingFace的transformer下的BertForMaskedLM进行预训练语言模型的load时,bert会占用很大的显存。 这里可以考虑使用TinyBERT,速度和显存上都能得到很大的优化。 具体的方法进入https://huggingface.co/huawei-noah/TinyBERT_General_4L_312D/tr…

day01——项目导入+环境搭建

目录 软件开发整体介绍 软件开发流程 需求分析 设计阶段 编码阶段 测试阶段 上线运维 角色分工 软件环境 苍穹外卖项目介绍 项目介绍 功能架构 产品原型 ​编辑 技术选型 开发环境搭建——前端环境搭建 开发环境搭建——后端环境搭建 熟悉项目结构 ​编辑 使…

入门开发教程之网站品质教程

目录 网站品质 教程 网站品质教程 背景 要素 可访问性 可用性 可靠性 可维护性 提升网站品质 针对性调整 优化网页速度 提供多种访问方法 结论 网站品质教程 背景 在今天这个数字化时代,网站已经成为了各个行业展示产品和服务的重要媒介。而网站品质是…

百分点科技苏萌受邀出席首届全国统计与数据科学联合会议

7月11-13日,首届全国统计与数据科学联合会议在北京举行,会议由中国现场统计研究会、中国数学会概率统计分 会、全国工业统计学教学研究会和中国商业统计学会联合主办,北京大学统计科学中心承办,旨在促进统计与数据科学领域发展&a…

H3C-Cloud Lab实验-IPv6实验

实验拓扑图: 实验需求: 1、在R1和PC3上开启IPv6链路本地地址自动生成,测试是否能够使用链路本地地址互通 2、为R1配置全球单播地址2001::1/64,使PC3能够自动生成与R1同一网段的IPv6地址3、测试R1和PC3是否能够使用全球单播地址互…

【UE4 塔防游戏系列】05-制作可跟踪旋转的炮塔

目录 效果 步骤 一、设置游戏观察视角 二、设置PlayerController 三、制作可跟踪旋转的炮塔 效果 步骤 一、设置游戏观察视角 在视口中调整好位置,能够看到敌人行走的全部路线即可。然后在此处创建CameraActor 打开关卡蓝图,设置使用这个相机的…

【Kaggle】初学者几个冷门的操作总结

文章目录 一、如何看当前的目录?二、Kaggle如何切换路径?三、与包安装或设置有关的错误四、如何把 Kaggle 上的 input 数据转到 output 中? 一、如何看当前的目录? 在 Linux 中,你可以使用 pwd 命令来查看当前所在的目…

UML与SYSML的关系

UML与SysML的联系 UML(统一建模语言)和SysML(系统建模语言)是两种与建模相关的语言,它们之间存在联系和区别。 SysML的图分类如下图所示。 联系 SysML是基于UML的,它重用了UML 2的子集,并提…

MySQL持久化数据——主从分离 Linux下创建2个MySQL的Docker容器 挂载方式启动 配置主从

目录 引出数据库的事务1.原子性2.一致性3.隔离性4.持久性 MySQL持久化数据0.在宿主机centos创建主的文件夹1.拷贝my.cnf配置文件2.挂载方式启动主mysql3.修改my.cnf文件的权限【bug】mysql: [ERROR] unknown variable server-id200. 3.修改主的my.cof文件4.创建主从账号slave5.…

Mysql索引实战

Mysql索引实战 一:概述1.1 索引如何提高查询效率: 二:结构2.1 主要索引结构2.2 详解BTree2.2.1 二叉树2.2.2 红黑树2.2.3 B-Tree2.2.4 BTree2.2.5 为什么InnoDB存储引擎选择使用Btree索引结构? 三:索引分类3.1 按照作用…

使用fast测试的错误

错误:Connection refused: connect 分析&解决 检查服务的端口号和fast生成请求时的端口号是否一致,不一致会报上面的错误 分析:设置服务配置的方法很多,可以写在配置文件里,也可以写在命令行里,当有多…

windows nodejs 版本切换

一、按健winR弹出窗口,键盘输入cmd,然后敲回车。然后进入命令控制行窗口,并输入where node查看之前本地安装的node的路径。 二、找到上面找到的路径,将node.exe所在的父目录里面的所有东西都删除。 三、从官网下载安装包 https://github.com/…

轻量级性能测试工具 wrk 应该如何使用?

项目设计之初或者是项目快要结束的时候,大佬就会问我们,这个服务性能测试的结果是什么,QPS 可以达到多少,RPS 又能达到多少?接口性能可以满足未来生产环境的实际情况吗?有没有自己测试过自己接口的吞吐量&a…

MongoDB安装配置教程(详细版)

前言:MongoDB是前端开发人员普遍使用的数据库,因为MongoDB不需要图形界面,是一个基于分布式文件存储的开源数据库系统。MongoDB 将数据存储为一个文档,数据结构由键值对(key>value)组成;MongoDB 文档类似于 JSON 对…

Flutter:自定义错误显示

为什么要自定义错误处理 以下面数组越界的错误为例&#xff1a; class _YcHomeBodyState extends State<YcHomeBody> {List<String> list [苹果, 香蕉];overrideWidget build(BuildContext context) {return Center(child: Column(children: [Text(list[0]),Tex…

小区物业管理信息系统设计与实现(论文+源码)

小区物业管理信息系统设计与实现(论文源码) 本篇 论文源码私我 以上内容只是精简版 还有很多原创类型论文 摘 要 随着互联网的发展&#xff0c;网络技术的发展变得极其重要&#xff0c;所以依靠计算机处理业务成为了一种社会普遍的现状。管理方式也自然而然的向着现代化技术方…

python_day8_timeline

带时间线的柱状图 导包 from pyecharts.charts import Bar, Timeline from pyecharts.options import * from pyecharts.globals import *创建柱状图1 bar1 Bar() bar1.add_xaxis([中国, USA, 不列颠]) bar1.add_yaxis(GDP, [30, 20, 10],label_optsLabelOpts(position&quo…

【Linux详解】——文件系统(磁盘结构、软硬链接、动静态库)

&#x1f4d6; 前言&#xff1a;本期介绍文件系统。 目录 &#x1f552; 1. 磁盘结构&#x1f558; 1.1 物理结构&#x1f558; 1.2 存储结构&#x1f558; 1.3 逻辑结构 &#x1f552; 2. 文件系统&#x1f558; 2.1 对 IO 单位的优化&#x1f558; 2.2 磁盘分区与分组&#x…

一套电子病历系统源码(EMR)

EMR电子病历系统源码 电子病历系统面向门诊医生和病房临床医生&#xff0c;实现了医生日常阅读、书写病历和医院管理病历的需求&#xff0c;它包括知识库管理、病历模版制作、医生书写病历、开各种检查检验申请单、查询各种报告单、电子病历浏览、病历质量控制等功能。 它将病…

JMeter基础 — JMeter聚合报告详解

提示&#xff1a;聚合报告组件的使用和察看结果树组件的使用方式相同。本篇文章主要是详细的介绍一下聚合报告组件内容&#xff0c;不做示例演示。 1、聚合报告介绍 在使用JMeter进行性能测试时&#xff0c;聚合报告(Aggregate Report)可以说是必用的监听器。 &#xff08;1&…