首页 > 其他分享 >4、深入分析hystrix执行时的8大流程步骤以及内部原理

4、深入分析hystrix执行时的8大流程步骤以及内部原理

时间:2023-05-26 18:34:06浏览次数:41  
标签:返回 Observable 调用 hystrix 步骤 command 深入分析 执行 HystrixCommand

前面了解了 Hystrix 最基本的支持高可用的技术:资源隔离 + 限流。

  • 创建 command;
  • 执行这个 command;
  • 配置这个 command 对应的 group 和线程池。

开始执行这个 command,调用了这个 command 的 execute() 方法之后,Hystrix 底层的执行流程和步骤以及原理是什么

1、构建一个HystrixCommand或者HystrixObservableCommand

一个HystrixCommand或一个HystrixObservableCommand对象,代表了对某个依赖服务发起的一次请求或者调用

构造的时候,可以在构造函数中传入任何需要的参数

HystrixCommand主要用于仅仅会返回一个结果的调用
HystrixObservableCommand主要用于可能会返回多条结果的调用

HystrixCommand command = new HystrixCommand(arg1, arg2);
HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2);

2、调用command的执行方法

执行Command就可以发起一次对依赖服务的调用

要执行Command,需要在4个方法中选择其中的一个:execute(),queue(),observe(),toObservable()

其中execute()和queue()仅仅对HystrixCommand适用

execute():调用后直接block住,属于同步调用,直到依赖服务返回单条结果,或者抛出异常
queue():返回一个Future,属于异步调用,后面可以通过Future获取单条结果
observe():订阅一个Observable对象,Observable代表的是依赖服务返回的结果,获取到一个那个代表结果的Observable对象的拷贝对象
toObservable():返回一个Observable对象,如果我们订阅这个对象,就会执行command并且获取返回结果

K value = command.execute();
Future<K> fValue = command.queue();
Observable<K> ohValue = command.observe();
Observable<K> ocValue = command.toObservable();

execute()实际上会调用queue().get().queue(),接着会调用toObservable().toBlocking().toFuture()

也就是说,无论是哪种执行command的方式,最终都是依赖toObservable()去执行的

3、检查是否开启缓存

从这一步开始,进入我们的底层的运行原理啦,了解hysrix的一些更加高级的功能和特性

如果这个command开启了请求缓存,request cache,而且这个调用的结果在缓存中存在,那么直接从缓存中返回结果

4、检查是否开启了短路器

检查这个command对应的依赖服务是否开启了短路器

如果断路器被打开了,那么hystrix就不会执行这个command,而是直接去执行fallback降级机制

5、检查线程池/队列/semaphore是否已经满了

如果command对应的线程池/队列/semaphore已经满了,那么也不会执行command,而是直接去调用fallback降级机制

6、执行command

调用HystrixObservableCommand.construct()或HystrixCommand.run()来实际执行这个command

HystrixCommand.run()是返回一个单条结果,或者抛出一个异常
HystrixObservableCommand.construct()是返回一个Observable对象,可以获取多条结果

如果HystrixCommand.run()或HystrixObservableCommand.construct()的执行,超过了timeout时长的话,那么command所在的线程就会抛出一个TimeoutException

如果timeout了,也会去执行fallback降级机制,而且就不会管run()或construct()返回的值了

这里要注意的一点是,我们是不可能终止掉一个调用严重延迟的依赖服务的线程的,只能说给你抛出来一个TimeoutException,但是还是可能会因为严重延迟的调用线程占满整个线程池的

即使这个时候新来的流量都被限流了。。。

如果没有timeout的话,那么就会拿到一些调用依赖服务获取到的结果,然后hystrix会做一些logging记录和metric统计

7、短路健康检查

Hystrix会将每一个依赖服务的调用成功,失败,拒绝,超时,等事件,都会发送给circuit breaker断路器

短路器就会对调用成功/失败/拒绝/超时等事件的次数进行统计

短路器会根据这些统计次数来决定,是否要进行短路,如果打开了短路器,那么在一段时间内就会直接短路,然后如果在之后第一次检查发现调用成功了,就关闭断路器

8、调用fallback降级机制

在以下几种情况中,hystrix会调用fallback降级机制:run()或construct()抛出一个异常,短路器打开,线程池/队列/semaphore满了,command执行超时了

一般在降级机制中,都建议给出一些默认的返回值,比如静态的一些代码逻辑,或者从内存中的缓存中提取一些数据,尽量在这里不要再进行网络请求了

即使在降级中,一定要进行网络调用,也应该将那个调用放在一个HystrixCommand中,进行隔离

在HystrixCommand中,上线getFallback()方法,可以提供降级机制

在HystirxObservableCommand中,实现一个resumeWithFallback()方法,返回一个Observable对象,可以提供降级结果

如果fallback返回了结果,那么hystrix就会返回这个结果

对于HystrixCommand,会返回一个Observable对象,其中会发返回对应的结果
对于HystrixObservableCommand,会返回一个原始的Observable对象

如果没有实现fallback,或者是fallback抛出了异常,Hystrix会返回一个Observable,但是不会返回任何数据

不同的command执行方式,其fallback为空或者异常时的返回结果不同

对于execute(),直接抛出异常
对于queue(),返回一个Future,调用get()时抛出异常
对于observe(),返回一个Observable对象,但是调用subscribe()方法订阅它时,理解抛出调用者的onError方法
对于toObservable(),返回一个Observable对象,但是调用subscribe()方法订阅它时,理解抛出调用者的onError方法

9、不同的执行方式

execute(),获取一个Future.get(),然后拿到单个结果
queue(),返回一个Future
observer(),立即订阅Observable,然后启动8大执行步骤,返回一个拷贝的Observable,订阅时理解回调给你结果
toObservable(),返回一个原始的Observable,必须手动订阅才会去执行8大步骤

标签:返回,Observable,调用,hystrix,步骤,command,深入分析,执行,HystrixCommand
From: https://www.cnblogs.com/huigui-mint/p/17435533.html

相关文章

  • 3、Hystrix 隔离策略细粒度控制
    Hystrix实现资源隔离,有两种策略:线程池隔离信号量隔离对资源隔离这一块东西,其实可以做一定细粒度的一些控制。1、execution.isolation.strategy指定了HystrixCommand.run()的资源隔离策略,THREAD或者SEMAPHORE,一种是基于线程池,一种是信号量线程池机制,每个command运行在一......
  • 优化振弦读数模块开发的几个步骤
    优化振弦读数模块开发的几个步骤 要优化振弦读数模块的开发,可以考虑以下几点:1.选用合适的硬件设备:选择合适的传感器和芯片,以确保数据的准确性和稳定性。2.优化数据采集:采用合适的采集算法并进行优化,以确保数据的精度和稳定性。3.提高模块的可靠性:在设计模块时,考虑到环境......
  • JMeter04-性能测试流程之准备步骤
    性能测试流程性能需求分析测试人员需要与需求人员(客户)、领导及项目相关人员进行沟通,同时收集各种项目资料,对系统进行分析,确认测试的意图;确认客户对性能的态度;重点关注的性能指标。某系统需求中性能部分的说明如下要掌握哪些性能测试需求系统响应时间要求每秒完成的业......
  • Linux挂载iso文件步骤
    1.确认ios文件路径,我的iso文件在"/ext/bak/"路径下 2.设置将来需要挂载的路径该路径在"/mnt/rheliso/"路径下,如果没有此路径,可以自己建立该文件夹3.通过以下命令实现挂载mount-tiso9660-oloop/ext/bak/rhelxxx.iso/mnt/rheliso/-tiso9660是指定挂载格式。-oloop表......
  • 【Node】node.js安装与配置(详细步骤)
    node.js安装与配置(详细步骤)一、安装Node.js1.1下载1.2安装1.3环境变量二、验证是否安装成功三、修改模块下载位置3.1查看npm默认存放位置3.2在nodejs安装目录下,创建“node_global”和“node_cache”两个文件夹3.3修改默认文件夹3.4测试默认位置是否更改成功四、设置......
  • 【Git用法】如何将本地项目上传到码云,只需这几步,每个步骤都有图文
    想要往码云里上传一个项目文件,首先,我们需要的工具有:①gitshell(用来敲git指令)②你自己的码云账号第一步,要注册一个码云账号,很简单,不过多复述,注册成功后登录,接下来进行第二步;第二步,点击右上方的加号中“新建项目”一项然后填写基本信息,点击创建即可第三步,安装gitshell(我的是安装Git......
  • 边缘计算AI硬件智能分析网关V1版的接入流程与使用步骤
    我们的AI边缘计算网关硬件——智能分析网关目前有两个版本:V1版与V2版,两个版本都能实现对监控视频的智能识别和分析,支持抓拍、记录、告警等,在AI算法的种类上和视频接入上,两个版本存在些许的区别。V1的基础算法有人体检测、区域入侵检测、戴口罩识别、安全帽识别;V2目前有15种算法,包括......
  • Hystrix(服务熔断)+Feign和FallbackFactory(服务降级)
    分布式系统面临的服务雪崩问题当用户发起请求时,假设处理请求的服务器1运行时需要调用到服务器2,服务器2运行时需要调用到服务器3,而如果服务器2因为某些原因始终不能正常调用到服务器3,这时候后面其他用户的请求也都会阻塞在服务器1,在并发量极大的情况下容易导致多个服务器崩溃已经......
  • 入门指南:学习C++编程的关键步骤
    C++是一种功能强大的编程语言,广泛应用于软件开发和系统编程。如果您想学习C++编程,下面是一些关键的步骤,可以帮助您入门。安装C++编译器要开始学习C++,您需要安装一个C++编译器。常用的C++编译器有GCC、Clang和MicrosoftVisualC++等。您可以根据自己的操作系统选择适合的编译器,并......
  • JWT加签从密钥库获取密钥对完成对JWT的签名,密钥库生成步骤
    ​ 最近再用jwt生成token,记录一下使用jdk生成秘钥库步骤,方便之后查询使用1、生成密钥库脚本命令(在本地jdk目录bin目录下,窗口路径输入cmd会车)keytool-genkey-aliasjwt-keyalgRSA-keypass123456-keystorejwt.jks-storepass123456参数说明:-alias别名-keyalg密......