hystrix(6) 命令執行

  上一節中講到了HystrixCommand有四種執行方法,這一節就來說一下這四種方法直接的關係以及他們的實現。併發

  execute方法使用同步方式獲取結果,本質是調用了queue方法獲取了一個Future,而後經過該Future獲取返回結果。app

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。ide

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命令,並返回消息。ui

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);
               ...
            }
        });
    }

 命令執行流程spa

  命令執行流程主要包含一下內容:線程

  1.熔斷器判斷code

  2.各個階段HystrixCommandExecutionHook調用。blog

  3.各個階段ip

  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

相關文章
相關標籤/搜索