Hystrix之概述

本文探讨了分布式系统中常见的服务雪崩问题及其解决方案,介绍了Hystrix库如何通过服务降级、熔断、限流和监控等功能提高系统弹性。

痛点

分布式系统面临的问题
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
可能会出现服务雪崩
服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.

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

(1)熔断模式:这种模式主要是参考电路熔断,如果一条线路电压过高,保险丝会熔断,防止火灾。放到我们的系统中,如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

(2)隔离模式:这种模式就像对系统请求按类型划分成一个个小岛的一样,当某个小岛被火少光了,不会影响到其他的小岛。例如可以对不同类型的请求使用线程池来资源隔离,每种类型的请求互不影响,如果一种类型的请求线程资源耗尽,则对后续的该类型请求直接返回,不再调用后续资源。这种模式使用场景非常多,例如将一个服务拆开,对于重要的服务使用单独服务器来部署,再或者公司最近推广的多中心。

(3)限流模式:上述的熔断模式和隔离模式都属于出错后的容错处理机制,而限流模式则可以称为预防模式。限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。这种模式不能解决服务依赖的问题,只能解决系统整体资源分配问题,因为没有被限流的请求依然有可能造成雪崩效应。

Hystrix

为了解决这一需求,Hystrix应运而出
概念:
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
guthun官网

核心功能

1.服务降级
Hystrix服务降级,其实就是线程池中单个线程障处理,防止单个线程请求时间太长,导致资源长期被占有而得不到释放,从而导致线程池被快速占用完,导致服务崩溃。
Hystrix能解决如下问题:
1.1.请求超时降级,线程资源不足降级,降级之后可以返回自定义数据
1.2.线程池隔离降级,分布式服务可以针对不同的服务使用不同的线程池,从而互不影响
1.3.自动触发降级与恢复
1.4.实现请求缓存和请求合并

2.服务熔断
熔断模式:这种模式主要是参考电路熔断,如果一条线路电压过高,保险丝会熔断,防止火灾。放到我们的系统中,如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

3.服务限流
限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。这种模式不能解决服务依赖的问题,只能解决系统整体资源分配问题,因为没有被限流的请求依然有可能造成雪崩效应。

4.服务监控
Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面。

参考资料:尚硅谷周阳Spring Cloud讲解

本文若有错误请指正,互相学习,加油!

03-10
### Hystrix 使用指南 #### 启用 Feign 和 Hystrix 支持 为了使Feign客户端能够利用Hystrix的功能,在`application.yml`或者`application.properties`文件里需要设置特定参数以激活此功能。对于YAML格式的配置文件而言,应当加入如下所示的内容: ```yaml feign: hystrix: enabled: true # 开启 feign 对 hystrix 的支持[^1] ``` 这一步骤确保了每当通过Feign发起远程调用的时候,默认情况下都会被包裹在一个Hystrix命令之中。 #### 配置熔断器属性 进一步定制化Hystrix行为可以通过调整一系列与之关联的选项实现。下面是一些常用的配置项及其含义说明: - `execution.isolation.thread.timeoutInMilliseconds`: 设置线程隔离模式下执行超时时间(毫秒),超过该时限则认为操作失败并触发回退逻辑; - `circuitBreaker.requestVolumeThreshold`: 定义触发熔断前最小请求数量阈值;一旦达到这个数目并且错误率超过了设定比例,则启动熔断机制; - `circuitBreaker.errorThresholdPercentage`: 错误百分比门限值,即当一段时间内的请求中有多少比例发生异常才会考虑开启熔断开关; - `circuitBreaker.sleepWindowInMilliseconds`: 半开状态持续的时间长度,在这段时间过后允许一定数量的新请求试探性地访问目标服务,以此判断后者是否已经恢复正常运作。 具体应用到配置文件中可以写作: ```yaml hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 2000 # 超时时间为2秒钟 circuitBreaker: requestVolumeThreshold: 10 # 请求次数达到10次作为评估依据 errorThresholdPercentage: 50 # 如果一半以上的请求失败就会跳闸 sleepWindowInMilliseconds: 5000 # 断路器保持关闭等待期为5秒后再试 ``` 上述配置使得系统能够在遇到频繁故障的情况下迅速做出反应,并给予适当缓冲以便于自我修复过程的发生[^2]。 #### 工作原理概述 Hystrix的工作方式类似于现实生活中的保险丝装置——它监控着各个Command对象所代表的操作流程,并收集有关成功率/失败率等相关统计数据。基于这些数据,Hystrix决定何时应该“烧毁”连接至下游系统的通路以防止单点失效引发更大范围的影响。而所谓的“熔断”,实际上是指停止向已知存在问题的目标发送新的请求直到确认对方重新变得可靠为止。在此期间,任何试图穿越已被切断路径的动作都将立即返回预定义好的备用响应而非真正去尝试建立联系。经过一段指定间隔之后,Hystrix会谨慎地释放少量资源给潜在可恢复的服务端口做测试用途,从而动态监测其健康状况。倘若验证无误,则正式解除限制措施让一切回归常态[^3]。 #### 微服务体系下的重要角色 考虑到当今分布式环境中各组件间紧密协作的特点以及由此带来的连锁风险隐患,像Hystrix这样专注于解决此类问题的技术方案显得尤为重要。尤其是在面对那些具有高度不确定性的外部依赖关系时,合理运用诸如熔断、降级等策略可以帮助我们构建更加稳健的应用程序架构,有效防止因个别环节失灵而导致全局瘫痪的局面出现[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值