首页 > 其他分享 >Hystrix-熔断原理分析

Hystrix-熔断原理分析

时间:2024-09-28 12:50:36浏览次数:8  
标签:状态 调用 服务 请求 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 的熔断机制是分布式系统中实现容错能力的重要组件。通过熔断器,系统可以有效地应对服务调用失败、网络延迟等问题,防止故障扩散并保持系统的高可用性。通过合理的配置和降级策略,开发者可以构建更加健壮的微服务架构,从而提高系统的稳定性和容错性。

标签:状态,调用,服务,请求,Hystrix,熔断,熔断器,原理
From: https://blog.csdn.net/Flying_Fish_roe/article/details/142614258

相关文章

  • 7-访问控制技术原理与应用
    7.1访问控制概述1)概念访问控制是指对资源对象的访问者授权、控制的方法及运行机制。访问者又称为主体,可以是用户、进程、应用程序等;资源对象又称为客体,即被访问的对象,可以是文件、应用服务、数据等;授权是访问者可以对资源对象进行访问的方式,如文件的读、写、删除、追加或......
  • 蜂鸣器原理
    单片机控制蜂鸣器的工作原理续流二极管 D9 电感元件在电流发生变化时都会产生反向电动势来尽力维持电流不变三极管开关电流放大输出0导通输出1截止有源蜂鸣器实现容易无源蜂鸣器1、周期的方波信号(把蜂鸣器的启停放在定时器里)定时器开始计时到时间开......
  • Javascript编译原理
    JavaScript的编译原理是一个复杂但有序的过程,主要涉及分词(词法分析)、解析(语法分析)、代码生成以及执行等阶段。以下是对JavaScript编译原理的详细解析:chrome编译流程 1.分词(词法分析)分词(Tokenizing)或词法分析(Lexing)是编译过程的第一步。在这个阶段,编译器将输入的源代码......
  • 【MySQL】MySQL MVCC并发控制的原理、不可重复度、读已提交
    1.概述上一篇文章:【MySQL】MySQL脏读、幻读以及不可重复读、我真的不会读在介绍MVCC并发控制的原理之前,我们先普及两个知识点。要解决并发问题只有一种方案就是加锁。当然,锁不可避免的会导致性能下降,但是,锁也有乐观和悲观之分,上一讲我们聊到的,隔离级别中的串行化就是......
  • volatile关键字的作用以及底层原理
    volatile关键字的作用以及底层原理前言java的内存模型结构数据的不一致和指令的重排序内存屏障volatile读写插入的内存屏障volatile不保证数据的原子性volatile的内存语义前言在java并发编程中,volatile关键字可以保证数据的可见性和防止JVM指令的重排序,我们接下来深......
  • GPS定位和测量原理
    GPS定位和测量原理主要涉及卫星信号的接收、计算和校正过程,以下是对这一原理的详细阐述:一、GPS定位原理卫星信号发射:GPS系统由一定数量的卫星(通常为24颗,其中21颗为工作卫星,3颗为备用卫星)组成,这些卫星以非常准确的时间间隔向地面发射无线电信号。卫星的位置可以根据星载......
  • Spring Ioc底层原理代码详细解释
    文章目录概要根据需求编写XML文件,配置需要创建的bean编写程序读取XML文件,获取bean相关信息,类,属性,id前提知识点Dom4j根据第二步获取到的信息,结合反射机制动态创建对象,同时完成属性赋值将创建好的bean存入到Map集合,设置key-value映射提供方法从Map中通过id获取到对象的valu......
  • 密码学承诺之原理和应用 - pedersen承诺
    主页微信公众号:密码应用技术实战博客园首页:https://www.cnblogs.com/informatics/GIT地址:https://github.com/warm3snow简介在上一篇文章《密码学承诺之原理和应用-概览》中,我们详细介绍了常见的密码学承诺原理,本节我们将重点介绍Pedersen承诺的实现和应用。在区块链技......
  • 蓝牙定位导航系统深度解析:技术原理、实现步骤与实战应用
    随着物联网(IoT)技术的飞速发展,蓝牙低功耗(BLE)技术凭借其低功耗、高兼容性及短距离通信的优势,在各类定位系统中占据了重要地位。其中,蓝牙定位导航系统作为室内定位解决方案的佼佼者,正逐步改变着我们的生活方式。本文将深入探讨蓝牙定位导航系统的技术原理、关键技术、实现步骤,并通......
  • 大模型还能产生幻觉?一文讲清楚原理和解决方法
    “像我们这样相信物理学的人都知道,过去、现在和未来之间的区别只是一种顽固执着的幻觉。换句话说,时间是一种幻觉。”——波尔幻觉,即一种看似真,实为假的感受。最近接触到了一个概念:大模型幻觉。有点好奇,大模型还能产生幻觉?于是查找了一些资料,开始了解。一、大模型幻觉,像你身边那个爱......