当前位置: 首页 > news >正文

Hystrix-熔断原理分析

Hystrix 熔断机制原理分析

Hystrix 是 Netflix 开源的一个容错库,主要用于提高分布式系统中微服务的稳定性和容错能力。在微服务架构中,服务之间的调用可能会受到网络故障、服务不可用、延迟等问题的影响,从而导致系统不稳定。Hystrix 提供了熔断机制,通过隔离服务调用、超时控制、故障恢复等手段,防止故障扩散,确保系统的高可用性。

1. 什么是熔断机制

熔断机制的灵感来源于电气设备中的熔断器。当电流过大时,熔断器会自动切断电路,从而保护设备不受损坏。同样地,在微服务架构中,Hystrix 的熔断机制用于保护系统不被持续的服务调用故障或延迟拖垮。

熔断机制的核心目标:

  • 当某个服务调用失败率过高或响应时间过长时,自动短路后续的调用,直接返回降级响应。
  • 防止故障的持续传播,保护调用者和其他依赖服务免受影响。
  • 在熔断器触发后的一段时间内,系统会自动尝试恢复调用,检测服务是否恢复正常。

2. 熔断器的三种状态

Hystrix 的熔断器可以处于三种状态之间进行转换:

  • 关闭状态 (Closed):在关闭状态下,熔断器允许所有请求通过。Hystrix 监控服务的调用情况,如请求失败次数或失败率等。当失败率超过预设的阈值时,熔断器将切换到打开状态。

  • 打开状态 (Open):在打开状态下,熔断器阻止所有请求,直接返回降级响应,不再调用目标服务。此时,系统认为目标服务可能存在问题,避免进一步的调用导致资源浪费。

  • 半开状态 (Half-Open):在打开状态一段时间后,熔断器会进入半开状态,允许部分请求通过以测试服务是否恢复。如果测试成功,熔断器会切换回关闭状态;如果测试失败,熔断器将再次进入打开状态。

状态转换的时机:

  • 从关闭状态到打开状态:当服务调用的失败率超过设定的阈值时,熔断器进入打开状态。
  • 从打开状态到半开状态:经过一段时间(称为“休眠时间窗”),熔断器自动进入半开状态。
  • 从半开状态到关闭状态:如果部分请求成功,熔断器将关闭,恢复正常服务调用。
  • 从半开状态到打开状态:如果测试的请求失败,熔断器重新进入打开状态。

3. 熔断触发条件

Hystrix 熔断器的触发主要基于以下三个核心参数:

  1. 请求数阈值(requestVolumeThreshold):在统计时间窗口内,必须有一定数量的请求发生,熔断器才会进行状态判断。默认情况下,这个值为 20,即在一个时间窗口内至少有 20 个请求时,才会触发熔断机制的判断。

  2. 失败率阈值(errorThresholdPercentage):熔断器在一个统计窗口内计算请求的失败率,如果失败率超过设定的百分比阈值,熔断器会进入打开状态。默认的失败率阈值为 50%,即如果失败率超过 50%,则触发熔断。

  3. 休眠时间窗(sleepWindowInMilliseconds):熔断器进入打开状态后,会进入一个休眠期。休眠期过后,熔断器会尝试进入半开状态,允许部分请求通过,测试服务是否恢复。默认的休眠时间为 5000 毫秒(5 秒)。

3.1 熔断触发的例子

假设服务 A 调用服务 B,在过去 10 秒内有 30 次请求,其中有 18 次请求失败(超时、异常等),失败率为 60%。如果设置的失败率阈值为 50%,Hystrix 将在服务 B 上触发熔断,进入打开状态,此时所有请求都不再真正调用服务 B,而是直接返回降级响应。

@HystrixCommand(fallbackMethod = "fallback", commandProperties = {@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"),@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")})
public String callServiceB() {return restTemplate.getForObject("http://service-b/api", String.class);
}

4. 熔断器状态转换的详细流程

4.1 关闭状态(Closed)

当服务处于关闭状态时,所有请求都会正常发往目标服务。Hystrix 会持续监控服务调用的成功率和失败率。如果在某个时间窗口内的失败率超过了设置的阈值,熔断器将会打开,切换到打开状态。

4.2 打开状态(Open)

当熔断器进入打开状态时,所有请求将不再调用目标服务,而是直接返回预定义的降级响应或默认响应。在这个状态下,熔断器将休眠一段时间(sleepWindowInMilliseconds)。这个休眠期是为了给故障的服务留出修复的时间,防止系统不断发送无用的请求,导致资源浪费。

4.3 半开状态(Half-Open)

在休眠期结束后,熔断器将进入半开状态,允许部分请求通过(通常是一次请求)。如果该请求成功,熔断器将关闭,恢复正常服务调用;如果请求失败,熔断器将重新进入打开状态,继续阻止请求。

半开状态的设计目的是避免服务完全恢复前就大量请求涌入,导致服务再度被拖垮。

@HystrixCommand(fallbackMethod = "fallback", commandProperties = {@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")})
public String riskyService() {// 调用远程服务
}

5. 降级策略

当熔断器处于打开状态时,所有请求将不再被发送到目标服务。为了提升用户体验,Hystrix 提供了降级策略,当目标服务不可用时,返回一个预设的响应。这通常用作应急响应或默认值。

public String fallback() {return "服务暂不可用,请稍后再试。";
}

降级方法 fallback() 可以是返回静态响应、调用备用服务,甚至是读取缓存数据。通过提供降级方法,系统可以在服务不可用的情况下仍然提供最低限度的服务能力。

6. 熔断器与隔离策略

Hystrix 提供了两种隔离策略,分别是线程池隔离和信号量隔离。

  • 线程池隔离:每个服务调用可以分配到一个单独的线程池中,隔离服务调用之间的资源争用。这种方式适用于长时间运行的远程服务调用。

  • 信号量隔离:不使用线程池,而是通过信号量来限制并发请求的数量,适用于本地方法调用或短时间内能完成的任务。

线程池隔离的优势在于可以限制线程池的大小,避免某个服务调用消耗掉所有的资源,但线程池隔离的开销相对较大。信号量隔离则更加轻量级,适合用在那些本地调用或轻量级操作中。

@HystrixCommand(fallbackMethod = "fallback", commandProperties = {@HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")})
public String callService() {return restTemplate.getForObject("http://service-c/api", String.class);
}

7. 熔断机制的优点

  • 防止雪崩效应:当某个服务故障时,通过熔断机制阻止服务被反复调用,避免引发更多级联故障。
  • 快速失败:当服务处于熔断状态时,能够快速返回降级响应,提升系统的响应速度。
  • 自我恢复:通过半开

状态自动检测服务的恢复情况,当服务恢复时,熔断器会自动关闭。

  • 增强系统稳定性:通过隔离策略、熔断和降级机制,Hystrix 能够有效提升分布式系统的容错能力,避免局部故障导致系统整体崩溃。

8. 结论

Hystrix 的熔断机制是分布式系统中实现容错能力的重要组件。通过熔断器,系统可以有效地应对服务调用失败、网络延迟等问题,防止故障扩散并保持系统的高可用性。通过合理的配置和降级策略,开发者可以构建更加健壮的微服务架构,从而提高系统的稳定性和容错性。在实际应用中,理解熔断器的工作原理并合理设置阈值,对于提升系统的容灾能力至关重要。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [论文笔记]Dimensionality Reduction by Learning an Invariant Mapping
  • 828华为云征文|基于华为云Flexus云服务器X搭建jumpserver堡垒机软件
  • vue3 el-menu 菜单Maximum recursive updates exceeded 报错
  • qt事件过滤器
  • 《机器学习》数据预处理 删除、替换、填充 案例解析及实现
  • zabbix6.4连接钉钉发出警告
  • 【计算机网络】TCP协议(下)
  • 基于stm32f407的pwm输出以及初始化(84mhz)
  • 电影、视频拍摄基础知识 | 所有岗位及职能描述、任职要求速览
  • LC1860C 后来怎么样了
  • 浅谈人工智能之python调用通义千问API
  • 深入解析MySQL索引的使用及优化
  • gitlab 启动/关闭/启用开机启动/禁用开机启动
  • 前端HTML基础笔记
  • 6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Centos6.8 使用rpm安装mysql5.7
  • ComponentOne 2017 V2版本正式发布
  • Tornado学习笔记(1)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 王永庆:技术创新改变教育未来
  • 译自由幺半群
  • 正则与JS中的正则
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # 安徽锐锋科技IDMS系统简介
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • (10)ATF MMU转换表
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (六)vue-router+UI组件库
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)linux 命令大全
  • (转)母版页和相对路径
  • (转)原始图像数据和PDF中的图像数据
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .gitignore文件使用
  • .md即markdown文件的基本常用编写语法
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 依赖注入和配置系统
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。
  • @JsonSerialize注解的使用
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [383] 赎金信 js
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [Doris]阿里云搭建Doris,测试环境1FE 1BE
  • [HackMyVM]靶场Crossbow
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
  • [Jquery] 实现鼠标移到某个对象,在旁边显示层。
  • [LeetCode][面试算法]逻辑闭环的二分查找代码思路
  • [LeetCode]Balanced Binary Tree
  • [Linux基础开发工具---vim]关于vim的介绍、vim如何配置及vim的基本操作方法