日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hystrix 源码 线程池隔离_基于hystrix的线程池隔离

發(fā)布時(shí)間:2025/3/21 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hystrix 源码 线程池隔离_基于hystrix的线程池隔离 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

hystrix進(jìn)行資源隔離,其實(shí)是提供了一個(gè)抽象,叫做command,就是說,你如果要把對(duì)某一個(gè)依賴服務(wù)的所有調(diào)用請(qǐng)求,全部隔離在同一份資源池內(nèi)

對(duì)這個(gè)依賴服務(wù)的所有調(diào)用請(qǐng)求,全部走這個(gè)資源池內(nèi)的資源,不會(huì)去用其他的資源了,這個(gè)就叫做資源隔離

hystrix最最基本的資源隔離的技術(shù),線程池隔離技術(shù)

對(duì)某一個(gè)依賴服務(wù),商品服務(wù),所有的調(diào)用請(qǐng)求,全部隔離到一個(gè)線程池內(nèi),對(duì)商品服務(wù)的每次調(diào)用請(qǐng)求都封裝在一個(gè)command里面

每個(gè)command(每次服務(wù)調(diào)用請(qǐng)求)都是使用線程池內(nèi)的一個(gè)線程去執(zhí)行的

所以哪怕是對(duì)這個(gè)依賴服務(wù),商品服務(wù),現(xiàn)在同時(shí)發(fā)起的調(diào)用量已經(jīng)到了1000了,但是線程池內(nèi)就10個(gè)線程,最多就只會(huì)用這10個(gè)線程去執(zhí)行

不會(huì)說,對(duì)商品服務(wù)的請(qǐng)求,因?yàn)榻涌谡{(diào)用延遲,將tomcat內(nèi)部所有的線程資源全部耗盡,不會(huì)出現(xiàn)了

1.pox

com.netflix.hystrix

hystrix-core

1.5.12

import rx.Observable;

import rx.Subscriber;

import rx.schedulers.Schedulers;

import com.alibaba.fastjson.JSONObject;

import com.netflix.hystrix.HystrixCommandGroupKey;

import com.netflix.hystrix.HystrixObservableCommand;

import com.roncoo.eshop.cache.ha.http.HttpClientUtils;

import com.roncoo.eshop.cache.ha.model.ProductInfo;

public class GetProductInfosCommand extends HystrixObservableCommand {

private String[] productIds;

public GetProductInfosCommand(String[] productIds) {

super(HystrixCommandGroupKey.Factory.asKey("GetProductInfoGroup"));

this.productIds = productIds;

}

@Override

protected Observable construct() {

return Observable.create(new Observable.OnSubscribe() {

public void call(Subscriber super ProductInfo> observer) {

try {

for(String productId : productIds) {

String url = "http://127.0.0.1:8082/getProductInfo?productId=" + productId;

String response = HttpClientUtils.sendGetRequest(url);

ProductInfo productInfo = JSONObject.parseObject(response, ProductInfo.class);

observer.onNext(productInfo);

}

observer.onCompleted();

} catch (Exception e) {

observer.onError(e);

}

}

}).subscribeOn(Schedulers.io());

}

}

import com.alibaba.fastjson.JSONObject;

import com.netflix.hystrix.HystrixCommand;

import com.netflix.hystrix.HystrixCommandGroupKey;

import com.roncoo.eshop.cache.ha.http.HttpClientUtils;

import com.roncoo.eshop.cache.ha.model.ProductInfo;

public class GetProductInfoCommand extends HystrixCommand {

private Long productId;

public GetProductInfoCommand(Long productId) {

super(HystrixCommandGroupKey.Factory.asKey("GetProductInfoGroup"));

this.productId = productId;

}

@Override

protected ProductInfo run() throws Exception {

String url = "http://127.0.0.1:8082/getProductInfo?productId=" + productId;

String response = HttpClientUtils.sendGetRequest(url);

return JSONObject.parseObject(response, ProductInfo.class);

}

}

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import rx.Observable;

import rx.Observer;

import com.netflix.hystrix.HystrixCommand;

import com.netflix.hystrix.HystrixObservableCommand;

import com.roncoo.eshop.cache.ha.http.HttpClientUtils;

import com.roncoo.eshop.cache.ha.hystrix.command.GetProductInfoCommand;

import com.roncoo.eshop.cache.ha.hystrix.command.GetProductInfosCommand;

import com.roncoo.eshop.cache.ha.model.ProductInfo;

@Controller

public class CacheController {

@RequestMapping("/change/product")

@ResponseBody

public String changeProduct(Long productId) {

// 拿到一個(gè)商品id

// 調(diào)用商品服務(wù)的接口,獲取商品id對(duì)應(yīng)的商品的最新數(shù)據(jù)

// 用HttpClient去調(diào)用商品服務(wù)的http接口

String url = "http://127.0.0.1:8082/getProductInfo?productId=" + productId;

String response = HttpClientUtils.sendGetRequest(url);

//Future future = getProductInfoCommand.queue();

//try {

//Thread.sleep(1000);

//System.out.println(future.get());

//} catch (Exception e) {

//e.printStackTrace();

//}

System.out.println(response);

return "success";

}

/**

* nginx開始,各級(jí)緩存都失效了,nginx發(fā)送很多的請(qǐng)求直接到緩存服務(wù)要求拉取最原始的數(shù)據(jù)

*

* @param productId

* @return

*/

@RequestMapping("/getProductInfo")

@ResponseBody

public String getProductInfo(Long productId) {

// 拿到一個(gè)商品id

// 調(diào)用商品服務(wù)的接口,獲取商品id對(duì)應(yīng)的商品的最新數(shù)據(jù)

// 用HttpClient去調(diào)用商品服務(wù)的http接口

HystrixCommand getProductInfoCommand = new GetProductInfoCommand(productId);

ProductInfo productInfo = getProductInfoCommand.execute();

System.out.println(productInfo);

return "success";

}

/**

* 一次性批量查詢多條商品數(shù)據(jù)的請(qǐng)求

*/

@RequestMapping("/getProductInfos")

@ResponseBody

public String getProductInfos(String productIds) {

HystrixObservableCommand getProductInfosCommand =

new GetProductInfosCommand(productIds.split(","));

Observable observable = getProductInfosCommand.observe();

//observable = getProductInfosCommand.toObservable(); // 還沒有執(zhí)行

observable.subscribe(new Observer() { // 等到調(diào)用subscribe然后才會(huì)執(zhí)行

public void onCompleted() {

System.out.println("獲取完了所有的商品數(shù)據(jù)");

}

public void onError(Throwable e) {

e.printStackTrace();

}

public void onNext(ProductInfo productInfo) {

System.out.println(productInfo);

}

});

return "success";

}

}

command的四種調(diào)用方式

同步:new CommandHelloWorld("World").execute(),new ObservableCommandHelloWorld("World").toBlocking().toFuture().get()

如果你認(rèn)為observable command只會(huì)返回一條數(shù)據(jù),那么可以調(diào)用上面的模式,去同步執(zhí)行,返回一條數(shù)據(jù)

異步:new CommandHelloWorld("World").queue(),new ObservableCommandHelloWorld("World").toBlocking().toFuture()

對(duì)command調(diào)用queue(),僅僅將command放入線程池的一個(gè)等待隊(duì)列,就立即返回,拿到一個(gè)Future對(duì)象,后面可以做一些其他的事情,然后過一段時(shí)間對(duì)future調(diào)用get()方法獲取數(shù)據(jù)。

1.線程池隔離技術(shù)與信號(hào)量隔離技術(shù)的區(qū)別

hystrix里面,核心的一項(xiàng)功能,其實(shí)就是所謂的資源隔離,要解決的最最核心的問題,就是將多個(gè)依賴服務(wù)的調(diào)用分別隔離到各自自己的資源池內(nèi)

避免說對(duì)某一個(gè)依賴服務(wù)的調(diào)用,因?yàn)橐蕾嚪?wù)的接口調(diào)用的延遲或者失敗,導(dǎo)致服務(wù)所有的線程資源全部耗費(fèi)在這個(gè)服務(wù)的接口調(diào)用上

一旦說某個(gè)服務(wù)的線程資源全部耗盡的話,可能就導(dǎo)致服務(wù)就會(huì)崩潰,甚至說這種故障會(huì)不斷蔓延

hystrix,資源隔離,兩種技術(shù),線程池的資源隔離,信號(hào)量的資源隔離

信號(hào)量,semaphore

信號(hào)量:適合,你的訪問不是對(duì)外部依賴的訪問,而是對(duì)內(nèi)部的一些比較復(fù)雜的業(yè)務(wù)邏輯的訪問,但是像這種訪問,系統(tǒng)內(nèi)部的代碼,其實(shí)不涉及任何的網(wǎng)絡(luò)請(qǐng)求,

那么只要做信號(hào)量的普通限流就可以了,因?yàn)椴恍枰ゲ东@timeout類似的問題,算法+數(shù)據(jù)結(jié)構(gòu)的效率不是太高,

并發(fā)量突然太高,因?yàn)檫@里稍微耗時(shí)一些,導(dǎo)致很多線程卡在這里的話,不太好,

所以進(jìn)行一個(gè)基本的資源隔離和訪問,避免內(nèi)部復(fù)雜的低效率的代碼,導(dǎo)致大量的線程被卡住。

一般我們?cè)讷@取到商品數(shù)據(jù)之后,都要去獲取商品是屬于哪個(gè)地理位置,省,市,賣家的,可能在自己的純內(nèi)存中,比如就一個(gè)Map去獲取

對(duì)于這種直接訪問本地內(nèi)存的邏輯,比較適合用信號(hào)量做一下簡(jiǎn)單的隔離

優(yōu)點(diǎn)在于,不用自己管理線程池,不用care timeout超時(shí)了,信號(hào)量做隔離的話,性能會(huì)相對(duì)來說高一些。

import com.netflix.hystrix.HystrixCommand;

import com.netflix.hystrix.HystrixCommandGroupKey;

import com.netflix.hystrix.HystrixCommandProperties;

import com.netflix.hystrix.HystrixCommandProperties.ExecutionIsolationStrategy;

import com.roncoo.eshop.cache.ha.local.LocationCache;

public class GetCityNameCommand extends HystrixCommand {

private Long cityId;

public GetCityNameCommand(Long cityId){

super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GetCityNameGroup"))

.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()

.withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)));

this.cityId = cityId;

}

@Override

protected String run() throws Exception {

return LocationCache.getCityName(cityId);

}

}

execution.isolation.strategy:

指定了HystrixCommand.run()的資源隔離策略,THREAD或者SEMAPHORE,一種是基于線程池,一種是信號(hào)量

線程池機(jī)制,每個(gè)command運(yùn)行在一個(gè)線程中,限流是通過線程池的大小來控制的

信號(hào)量機(jī)制,command是運(yùn)行在調(diào)用線程中,但是通過信號(hào)量的容量來進(jìn)行限流

如何在線程池和信號(hào)量之間做選擇?

默認(rèn)的策略就是線程池

而使用信號(hào)量的場(chǎng)景,通常是針對(duì)超大并發(fā)量的場(chǎng)景下,每個(gè)服務(wù)實(shí)例每秒都幾百的QPS,那么此時(shí)你用線程池的話,線程一般不會(huì)太多,

可能撐不住那么高的并發(fā),如果要撐住,可能要耗費(fèi)大量的線程資源,那么就是用信號(hào)量,來進(jìn)行限流保護(hù)

一般用信號(hào)量常見于那種基于純內(nèi)存的一些業(yè)務(wù)邏輯服務(wù),而不涉及到任何網(wǎng)絡(luò)訪問請(qǐng)求

netflix有100+的command運(yùn)行在40+的線程池中,只有少數(shù)command是不運(yùn)行在線程池中的,就是從純內(nèi)存中獲取一些元數(shù)據(jù),或者是對(duì)多個(gè)command包裝起來的facacde command,是用信號(hào)量限流的.

// to use thread isolation

HystrixCommandProperties.Setter()

.withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD)

// to use semaphore isolation

HystrixCommandProperties.Setter()

.withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)

2、command名稱和command組

每個(gè)command,都可以設(shè)置一個(gè)自己的名稱,同時(shí)可以設(shè)置一個(gè)自己的組.

command group,是一個(gè)非常重要的概念,默認(rèn)情況下,因?yàn)榫褪峭ㄟ^command group來定義一個(gè)線程池的,而且還會(huì)通過command group來聚合一些監(jiān)控和報(bào)警信息

同一個(gè)command group中的請(qǐng)求,都會(huì)進(jìn)入同一個(gè)線程池中

3、command線程池

threadpool key代表了一個(gè)HystrixThreadPool,用來進(jìn)行統(tǒng)一監(jiān)控,統(tǒng)計(jì),緩存

默認(rèn)的threadpool key就是command group名稱

每個(gè)command都會(huì)跟它的threadpool key對(duì)應(yīng)的thread pool綁定在一起

如果不想直接用command group,也可以手動(dòng)設(shè)置thread pool name

public CommandHelloWorld(String name) {

super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))

.andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"))

.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("HelloWorldPool")));

this.name = name;

}

command threadpool -> command group -> command key

command key,代表了一類command,一般來說,代表了底層的依賴服務(wù)的一個(gè)接口

command group,代表了某一個(gè)底層的依賴服務(wù),合理,一個(gè)依賴服務(wù)可能會(huì)暴露出來多個(gè)接口,每個(gè)接口就是一個(gè)command key

command group,在邏輯上去組織起來一堆command key的調(diào)用,統(tǒng)計(jì)信息,成功次數(shù),timeout超時(shí)次數(shù),失敗次數(shù),可以看到某一個(gè)服務(wù)整體的一些訪問情況

command group,一般來說,推薦是根據(jù)一個(gè)服務(wù)去劃分出一個(gè)線程池,command key默認(rèn)都是屬于同一個(gè)線程池的

command group,對(duì)應(yīng)了一個(gè)服務(wù),但是這個(gè)服務(wù)暴露出來的幾個(gè)接口,訪問量很不一樣,差異非常之大

你可能就希望在這個(gè)服務(wù)command group內(nèi)部,包含的對(duì)應(yīng)多個(gè)接口的command key,做一些細(xì)粒度的資源隔離

對(duì)同一個(gè)服務(wù)的不同接口,都使用不同的線程池.

邏輯上來說,多個(gè)command key屬于一個(gè)command group,在做統(tǒng)計(jì)的時(shí)候,會(huì)放在一起統(tǒng)計(jì)

每個(gè)command key有自己的線程池,每個(gè)接口有自己的線程池,去做資源隔離和限流

但是對(duì)于thread pool資源隔離來說,可能是希望能夠拆分的更加一致一些,比如在一個(gè)功能模塊內(nèi),對(duì)不同的請(qǐng)求可以使用不同的thread pool

command group一般來說,可以是對(duì)應(yīng)一個(gè)服務(wù),多個(gè)command key對(duì)應(yīng)這個(gè)服務(wù)的多個(gè)接口,多個(gè)接口的調(diào)用共享同一個(gè)線程池

如果說你的command key,要用自己的線程池,可以定義自己的threadpool key.

4、coreSize

設(shè)置線程池的大小,默認(rèn)是10

HystrixThreadPoolProperties.Setter()

.withCoreSize(int value)

一般來說,用這個(gè)默認(rèn)的10個(gè)線程大小就夠了

5、queueSizeRejectionThreshold

控制queue滿后reject的threshold,因?yàn)閙axQueueSize不允許熱修改,因此提供這個(gè)參數(shù)可以熱修改,控制隊(duì)列的最大大小

HystrixCommand在提交到線程池之前,其實(shí)會(huì)先進(jìn)入一個(gè)隊(duì)列中,這個(gè)隊(duì)列滿了之后,才會(huì)reject

默認(rèn)值是5

HystrixThreadPoolProperties.Setter()

.withQueueSizeRejectionThreshold(int value)

6、execution.isolation.semaphore.maxConcurrentRequests

設(shè)置使用SEMAPHORE隔離策略的時(shí)候,允許訪問的最大并發(fā)量,超過這個(gè)最大并發(fā)量,請(qǐng)求直接被reject

這個(gè)并發(fā)量的設(shè)置,跟線程池大小的設(shè)置,應(yīng)該是類似的,但是基于信號(hào)量的話,性能會(huì)好很多,而且hystrix框架本身的開銷會(huì)小很多

默認(rèn)值是10,設(shè)置的小一些,否則因?yàn)樾盘?hào)量是基于調(diào)用線程去執(zhí)行command的,而且不能從timeout中抽離,因此一旦設(shè)置的太大,而且有延時(shí)發(fā)生,可能瞬間導(dǎo)致tomcat本身的線程資源本占滿

HystrixCommandProperties.Setter()

.withExecutionIsolationSemaphoreMaxConcurrentRequests(int value)

創(chuàng)建command,執(zhí)行這個(gè)command,配置這個(gè)command對(duì)應(yīng)的group和線程池,以及線程池/信號(hào)量的容量和大小

畫圖分析整個(gè)8大步驟的流程,然后再對(duì)每個(gè)步驟進(jìn)行細(xì)致的講解

1、構(gòu)建一個(gè)HystrixCommand或者HystrixObservableCommand

一個(gè)HystrixCommand或一個(gè)HystrixObservableCommand對(duì)象,代表了對(duì)某個(gè)依賴服務(wù)發(fā)起的一次請(qǐng)求或者調(diào)用

構(gòu)造的時(shí)候,可以在構(gòu)造函數(shù)中傳入任何需要的參數(shù)

HystrixCommand主要用于僅僅會(huì)返回一個(gè)結(jié)果的調(diào)用

HystrixObservableCommand主要用于可能會(huì)返回多條結(jié)果的調(diào)用

HystrixCommand command = new HystrixCommand(arg1, arg2);

HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2);

2、調(diào)用command的執(zhí)行方法

執(zhí)行Command就可以發(fā)起一次對(duì)依賴服務(wù)的調(diào)用

要執(zhí)行Command,需要在4個(gè)方法中選擇其中的一個(gè):execute(),queue(),observe(),toObservable()

其中execute()和queue()僅僅對(duì)HystrixCommand適用

execute():調(diào)用后直接block住,屬于同步調(diào)用,直到依賴服務(wù)返回單條結(jié)果,或者拋出異常

queue():返回一個(gè)Future,屬于異步調(diào)用,后面可以通過Future獲取單條結(jié)果

observe():訂閱一個(gè)Observable對(duì)象,Observable代表的是依賴服務(wù)返回的結(jié)果,獲取到一個(gè)那個(gè)代表結(jié)果的Observable對(duì)象的拷貝對(duì)象

toObservable():返回一個(gè)Observable對(duì)象,如果我們訂閱這個(gè)對(duì)象,就會(huì)執(zhí)行command并且獲取返回結(jié)果

K value = command.execute();

Future fValue = command.queue();

Observable ohValue = command.observe();

Observable ocValue = command.toObservable();

execute()實(shí)際上會(huì)調(diào)用queue().get().queue(),接著會(huì)調(diào)用toObservable().toBlocking().toFuture()

也就是說,無(wú)論是哪種執(zhí)行command的方式,最終都是依賴toObservable()去執(zhí)行的

3、檢查是否開啟緩存

如果這個(gè)command開啟了請(qǐng)求緩存,request cache,而且這個(gè)調(diào)用的結(jié)果在緩存中存在,那么直接從緩存中返回結(jié)果

4、檢查是否開啟了短路器

檢查這個(gè)command對(duì)應(yīng)的依賴服務(wù)是否開啟了短路器

如果斷路器被打開了,那么hystrix就不會(huì)執(zhí)行這個(gè)command,而是直接去執(zhí)行fallback降級(jí)機(jī)制

5、檢查線程池/隊(duì)列/semaphore是否已經(jīng)滿了

如果command對(duì)應(yīng)的線程池/隊(duì)列/semaphore已經(jīng)滿了,那么也不會(huì)執(zhí)行command,而是直接去調(diào)用fallback降級(jí)機(jī)制

6、執(zhí)行command

調(diào)用HystrixObservableCommand.construct()或HystrixCommand.run()來實(shí)際執(zhí)行這個(gè)command

HystrixCommand.run()是返回一個(gè)單條結(jié)果,或者拋出一個(gè)異常

HystrixObservableCommand.construct()是返回一個(gè)Observable對(duì)象,可以獲取多條結(jié)果

如果HystrixCommand.run()或HystrixObservableCommand.construct()的執(zhí)行,超過了timeout時(shí)長(zhǎng)的話,那么command所在的線程就會(huì)拋出一個(gè)TimeoutException

如果timeout了,也會(huì)去執(zhí)行fallback降級(jí)機(jī)制,而且就不會(huì)管run()或construct()返回的值了

這里要注意的一點(diǎn)是,我們是不可能終止掉一個(gè)調(diào)用嚴(yán)重延遲的依賴服務(wù)的線程的,只能說給你拋出來一個(gè)TimeoutException,但是還是可能會(huì)因?yàn)閲?yán)重延遲的調(diào)用線程占滿整個(gè)線程池的

即使這個(gè)時(shí)候新來的流量都被限流了。。。

如果沒有timeout的話,那么就會(huì)拿到一些調(diào)用依賴服務(wù)獲取到的結(jié)果,然后hystrix會(huì)做一些logging記錄和metric統(tǒng)計(jì)

7、短路健康檢查

Hystrix會(huì)將每一個(gè)依賴服務(wù)的調(diào)用成功,失敗,拒絕,超時(shí),等事件,都會(huì)發(fā)送給circuit breaker斷路器

短路器就會(huì)對(duì)調(diào)用成功/失敗/拒絕/超時(shí)等事件的次數(shù)進(jìn)行統(tǒng)計(jì)

短路器會(huì)根據(jù)這些統(tǒng)計(jì)次數(shù)來決定,是否要進(jìn)行短路,如果打開了短路器,那么在一段時(shí)間內(nèi)就會(huì)直接短路,然后如果在之后第一次檢查發(fā)現(xiàn)調(diào)用成功了,就關(guān)閉斷路器

8、調(diào)用fallback降級(jí)機(jī)制

在以下幾種情況中,hystrix會(huì)調(diào)用fallback降級(jí)機(jī)制:run()或construct()拋出一個(gè)異常,短路器打開,線程池/隊(duì)列/semaphore滿了,command執(zhí)行超時(shí)了

一般在降級(jí)機(jī)制中,都建議給出一些默認(rèn)的返回值,比如靜態(tài)的一些代碼邏輯,或者從內(nèi)存中的緩存中提取一些數(shù)據(jù),盡量在這里不要再進(jìn)行網(wǎng)絡(luò)請(qǐng)求了

即使在降級(jí)中,一定要進(jìn)行網(wǎng)絡(luò)調(diào)用,也應(yīng)該將那個(gè)調(diào)用放在一個(gè)HystrixCommand中,進(jìn)行隔離

在HystrixCommand中,上線getFallback()方法,可以提供降級(jí)機(jī)制

在HystirxObservableCommand中,實(shí)現(xiàn)一個(gè)resumeWithFallback()方法,返回一個(gè)Observable對(duì)象,可以提供降級(jí)結(jié)果

如果fallback返回了結(jié)果,那么hystrix就會(huì)返回這個(gè)結(jié)果

對(duì)于HystrixCommand,會(huì)返回一個(gè)Observable對(duì)象,其中會(huì)發(fā)返回對(duì)應(yīng)的結(jié)果

對(duì)于HystrixObservableCommand,會(huì)返回一個(gè)原始的Observable對(duì)象

如果沒有實(shí)現(xiàn)fallback,或者是fallback拋出了異常,Hystrix會(huì)返回一個(gè)Observable,但是不會(huì)返回任何數(shù)據(jù)

不同的command執(zhí)行方式,其fallback為空或者異常時(shí)的返回結(jié)果不同

對(duì)于execute(),直接拋出異常

對(duì)于queue(),返回一個(gè)Future,調(diào)用get()時(shí)拋出異常

對(duì)于observe(),返回一個(gè)Observable對(duì)象,但是調(diào)用subscribe()方法訂閱它時(shí),理解拋出調(diào)用者的onError方法

對(duì)于toObservable(),返回一個(gè)Observable對(duì)象,但是調(diào)用subscribe()方法訂閱它時(shí),理解拋出調(diào)用者的onError方法

9、不同的執(zhí)行方式

execute(),獲取一個(gè)Future.get(),然后拿到單個(gè)結(jié)果

queue(),返回一個(gè)Future

observer(),立即訂閱Observable,然后啟動(dòng)8大執(zhí)行步驟,返回一個(gè)拷貝的Observable,訂閱時(shí)理解回調(diào)給你結(jié)果

toObservable(),返回一個(gè)原始的Observable,必須手動(dòng)訂閱才會(huì)去執(zhí)行8大步驟

總結(jié)

以上是生活随笔為你收集整理的hystrix 源码 线程池隔离_基于hystrix的线程池隔离的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。