Hystrix快速入門(2) Hystrix工作流程

轉(zhuǎn):https://blog.csdn.net/hry2015/article/details/78533758?ref=myread

一. Hystrix的處理流程

image.png
  1. 構(gòu)造HystrixCommand或HystrixObservableCommand對(duì)象
    創(chuàng)建代碼如下
HystrixCommand command = new HystrixCommand(arg1, arg2); 
HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2);
  1. 執(zhí)行Command 命令

共有4種執(zhí)行命令的方法,前2種只支持HystrixCommand ,后2種只支持HystrixObservableCommand

  • execute(): 同步阻塞直至從依賴服務(wù)返回結(jié)果或拋出異常
  • queue(): 異步模式,返回Future,F(xiàn)uture封裝返回的內(nèi)容
  • observe() : 直接訂閱Observable ,此對(duì)象包含了從依賴服務(wù)返回的結(jié)果
  • toObservable() : 返回Observable 對(duì)象,當(dāng)你訂閱他時(shí),它會(huì)執(zhí)行Hystrix命令并返回結(jié)果

HystrixCommand.execute(): 實(shí)際調(diào)用queue()的方法

public R execute() {
   return queue().get();
}

HystrixCommand.queue(): 實(shí)際調(diào)用toObservable()的方法

 public Future<R> queue() {
     final Future<R> delegate = toObservable().toBlocking().toFuture();
      ....
 }

HystrixObservableCommand.observe():實(shí)際調(diào)用toObservable()的方法

public Observable<R> observe() {
....
    final Subscription sourceSubscription = toObservable().subscribe(subject);
....

通過以上的代碼,我們可以知道:第1種是同步阻塞性調(diào)用,第2種是異步非阻塞性調(diào)用,第3、4種是基于發(fā)布-訂閱響應(yīng)式的調(diào)用。雖然是4種調(diào)用方式,其實(shí)際最后都是基于toObservable方法來實(shí)現(xiàn)的

  1. 判斷結(jié)束是否有緩存
    如果請(qǐng)求緩存功能開啟,并且請(qǐng)求在緩存命中,那么返回一個(gè)Observable,此對(duì)象包含請(qǐng)求的結(jié)束

  2. 判斷短路器是否開啟
    在執(zhí)行命令時(shí),Hystrix 如果發(fā)現(xiàn)斷路器跳閘,那么hystix會(huì)跳到步驟8去執(zhí)行回退(fallback)邏輯。如果斷路器沒有跳閘,則繼續(xù)執(zhí)行步驟5

關(guān)于斷路器打開和關(guān)閉的條件見本文的下方。

  1. 判斷線程池/隊(duì)列/信號(hào)資源是否滿了
    如果命令關(guān)聯(lián)的線程池和隊(duì)列(或信號(hào)量)滿了,則不會(huì)執(zhí)行命令,會(huì)跳到步驟8去執(zhí)行回退(fallback)邏輯

  2. 執(zhí)行HystrixObservableCommand.construct()或HystrixCommand.run()

執(zhí)行HystrixCommand.run()或HystrixObservableCommand.construct()時(shí),如果執(zhí)行超時(shí)或者執(zhí)行失敗,則執(zhí)行會(huì)跳到步驟8去執(zhí)行回退(fallback)邏輯;如果正常結(jié)束,Hystrix 會(huì)記錄一些日志和監(jiān)控?cái)?shù)據(jù),并返回處理結(jié)果

  1. Calculate Circuit Health
    Hystrix向斷路器報(bào)告成功、失敗、拒絕和超時(shí)。斷路器維護(hù)一組計(jì)數(shù)器來統(tǒng)計(jì)執(zhí)行數(shù)據(jù)。

  2. 獲取 Fallback邏輯
    當(dāng)發(fā)生如下情況時(shí),Hystrix會(huì)嘗試執(zhí)行回退(fallback)邏輯:

  • 在執(zhí)行時(shí)construct() or run() ,跑出異常 (發(fā)生在步驟6.)
  • 斷路器打開時(shí),命令被斷路 (發(fā)生在步驟4.)
  • 當(dāng)執(zhí)行命令時(shí),依賴的線程池、隊(duì)列或信號(hào)量滿(發(fā)生在步驟5.)
  • 執(zhí)行命令超時(shí)

編寫回退(fallback)邏輯時(shí),這個(gè)邏輯里最好沒有網(wǎng)絡(luò)調(diào)用,只從內(nèi)存中獲取或者只有靜態(tài)的邏輯,這個(gè)邏輯保證不會(huì)執(zhí)行失敗。如果非要通過網(wǎng)絡(luò)去獲取Fallback,你需要在使用其他HystrixCommand或HystrixObservableCommand封裝請(qǐng)求,并且這個(gè)請(qǐng)求必須有fallback邏輯且值沒有網(wǎng)絡(luò)調(diào)用,只有靜態(tài)邏輯

  1. Return the Successful Response
    返回執(zhí)行結(jié)束或者Observable

二. 斷路器工作流程

下圖顯示HystrixCommand或HystrixObservableCommand如何與HystrixCircuitBreaker及其邏輯和決策流程交互,包括計(jì)數(shù)器在斷路器中的行為。

image.png

斷路器開啟關(guān)閉的規(guī)則如下:

  • 如果服務(wù)請(qǐng)求數(shù)量達(dá)到一定閾值(HystrixCommandProperties.circuitBreakerRequestVolumeThreshold)且如果服務(wù)請(qǐng)求失敗的百分比超過閾值(HystrixCommandProperties.circuitBreakerErrorThresholdPercentage())…
  • 然后斷路器的狀態(tài)從CLOSED改變?yōu)镺PEN.
  • 當(dāng)斷路器open時(shí),它會(huì)短路所有經(jīng)過此斷路器的請(qǐng)求。
  • 經(jīng)過一段時(shí)間(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()),接下來的第一個(gè)請(qǐng)求允許通過(此時(shí)斷路器是處于HALF-OPEN狀態(tài))。 如果請(qǐng)求失敗,斷路器將在睡眠窗口持續(xù)時(shí)間內(nèi)返回到OPEN狀態(tài)。 如果請(qǐng)求成功,斷路器狀態(tài)將轉(zhuǎn)換到CLOSED,又會(huì)轉(zhuǎn)到邏輯1。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容