hystrix(6) 命令执行
上一节中讲到了HystrixCommand有四种执行方法,这一节就来讲一下这四种方法直接的关系以及他们的实现。
execute方法使用同步方式获取结果,本质是调用了queue方法获取了一个Future,然后通过该Future获取返回结果。
public R execute() {
try {
return queue().get();
} catch (Exception e) {
throw Exceptions.sneakyThrow(decomposeException(e));
}
}
queue方法通过异步方式活动结果,本质是通过toObservable方法获取了一个Observable,然后通过该Observable获得一个Future
public Future<R> queue() {
...
final Future<R> delegate = toObservable().toBlocking().toFuture();
...
};
observe方法通过Observable实现异步,并且该Observable无论在任何时候监听,都可以接收到所有消息。本质是使用了一个ReplaySubject监听toObservable返回的Observable,然后再返回该ReplaySubject。
public Observable<R> observe() {
ReplaySubject<R> subject = ReplaySubject.create();
final Subscription sourceSubscription = toObservable().subscribe(subject);
...
return subject.doOnUnsubscribe(new Action0() {
@Override
public void call() {
sourceSubscription.unsubscribe();
}
});
}
toObservable方法Observable实现异步,在Observable被监听时执行。本质是创建一个Observable,当这个Observable被监听时,执行run命令,并返回消息。
public Observable<R> toObservable() {
...
return Observable.defer(new Func0<Observable<R>>() {
@Override
public Observable<R> call() {
...
Observable<R> hystrixObservable =
Observable.defer(applyHystrixSemantics) //会调用run方法
.map(wrapWithAllOnNextHooks);
...
}
});
}
命令执行流程:
命令执行流程主要包含一下内容:
1.熔断器判断
2.各个阶段HystrixCommandExecutionHook调用。
3.各个阶段
4.发送metrics消息
执行流程:
1.执行HystrixCommandExecutionHook的onStart。
2.通过熔断器判断服务是否熔断
3.如果没有熔断
3.1如果是SEMAPHORE模式
3.1.1 判断是否到达指定并发量,如果不是进入
3.1.1.1 向metrics发送执行开始消息。
3.1.1.2执行HystrixCommandExecutionHook的onRunStart、onExecutionStart方法
3.1.1.3执行run方法,并把执行结果返回Observable。
3.1.1.4监听Observable执行结果消息,如果返回消息是success、error、emit执行HystrixCommandExecutionHook相应方法。
3.1.3 [handleSemaphoreRejectionViaFallback]
3.2如果是THREAD模式
3.2.1 向metrics发送执行开始消息。
3.2.2 向metrics发送线程池执行开始消息。
3.2.3 执行HystrixCommandExecutionHook的onThreadStart、onRunStart、onExecutionStart方法
3.2.4 执行run方法,并把执行结果返回Observable。
3.2.5 监听Observable执行结果消息,如果返回消息是success、error、emit执行HystrixCommandExecutionHook相应方法。
3.2.6 如果线程执行过程中,发送TERMINAL,UNSUBSCRIBED,执行HystrixCommandExecutionHook的onThreadComplete方法,并向metrics发送线程池执行结束消息。
2.3如果timeout检测启动,则启动定时器判断timeout检测。
4.如果熔断[handleShortCircuitViaFallback]
命令执行状态
hystrix命令执行过程中有以下状态,hystrix命令的状态是不可逆的,每个hystrix命令只能使用一次:
1. 初始状态(NOT_STARTED)。
2.创建(OBSERVABLE_CHAIN_CREATED),toObservable开始执行后变为OBSERVABLE_CHAIN_CREATED状态
3.用户代码执行( USER_CODE_EXECUTED),用户调用开始执行前变为USER_CODE_EXECUTED
4.UNSUBSCRIBED,
5.TERMINAL
hystrix命令执行过程中线程有一下状态:
1. 初始状态(NOT_USING_THREAD)。
2.开始(STARTED),通过线程池方式执行命令前变为STARTED。
3.UNSUBSCRIBED,
4.TERMINAL
hystrix(6) 命令执行的更多相关文章
- saltstack命令执行过程
saltstack命令执行过程 具体步骤如下 Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc salt ...
- HFS远程命令执行漏洞入侵抓鸡黑阔服务器
先来科普一下: HFS是什么? hfs网络文件服务器 2.3是专为个人用户所设计的HTTP档案系统,如果您觉得架设FTP Server太麻烦,那么这个软件可以提供您更方便的网络文件传输系统,下载后无须 ...
- ping命令执行过程详解
[TOC] ping命令执行过程详解 机器A ping 机器B 同一网段 ping通知系统建立一个固定格式的ICMP请求数据包 ICMP协议打包这个数据包和机器B的IP地址转交给IP协议层(一组后台运 ...
- 【MongoDB】6.关于MongoDB存储文件的 命令执行+代码执行
参考:http://www.runoob.com/mongodb/mongodb-gridfs.html 1.命令执行 MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSO ...
- SQL Server数据库备份:通过Windows批处理命令执行
通过Windows批处理命令执行SQL Server数据库备份 建立mybackup.bat ,输入以下内容直接运行该脚本,即可开始自动备份数据库也可把该脚本加入windows任务计划里执行. --- ...
- 图解“管道过滤器模式”应用实例:SOD框架的命令执行管道
管道和过滤器 管道和过滤器是八种体系结构模式之一,这八种体系结构模式是:层.管道和过滤器.黑板.代理者.模型-视图-控制器(MVC) 表示-抽象-控制(PAC).微核.映像. 管道和过滤器适用于需要渐 ...
- "Java 反序列化"过程远程命令执行漏洞
一.漏洞描述 国外 FoxGlove 安全研究团队于2015年11月06日在其博客上公开了一篇关于常见 Java 应用如何利用反序列化操作进行远程命令执行的文章.原博文所提到的 Java 应用都使 ...
- ASP代码审计 -4.命令执行漏洞总结
命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip" ...
- Linux:命令执行顺序控制与管道
命令执行顺序控制与管道 顺序执行 简单的顺序命令可以使用符号";"完成,如:sudo apt-get update;sudo apt-get install some-tool;s ...
随机推荐
- unity探索者之微信分享回调
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7574561.html 上一遍讲了微信分享的一些坑,然后就忘了回调这事儿了,今天补上 ...
- 轻松解除官方对博客后台设置页面3段html代码的限制:iframe alert flagcounter etc.的禁用
今天我发现我的flagcounter不能用了 iframe也不能用了,无奈╮(╯_╰)╭ 第一反应是Ctrl U viewsource看看源码出了什么问题 结果竟然是这样, 因为页首和侧边栏的html ...
- golang IPv6 转 十进制
IPv4 互换: package main import ( "fmt" "math/big" "net" ) func InetNtoA( ...
- 兄弟,你爬虫基础这么好,需要研究js逆向了,一起吧(有完整JS代码)
这几天的确有空了,看更新多快,专门研究了一下几个网站登录中密码加密方法,比起滑块验证码来说都相对简单,适合新手js逆向入门,大家可以自己试一下,试不出来了再参考我的js代码.篇幅有限,完整的js代码在 ...
- MySQL 索引结构
谈到 MYSQL 索引服务端的同学应该是熟悉的不能再熟悉,新建表的时候怎么着都知道先来个主键索引,对于经常查询的列也会加个索引加快查询速度.那么 MYSQL 索引都有哪些类型呢?索引结构是什么样的呢? ...
- foreach循環體控制
通常情況下,在程式中的cursor定義之前,整合了l_sql變量后,轉化sql語句時,通過檢查STATUS的值來判斷sql語句是否有錯誤. 語句如: if STATUS th ...
- LG P6788 「EZEC-3」四月樱花
Description 在樱花盛开的四月,Muxii 望着满天飘落的樱花,向身旁的 ZZH 问道: “究竟有多少朵樱花在这个四月飘落?” ZZH 答道:“樱花飘落的朵数 $s$与时间 $t$ 有如下 ...
- Xposed+X5使用
1.Xposed 2.X5
- centos6.8上安装部署 jhipster-registry
必备环境:jdk8,git,maven 1.安装nodejs #由于采用编译的方式很容易出现一些意外的惊喜,所以我们这儿直接用yum命令安装 #1.查看nodejs版本(命令中不要加 -y 如果版本不 ...
- 百度统计可以查看用户IP
http://www.wocaoseo.com/thread-123-1-1.html 本文来源于百度官方报道,据悉百度统计披露了访客IP地址,小编乐不可支.比起之前欲说还休的访客标识码,百度统计这次 ...