微服务容错组件Hystrix设计分析

60、微服务保姆教程(三)Sentinel---高可用流量管理框架/服务容错组件 微服务保姆教程之Sentinel---高可用流量管理框架/服务容错组件 阅读详情

引言

在分布式微服务场景下,由于各个业务服务的纵向拆分,加上通常会使用集群技术来保障业务服务的可靠性,由此导致了应用服务节点的爆炸式增长,服务节点的增多会导致出故障的概率也随之增加。如之前文章所阐述的,某个应用节点的不可用可能导致最终整个平台正常运行受影响,因此我们需要一些手段去应对这种异常情况。 Hystrix 正是一种专门针对微服务容错处理的基础组件,本文主要针对容错组件 Hystrix 进行设计分析,希望对大家有所裨益。

Hystrix是什么?

由于微服务架构的风靡于世,在微服务分布式场景中,某些服务节点既是上游业务的依赖方又是下游业务的调用方,各个服务的之间的依赖关系形成我们具体的业务处理流程。在实际的生产环境中,许多服务依赖项中在运行过程中或许由于代码问题、或许由于资源使用问题,可能会出现服务响应慢以及无法响应等问题。 Hystrix 是 Netflix 提供的一款服务容错基础组件,通过引入它可以给原有的应用添加延迟容忍和容错逻辑,以达到提升整个微服务架构的服务治理能力的目的。 Hystrix 通过隔离服务之间的访问点、阻止跨服务的级联故障以及提供降级访问机制实现以提高系统的整体弹性以及稳定性。

Hystrix解决什么问题?

复杂的分布式架构中,应用程序的集群节点及其依赖项服务节点非常多,节点出现问题之后如何进行及时容错处理是微服务架构稳定性以及可靠性的重要体现,那么 Hystrix 到底可以为我们解决哪些问题呢?

1、 阻止某个有问题调用耗尽系统的所有线程,限制线程资源消耗;

2、阻止异常在分布式系统之间的传播;

3、快速失败代替请求排队;

4、错误回退、优雅的服务降级;

Hystrix原理分析

1、问题分析

如下图所示,应用请求会进入所有后端服务集群。如果各个服务节点都是正常的,那么服务节点便会正常响应, 对应的依赖的服务也会正常运行,一切看起来都很美好。

但是现实总是很残酷的,如果依赖的某个服务节点出现异常,比如此时服务正在进行 full GC ,无法响应外部请求。因此此时的用户请求会被阻塞住。如下图所示,用户请求分别调用服务A、H、I以及P服务来完成某项业务流程,但是此时服务I出现异常或者服务I集群的某个节点出现了异常,虽然两者的连接还保持着,但是所有发送过去的业务请求都出现 timeout 。那么此时调用方的工作线程就会被阻塞住,导致调用方出现线程不断被被占用的情况。

在流量较大的场景下,由于后端某些节点的异常,服务提供者不可用,如下图的依赖I服务不可用,请求无法正常返回,那么调用方会不断进行重试进一步加大流量,最终导致调用方线程资源耗尽,导致服务调用者不可用。服务调用者也可能是上游服务的服务提供方,由于请求资源不断被占用,同时导致上游依赖应用同步被影响,最后故障点会蔓延到整个平台中。

2、问题破解

既然微服务架构中某个节点的异常可能导致整个平台的不可用,有什么好的解决方案可以解决这个问题呢?如果说这个故障节点就像是病毒传播的一号病人一样,那么只要及时的发现以及隔离它,避免异常节点的进一步影响发散,是不是就可以解决微服务架构各个服务之间的依赖调用异常导致的问题。基于此的分析,我们希望借助 Hystrix 实现如下的几点核心逻辑:

资源隔离:限制调用服务使用的资源,当某一下游服务出现问题时,不会影响整个服务调用链。

服务熔断:当失败率达到阀值自动触发熔断,熔断器触发后原有的请求链路被切断,请求无法正常触达服务提供方。

服务降级:超时、资源不足等异常触发熔断后,需要调用预设的降级接口返回兜底数据,提升平台容错能力。

3、实现原理

(1)业务流程

如果想要实现异常情况的熔断保护,首先我们得有个断路器,由它作为调用流量的开关。大致的运行逻辑如下图所示,服务调用时判断断路器是否打开,如果打开了则进行降级操作,果没有打开则判断信号量以及线程池是否拒绝,如果拒绝则同样执行降级流程。如果正常则上报自己的健康状态。执行正常流程看是否成功,失败了则执行降级流程。如果成功了,则上报监控数据,如果超时同样是执行降级策。

(2)断路器原理分析

断路器的作用实际就是之前文章中说到的微服务架构中的保险丝一样,起到保护系统的作用。当对下游服务调用异常量达到设定阈值后,将断路器打开,触发熔断操作,避免流量继续堆积。

断路器涉及到的主要设计点主要包括两项,一个是断路器的控制逻辑(控制断路器开关的打开和关闭),另一个是触发断路操作的阈值判断与数据统计(统计数据作为断路器的操作判断)。对于断路器本身来说表面上看就是断路器的开关打开或者关闭来控制是否走降级逻辑,实际上核心的逻辑是如何判断什么时候该开以及什么时候该关。

断路器逻辑控制

断路器的状态转换和注册中心的服务是否在线有点类似,都涉及到状态的变化,只不过断路器多了个半打开的状态。因此实际上还需要对服务是否恢复正常进行判断的过程。大致流程如上图所示,断路器的初始状态是关闭状态,一旦请求失败情况达到了阈值便会打开断路器。断路器打开后需要进行探测,探测什么时候异常恢复之后还是要将断路器进行关闭的。但是在打开断路器之后不会立马进行探测,而是需要经历个窗口期,不然立马重试必然还是失败,这个窗口期就相当于给别人一个恢复的时间窗口。

当过了窗口期之后,将一些请求进行放开,让其完成正常的下游业务调用,进行请求试探,如果成功则关闭断路器,如果失败则继续维持当前断路器的OPEN状态。当然至于探测这块不是说一次成功或者失败就改变断路器现有的状态,这里可以设置对应的状态变更策略。

阈值统计

阈值以及数据统计是进行开关打开的判断依据,因此如何统计数据是非常关键的设计。如果阈值统计不够准确有效,那么实际无法起到该有的作用,如果断路器过于敏感,偶尔的调用异常就打开断路器(网络抖动等),势必会严重影响正常的业务流程。如果断路器过于迟钝,该打开的时候不打开,那么可能导致异常在全平台的传播

既然不能通过一次的调用成功或者失败来判断,那么我们可以把统计的周期拉长,通过几个周期来判断。同时为了保证判断的时效性,统计的周期需要不断更新。如上图所示,一开始的统计周期是0-7,过了一个时间节点后统计周期就是1-8,时间间隔不变但是统计的开始时间和结束时间是实时更新的,这就类似一个滑动窗口,随着时间的推移不断向前行进,保障统计的时效。

(3)隔离设计

Hystrix 通过隔离的方式来限制异常节点访问对平台的影响,这个就类似于之前我文章提到的船舱内的隔板,限制异常影响范围。主要包括线程池隔离以及信号量隔离。

线程隔离

如上图所示,在线程隔离的实现方式中,通过将用户请求线程与 Hystrix 组件线程进行隔离,如果出现服务提供方不可用的情况,阻塞的线程是线程池冲分配的线程,将资源隔离的影响降到最低。组件包装依赖调用逻辑,每个调用 conmand 在单独线程池中执行,限制线程资源占用。

通过发送请求线程与执行请求的线程资源隔离,可有效防止发生级联故障。当线程池或请求队列饱和时, Hystrix 将拒绝服务,使得服务请求线程可以 fast-fail ,从而避免服务节点问题导致的依赖异常扩散。

信号量隔离

我们都知道线程池的引入会带来一定的资源消耗,因为涉及到线程池内部的线程资源调度。因此比较适合引入线程池带来的好处多于资源调用损耗的场景。在一般的场景下,使用更加轻量级的隔离方式会更加适合,那么信号量正是这种轻量级的隔离方式,不存在线程上下文切换所带来的性能开销。从隔离设计的第一张图中我们可以看出使用线程池时,发送请求的线程和执行依赖服务的线程不是同一个,线程池的使用方式就是将它们进行了隔离。而使用信号量时,发送请求的线程和执行依赖服务的线程是同一个线程, 都是发起请求的线程,信号量隔离限制对某个资源调用的并发数。

断路器对比Sentinel、Hystrix、resilience4j 功能对比 Sentinel Hystrix resilience4j 隔离策略 信号量隔离(并发线程数限流) 线程池隔离/信号量隔离 信号量隔离 熔断降级策略 基于响应时间、异常比率、异常数 基于异常比率 基于异常比率、响应时间 实时统计实现 滑动窗口(LeapArray) 滑动窗口(基于 RxJava) R... 阅读详情

相关推荐

Hystrix——服务容错保护库

Hystrix是Netflix开源的一款针对分布式系统延迟和容错的库。通过添加延迟容忍和容错逻辑,从而控制分布式服务之间的交互。

weixin_59248828的博客 2662

微服务架构服务容错设计分析

在微服务体系架构中,由于拆解的服务数变多了,服务发生故障的地方也会相应的增加,因此如何保证服务架构健壮是一个值得深思的问题。微服务容错机制正是这样一种稳定性解决方案,可以理解微微服务架构的保险丝,通过它可以对业务平台形成一种有效的保护机制。在发生平台异常时候,容错机制是平台稳定运行的最后一道屏障。

1769

Spring Cloud :Hystrix实现优雅的服务容错

作为Spring Cloud体系内实现熔断机制的关键组件,Hystrix承担着服务容错保护的重要职责。它由Netflix开源,旨在为分布式系统提供延迟处理和容错解决方案。其核心作用在于引入延迟容忍与容错逻辑,精细管理分布式服务间的交互,确保系统的高可用性和鲁棒性。在复杂分布式系统环境中,往往涉及数十个应用,这些应用依赖于多个项目。不可避免地,每个依赖项目都有可能在某个时刻遭遇失败并触发故障。若未对这些故障实施有效隔离措施,整个分布式系统可能面临崩溃风险。

布说在见的博客 2627

【线程、网络编程】

【多线程、网络编程】 主要内容 线程、网络编程 教学目标 说出进程的概念 说出线程的概念 能够理解并发与并行的区别 能够描述Java中多线程运行原理 能够使用继承类的方式创建多线程 能够使用实现接口的方式创建多线程 能够解释安全问题的出现的原因 能够使用同步代码块解决线程安全问题 能够使用同步方法解决线程安全问题 能够辨别UDP和TC...

weixin_44654375的博客 507

MCP协议桥接AdsPower:AI原生时代的浏览器自动化新范式

浏览器自动化是Web开发和数据采集领域的核心技术,其核心原理是通过程序控制浏览器内核执行页面导航、元素交互和数据提取等操作。传统方案如Selenium和Playwright虽功能强大,但在管理多实例、指纹隔离等复杂场景下,配置和维护成本较高。随着AI原生应用的发展,Model Context Protocol(MCP)作为一种标准化协议,为AI助手与外部工具间的通信提供了统一接口,显著提升了自动化流程的构建效率和自然语言交互能力。通过MCP Server桥接AdsPower指纹浏览器的本地API,开发者可将

weixin_30552811的博客 296

LPDDR5X内存技术解析:性能提升与优化策略

内存技术在现代计算系统中扮演着核心角色,其性能直接影响整体系统效率。LPDDR5X作为JEDEC最新标准,通过提升数据传输率至8533Mbps、优化能效比15%以上,并扩展突发长度至32字节,显著提升了移动设备的处理能力。这些改进特别适用于5G通信、AI加速(如昇腾芯片)及8K视频处理等高带宽需求场景。技术原理上,LPDDR5X引入了动态电压频率调整(DVFS)和可编程突发长度等创新机制,有效降低了实际应用中的延迟。在工程实践中,合理的PCB布局和信号完整性验证是确保高速稳定运行的关键。随着AI和8K应用的

weixin_29190169的博客 402

Sentinel--服务容错

在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络 原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会 出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。 接下来,我们来模拟一个高并发的场景 修改配置文件中tomcat的并发数 1秒钟20个请求,最大连接数10,最大等待数10,最大线程数2,相当于一个线程1s能处理5个请求(2个处理10个请求) 3. 接下来使用压测工具,对请求进行压力测试 链接: 下载

qq_63531917的博客 818

WIFI 相关的频偏调试以及天线调试记录

WIFI RF 相关的频偏调试以及天线调试 1,频率误差(Frequency Error) 频率误差(Frequency Error):表征射频信号偏离该信号所处信道中心频率的大小,单位PPM。频偏误差要求范围如下表。 频偏越小越好。PPM的计算公式如下: 问题: 我们ESP8089认证测试的时候频偏测试超了。需要修改哪些呢。 测试频率点在2.411865385GHz 宣称点:2.412GHz 频率偏移计算:{(2.412GHz-2.411865385GHz)÷2...

armkits的博客 1万+

微服务容错组件Hystrix设计分析(1)

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

2401_84048586的博客 837

深入解析Sigma Delta调制器 —— 从电流采样到数字信号处理的完整链路

本文深入解析了Sigma Delta调制器的工作原理与应用。通过剖析过采样、噪声整形与负反馈核心机制,并结合AMC1306等实例,详细阐述了从电流采样到数字信号处理的完整链路。该技术凭借其高精度和高抗干扰能力,在ADC、电流测量及音频处理等领域发挥着关键作用。

ttt77的博客 645

光模块封装工艺简介

光模块按照部件可以分为芯片、光器件、光模块三个层级;按照应用领域大概可分为电信应用、数通应用两个领域;按照内部器件的封装工艺可分为TO、Box、COB三大类。 但是,无论是哪种类型的光模块,其生产工艺基本上可以分为封装、测试两大块。   那什么叫做器件封装呢?我的理解器件封装就是利用胶水、焊料、机械、热量等手段把器件按照一定的先后次序结合形成一个整体的过程,就好像早上吃的煎饼,把面粉、鸡蛋、脆饼、烤肠、葱花等这些“器件”,按照一定的顺序,通过食用油、甜面酱、加热、卷起来等手段结合到一起,形成了美味的

qq_33253182的博客 2833

微服务容错组件Hystrix设计分析,javassm框架面试重点

如上图所示,一开始的统计周期是0-7,过了一个时间节点后统计周期就是1-8,时间间隔不变但是统计的开始时间和结束时间是实时更新的,这就类似一个滑动窗口,随着时间的推移不断向前行进,保障统计的时效。在流量较大的场景下,由于后端某些节点的异常,服务提供者不可用,如下图的依赖I服务不可用,请求无法正常返回,那么调用方会不断进行重试进一步加大流量,最终导致调用方线程资源耗尽,导致服务调用者不可用。如果各个服务节点都是正常的,那么服务节点便会正常响应, 对应的依赖的服务也会正常运行,一切看起来都很美好。

2401_84411522的博客 747

Simulink仿真模块-Signal Generator

Signal Generator:生成各种波形 所在的位置库为:Simulink / Sources 模型为: 说明 Signal Generator模块可以产生四种不同波形: 正弦波 方波 锯齿波 随机 可以使用 hertz 或 rad/sec 为单位表示信号参数。双击模型可以选择需要生成的波形,如图所示: 使用默认参数值,可以获得下列波形之一: 波形 波形输出 正弦波 ...

jk_101的博客 2655

【序列晋升】24 Spring Cloud Netflix 微服务架构的基石与演变

Spring Cloud Netflix 是微服务领域的重要技术栈,曾作为Spring Cloud生态的核心组件,为Java开发者提供了构建分布式系统的完整解决方案。它整合了Netflix开源的多个微服务组件,包括服务注册中心Eureka、客户端负载均衡器Ribbon、声明式HTTP客户端Feign、服务网关Zuul以及容错管理工具Hystrix等 。

愚者Turbo的博客 704

华为OD机试 双机位A卷 - 流量波峰 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位A卷 流量波峰,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 1378

用 DCL 编写 DEFINE ROLE:把 ABAP CDS 的访问控制做对、做实、做漂亮

摘要: 本文详细讲解如何在ABAP CDS中使用DCL(数据控制语言)实现行级授权,确保业务数据安全。核心要点包括: DCL原理:通过DEFINE ROLE将访问条件绑定到CDS实体,自动附加到查询条件(类似隐式WHERE),保障授权一致性。 关键语法: 必需注解@MappingRole: true声明映射角色。 ASPECT pfcg_auth关联PFCG权限对象,动态控制访问。 注解@AccessControl.authorizationCheck定义授权检查策略(如#CHECK启用强制控制)。 优先级

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 168

微服务可靠性设计--转

原文地址:http://www.infoq.com/cn/articles/micro-service-reliability-design?utm_source=infoq&utm_medium=popular_widget&utm_campaign=popular_content_list&utm_content=homepage 微服务可靠性设计 ...

228

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Hystrix - 什么是服务熔断?微服务为何需要容错机制

本文介绍了微服务架构中容错机制的重要性,并详细讲解了Hystrix服务熔断的实现原理。文章首先分析了微服务面临的挑战和容错机制的必要性,然后深入解析了Hystrix熔断器的工作原理和状态转换逻辑。通过一个完整的Java代码示例,展示了如何在实际项目中配置和使用Hystrix实现服务熔断功能,包括添加依赖、启用Hystrix、创建模拟服务等步骤。本文为开发者提供了在分布式系统中构建健壮容错机制的实用指南,帮助预防级联故障的发生。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【微服务架构】SpringCloud(五):容错组件 Hystrix

线程池隔离技术,是用 Hystrix 自己的线程去执行调用;而信号量隔离技术,是直接让 tomcat 线程去调用依赖服务。信号量隔离,只是一道关卡,信号量有多少,就允许多少个 tomcat 线程通过它,然后去执行。Hystrix是Netflix开源的一个类库,用于隔离远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。信号量隔离主要维护的是Tomcat的线程,不需要内部线程池,更加轻量级。spring cloud 用的是 hystrix,是一个容错组件。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Hystrix的原理及应用:构建微服务容错体系的利器(一)

Hystrix是一个用于处理分布式系统中的故障和延迟的开源库。它由Netflix开发并开源,最早用于处理Netflix的视频流服务中的故障保护。Hystrix的起源可以追溯到Netflix在2011年左右遭受了一次大规模的服务故障。这次故障暴露了Netflix服务之间的依赖性和相互影响,导致了整个系统的崩溃。为了避免类似的故障再次发生,Netflix决定开发一个能够处理分布式系统中的故障和延迟的解决方案,这就是Hystrix。

凛鼕将至的博客 1863
上一篇: 日调用量超三十万亿,腾讯开源百万级服务发现和治理中心北极星
下一篇: 淘宝直播全屏页重排算法实践
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值