【Spring Cloud系列】Hystrix应用详解

【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,能让我们更好的学习其他的微服务知识。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用3D转换工具HOOPS Exchange与LibConverter进行流缓存导出?

如果您正在使用HOOPS Communicator,您可能想在生成流缓存模型之前利用HOOPS Exchange的高级功能和转换选项。 申请HOOPS试用 HOOPS中文网 如何使用 如您所知,LibConverter是HOOPS Communicator软件包中包含的一个简单的API,conver…

单片机第一季:零基础8——蜂鸣器

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 想要压电式蜂鸣器发声&…

spring AOP中pointcut表达式详解

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

从零开始理解Linux中断架构(19)--中断线程化irq_thread

前面一节讲到的中断流处理流程是在hard_irq 流程上,工作在中断堆栈上。还有一种情况是使用中断线程的情形。request_threaded_irq参数中有两个处理函数handler,thread_fn是有区别的。handler主中断处理例程,运行hard_irq 流程上。而如果驱动程序填写thre…

Java程序员需要掌握的前端知识(一)

对于前端知识,需要进一步巩固和加强,进入企业之后,要具备一定的接口调试,参数接收的能力,以及单体页面的开发,这里我学习一下前端知识巩固一下自身的技术栈和水平。本次笔记是跟学黑马的同名课程&#xff0…

Bash 有效电话号码

193 有效电话号码 给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个单行 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。&…

通识强化学习,初步了解强化学习的运行规则和估值方法

1.强化学习的发展及应用现状 1.1.强化学习的由来 目前,大家认为强化学习(Reinforcement Learning, RL)的来源与两个领域密切相关:即心理学的动物试错学习和最优控制的优化理论。 这里都是有相应的共性的,在environme…

HCIP第七天

题目 拓扑图 1.所有路由器各自创建一个环回接口,合理规划IP地址 测试 2. R1-R2-R3-R4-R6之间使用OSPF协议,R4-R5-R6之间使用RIP协议 3. R1环回重发布方式引入OSPF网络 4. R4/R6上进行双点双向重发布 将OSPF中的环回接口改成broadcast 因为华为默认环回接…

阿里云AliYun物联网平台使用-客户端API获取设备传感数据

一、前言 上一篇文章中,已经实现了虚拟数据上云,本文我们将进行上位机客户端的开发,即通过调用阿里云IOT物联网云平台的SDK,开发能获取传感器的遥感数据。 二、云平台操作 调用API需要用户的AccessKey Secret,这意味着…

KaiwuDB CTO 魏可伟:多模架构 —“化繁为简”加速器

以下为浪潮 KaiwuDB CTO 魏可伟受邀于7月4日在京举行的可信数据库发展大会发表演讲的实录,欢迎大家点赞、收藏、关注! 打造多模引擎,AIoT数据库探索之路 01 何为“繁”? 工业 4.0 时代, 物联网产业驱动数据要素市场不…

国产芯片——单片机32位mcu的应用

随着物联网与人工智能和智能制造的发展,单片机作为嵌入式系统的核心控制器,在各类行业应用中占据重要位置。其中32位MCU在芯片设计、制造工艺、封装技术上等取得显著突破,以高性能的技术条件被广泛应用在智能物联等行业的方案开发中。今天我们…

windows安装mysql8.0.23版本成功示例-免安装

windows安装mysql8.0.23版本成功示例 一.通过mysql-installer-*.msi安装包的方式1.安装准备1.1 官网下载地址1.2 选择合适的版本点击下载 2.安装mysql 二.通过mysql-8.0.23-winx64.zip压缩包免安装方式1.安装准备1.1 下载官网压缩包1.2 解压后配置文件my.ini信息1.3 配置my.ini…

java ajax

1.ajax定义:异步刷新技术 2.ajax语法 3.ajax实战 在不需要点击刷新按钮时达到局部刷新显示,如下图所示 步骤一:创建工程/包/js 步骤二:数据库/表创建 步骤三:实体类 步骤四:UserDao package cn.kgc.dao;import cn…

Linux下JDK版本与安装版本不一致问题

目录 一. 🦁 前言二. 🦁 操作流程三. 🦁 总结四. 🦁 Happy Ending 一. 🦁 前言 最近重新安装了centos7.9,针对以前遇到的Java版本不一致的情况, 提出了另一种方法,该方法简单易行,容易理解。 二. 🦁 操作…

银行安全用电监管平台可行性研究及解决方案

2017年4月26日,国务院安全生产委员会印发《国务院安全生产委员会关于开展电气火灾综合治理工作的通知》(安委〔2017〕4号),强调用三年时间综合治理电气火灾工作,提高社会单位发现和处置消防电气安全隐患能力&#xff0…

vue2 element-ui el-cascader地址省市区分开单独写

使用 npm 或 yarn 安装 element-china-area-data 包&#xff1a; npm install element-china-area-data 在你的代码中导入 element-china-area-data import { regionData } from element-china-area-data let that; 完整代码 <template><div><el-form ref&quo…

【http-server】http-server的安装、前端使用http-server启动本地dist文件服务:

文章目录 一、http-server 简介:二、安装node.js:[https://nodejs.org/en](https://nodejs.org/en)三、安装http-server:[https://www.npmjs.com/package/http-server](https://www.npmjs.com/package/http-server)四、开启服务&#xff1a;五、http-server参数&#xff1a;【1…

Redis 优惠卷秒杀(二) 异步秒杀、基于Stream的消息队列处理

目录 基于Stream的消息队列 Redis优化秒杀 登录头 改进秒杀业务&#xff0c;调高并发性能 Redis消息队列实现异步秒杀 ​编辑基于List结构模拟消息队列 基于PuSub的消息队列 ​编辑 基于Stream的消息队列 Redis消息队列 基于Stream的消息队列 Redis优化秒杀 登录头 改…

LeetCode 142.环形链表II

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *detectCycle(ListNode …

【微信小程序创作之路】- 小程序窗口整体配置(导航栏、标题)

【微信小程序创作之路】- 小程序窗口导航栏配置 第五章 微信小程序窗口导航栏配置 文章目录 【微信小程序创作之路】- 小程序窗口导航栏配置前言一、入口文件的配置二、页面配置三、全局默认窗口配置1.navigationBarTitleText&#xff1a;导航栏标题文字2.navigationBarBackgr…