Hystrix总结

2023-05-16

Hystrix是什么?

这里写图片描述

    Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复。

Hystrix能做什么?

  • 在通过第三方客户端访问(通常是通过网络)依赖服务出现高延迟或者失败时,为系统提供保护和控制
  • 在分布式系统中防止级联失败
  • 快速失败(Fail fast)同时能快速恢复
  • 提供失败回退(Fallback)和优雅的服务降级机制
  • 提供近实时的监控、报警和运维控制手段

Hystrix设计原则?

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

Hystrix实现原理-命令模式

  • 将所有请求外部系统(或者叫依赖服务)的逻辑封装到 HystrixCommand或者HystrixObservableCommand(依赖RxJava)对象中
  • Run()方法为要实现的业务逻辑,这些逻辑将会在独立的线程中被执行当请求依赖服务时出现拒绝服务、超时或者短路(多个依赖服务顺序请求,前面的依赖服务请求失败,则后面的请求不会发出)时,执行该依赖服务的失败回退逻辑(Fallback)
    这里写图片描述

Hystrix实现原理-舱壁模式

  • 货船为了进行防止漏水和火灾的扩散,会将货仓分隔为多个,当发生灾害时,将所在货仓进行隔离就可以降低整艘船的风险。

    这里写图片描述

Hystrix实现原理-隔离策略

  • 应用在复杂的分布式结构中,可能会依赖许多其他的服务,并且这些服务都不可避免地有失效的可能。如果一个应用没有与依赖服务的失效隔离开来,那么它将有可能因为依赖服务的失效而失效。
  • Hystrix将货仓模式运用到了服务调用者上。为每一个依赖服务维护一个线程池(或者信号量),当线程池占满,该依赖服务将会立即拒绝服务而不是排队等待。
  • 每个依赖服务都被隔离开来,Hystrix 会严格控制其对资源的占用,并在任何失效发生时,执行失败回退逻辑。
    这里写图片描述

Hystrix实现原理-观察者模式

  • Hystrix通过观察者模式对服务进行状态监听。
  • 每个任务都包含有一个对应的Metrics,所有Metrics都由一个ConcurrentHashMap来进行维护,Key是CommandKey.name()
    这里写图片描述

  • 在任务的不同阶段会往Metrics中写入不同的信息,Metrics会对统计到的历史信息进行统计汇总,供熔断器以及Dashboard监控时使用。
    这里写图片描述

Metrics

  • Metrics内部又包含了许多内部用来管理各种状态的类,所有的状态都是由这些类管理的
  • 各种状态的内部也是用ConcurrentHashMap来进行维护的
    这里写图片描述

    如:HealthCountsStream是用来统计任务失败率的一个类
    这里写图片描述

    而每个状态管理类内部又包含了各自的真实转态信息
    如HealthCountsStream保存的信息的一部分如下:
    这里写图片描述

Metrics如何统计

Metrics在统计各种状态时,时运用滑动窗口思想进行统计的,在一个滑动窗口时间中又划分了若干个Bucket(滑动窗口时间与Bucket成整数倍关系),滑动窗口的移动是以Bucket为单位进行滑动的。
如:HealthCounts 记录的是一个Buckets的监控状态,Buckets为一个滑动窗口的一小部分,如果一个滑动窗口时间为 t ,Bucket数量为 n,那么每t/n秒将新建一个HealthCounts对象。
这里写图片描述

Hystrix实现原理-熔断机制

  • 熔断是参考电路而产生的一种保护性机制,即系统中如果存在某个服务失败率过高时,将开启熔断器,对于后续的调用,不在继续请求服务,而是进行Fallback操作。
  • 熔断所依靠的数据即是Metrics中的HealthCount所统计的错误率。
    一个命令的调用过程如图所示:

    这里写图片描述

熔断器的判断流程:

1.一个命令执行前会先运行allowRequest()函数。
allowRequest()函数内部为:

  • 先查看熔断器是否强制开启(ForceOpen()),如果开启则拒绝
  • 再查看熔断器是否强制关闭(ForceClosed()),如果强制关闭则允许Request,否则进一步判断
  • 先做isOpen(),判断熔断器是否开启,如果开启则拒绝访问,如果开启则进一步判断
  • 再做allowSingleTest(),熔断器休眠期过后,允许且只允许一个请求,如果这个请求正确执行,则熔断器关闭,如果执行失败,则熔断器再次开启,进入新的熔断周期。

这里写图片描述 这里写图片描述 这里写图片描述

如何判断超时

在运行对应的command时,Hystrix会注册一个Timer到一个定时线程池中,当超时后会启用一个HystrixTimer线程来终止的执行。

这里写图片描述

这里写图片描述

线程池的管理是用ThreadPoolExecutor来实现的,当线程池和阻塞队列都满后会抛出RejectedExecutionException,捕获该异常并进行相应状态的处理。

这里写图片描述

Note:除此之外由程序错误导致的异常,断路器打开都可以导致任务失败进入Fallback

失败降级

Hystrix提供了失败降级策略,当命令执行失败时,Hystrix 将会执行失败回退逻辑。失败回退逻辑包含了通用的回应信息,这些回应从内存缓存中或者其他固定逻辑中得到,而不应有任何的网络依赖。
如果一定要在失败回退逻辑中包含网络请求,必须将这些网络请求包装在另一个 HystrixCommand 或 HystrixObservableCommand 中。
失败降级也有频率限时,如果同一fallback短时间请求过大,则会抛出拒绝异常。

缓存机制

除了第一次请求需要真正访问依赖服务以外,后续请求全部从缓存中获取,可以保证在同一个用户请求内,不会出现依赖服务返回不同的回应的情况,且避免了不必要的线程执行。
缓存在命令内部,且有一个ConcurrentHashMap进行管理
这里写图片描述
使用缓存需要重写父类的getCacheKey方法

配置

Command

设置隔离策略
execution.isolation.strategy = THREAD

设置超时时间
execution.isolation.thread.timeoutInMilliseconds = 1000

信号量隔离策略设置最大并发请求数(仅在信号量隔离策略下生效)
execution.isolation.semaphore.maxConcurrentRequests = 10

设置最大Fallback数量
fallback.isolation.semaphore.maxConcurrentRequests = 10

设置熔断器滑动窗口最小任务
circuitBreaker.requestVolumeThreshold = 20

设置熔断器持续时间
circuitBreaker.sleepWindowInMilliseconds = 5000

设置触发熔断器的失败任务阈值(百分比)
circuitBreaker.errorThresholdPercentage = 50

设置Metrics监视器的范围时间(过去多少ms内)
metrics.rollingStats.timeInMilliseconds = 10000

设置监视器内桶的数量(将监视器范围划分为若干块)
metrics.rollingStats.numBuckets= 10

ThreadPool

设置线程池容量
coreSize = 10

设置阻塞队列长度(优先级高于queueSizeRejectionThreshold,且一旦初始化就不能更改 )
maxQueueSize = -1

动态设置阻塞队列长度
queueSizeRejectionThreshold = 5

空闲线程存活时间
keepAliveTimeMinutes= 1

线程池监控窗口时间范围(10s内)
metrics.rollingStats.timeInMilliseconds = 10000 

设置线程池监控滑动窗口的桶数量
metrics.rollingStats.numBuckets = 500

Note:窗口时间必须为桶数量的整数倍,否则会抛出异常

Dashboard

1.Hystrix 自带了一个dashboard,用来监控熔断信息.
2.Dashboard可以监测哪些数据?
3.使用turbine可以监控集群.

这里写图片描述

使用Turbine聚合的服务器集群

这里写图片描述

遇到问题

压测过不了,提高阻塞队列和线程池无效,增加fallback容量解决。
fallback.isolation.semaphore.maxConcurrentRequests = 100

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hystrix总结 的相关文章

随机推荐

  • Vue 项目启动报错:http://eslint.org/docs/rules/no-unused-vars

    Vue项目启动时报 xff1a http eslint org docs rules no unused vars 39 vm 39 is assigned a value but never used src navigation nav
  • Android解决相机预览拉伸问题

    拉伸的原因 1 主要是由于surfaceview的尺寸和 相机预览尺寸不一致造成的 64 Override span class token keyword public span span class token keyword void
  • Linux技巧

    0001 修改主机名 bjchenxu vi etc sysconfig network xff0c 修改HOSTNAME一行为 34 HOSTNAME 61 主机名 34 没有这行 xff1f 那就添加这一行吧 xff0c 然后运行命令
  • 8.消抖技术

    简介 开关的金属触点在断开闭合的过程中产生了多个信号 xff0c 消抖就是保证只有一个信号起到作用 这样的小抖动不像快脉冲一样造成市电上的其他设备出现故障 但是会导致模拟电路快速翻转的数字信号电路出现故障 便宜的电脑键盘通常使用导电橡胶制成
  • 1.7-1.8动态库加载失败的原因和解决办法

    目录 1 动态库和静态库的原理 2 动态库加载失败的原因 3 解决方法 3 1 DT RPATH段 3 2将libcalc so的路径加入到环境变量LD LIBRARY PATH中 3 3将libcalc so的路径加入到 etc ld s
  • Spring中Bean创建完成后执行指定代码的几种实现方式

    Spring中Bean创建完成后执行指定代码的几种实现方式 1 实现ApplicationListener接口2 实现InitializingBean接口3 使用 64 PostConstruct注解 在实际开发中经常会遇到在spring容
  • archlinux fcitx5 在浏览器中不能使用中文输入法

    archlinux系统升级后 xff0c fcitx5 在浏览器中不能使用中文输入法 xff0c 解决办法 xff1a 编辑 etc environment 并添加以下几行 xff0c 然后重新登录 1 xff1a GTK IM MODUL
  • ANR问题了解新思路

    众所周知 xff0c ANR问题一般不太容易解决 它是一种比较综合性的问题 往往涉及系统事件分发逻辑 xff0c ANR产生机制 xff0c BINDER机制 xff0c 线程同步 xff0c CPU和内存使用等各方面 意思就是说 xff0
  • 2021-01-14

    Design expert教程 单因素实验设计 Part 1 基础简介在这个教程中 xff0c 我们会使用Design Expert创建一个常用的单因素多水平设计 这种类型的设计对分类处理的简单比较非常有用 xff0c 例如 xff1a 谁
  • Statement和PreparedStatement的区别/PreparedStatement和Statement比较的优点

    Statement 和 PreparedStatement之间的关系和区别 关系 xff1a PreparedStatement继承自Statement 都是接口 区别 xff1a PreparedStatement可以使用占位符 xff0
  • MATLAB自适应中值滤波

    span class token operator span 自适应中值滤波 clc span class token punctuation span clear span class token punctuation span clo
  • 操作系统经典问题之生产者消费者问题

    一 生产者消费者问题 生产者和消费者问题是计算机同步互斥的经典问题 xff0c 其意思就是生产者把生产出来的产品放在仓库里 xff0c 消费者把产品从仓库里取出来 仓库属于临界区 xff0c 生产者和消费者一次只能一个进入临界区中 两个进程
  • ctags使用教程

    Ctags ctags在http ctags sourceforge net 下载源码 xff0c 编译后安装 常规的标记命令为 ctags R 34 R 34 表示递归创建 xff0c 也就包括源代码根目录下的所有子目录下的源程序 绝大多
  • 线程池(阻塞队列,生产者消费者模式)

    线程的等待和通知 Object类中有些方法不可随便调用 wait notify notifyAll 这三个方法 xff1a 1 wait 使线程主动释放锁 xff0c 进入等待状态 xff0c 直到他被其他的线程通过 notify 和 no
  • ubuntu18.04开机后无法进入系统问题的解决方法

    解决方法ubuntu18 04开机时无法进入系统的问题 问题描述 xff1a 出现这种错误的原因是安装了nvidia smi安装包 xff0c Ubuntu18 04内核bug导致gdm3和nvidia驱动冲突 xff0c 使得gdm3无法
  • 解决安装软件包时出现E:无法定位的问题

    第一种情况 xff1a 在确定网络连接和质量没问题的情况下 xff0c 任何软件都无法安装 xff0c 出现E 无法定位XXX 解决 xff1a 换源 具体步骤 xff1a 1 备份 etc apt sources list 文件 执行命令
  • 初次入职,git使用教程:如何在idea使用git拉取代码,提交代码,以及在gitlab上发起合并请求

    git的使用相信是很多刚踏入程序员这一行朋友的痛点 xff0c 刚入职的一段时间非常担心git用错 xff0c 把别人的代码覆盖掉 xff0c 下面我详细介绍一下如何在idea上使用git xff0c 拉取 xff0c 提交代码 xff0c
  • nginx配置反向代理

    因为项目会根据生成一个URL 那个URL需要挂在移动端APP上 xff0c 但该项目需要部署在公司内网 xff0c 公司内网不能全外网开放 xff0c 所以需要经过nginx配置反向代理来跳转 文章目录 前言一 pandas是什么 xff1
  • 张筱雨履历

    自出道以来便以清纯可爱风格 席卷全球 幽雅的姿态 迷人的身姿 无不透露出深刻内涵的底蕴 被誉为中国第一 姓名 xff1a 张筱雨 出生日期 xff1a 1985年06月06日 职业 xff1a 模特 性别 xff1a 女性 籍贯 xff1a
  • Hystrix总结

    Hystrix是什么 xff1f Hystrix 能使你的系统在出现依赖服务失效的时候 xff0c 通过隔离系统所依赖的服务 xff0c 防止服务级联失败 xff0c 同时提供失败回退机制 xff0c 更优雅地应对失效 xff0c 并使你的