web-dev-qa-db-ja.com

Hystrixとリボンのタイムアウトの警告

環境

  • Spring Boot 1.5.13.RELEASE
  • Spring Cloud Edgware.SR3
  • Javaバージョン "1.8.0_172-ea"、Java(TM)SEランタイム環境(ビルド1.8.0_172-ea-b03)およびソースレベル1.8でコンパイル
  • ランタイムJRE:openjdk:10.0.1-jre-slimを使用したDocker内

質問

serviceAというリボンクライアントがあります。

serviceA.ribbon.ConnectTimeout=5000
serviceA.ribbon.ReadTimeout=15000
hystrix.command.serviceA.execution.isolation.thread.timeoutInMilliseconds = 20000

私は(故意に)クラスパスで春の再試行をしていません。 ./mvnw dependency:list | grep -i retryを実行しましたが、結果が得られません。

実行時に、次の警告が表示されます。

コマンドserviceAのHystrixタイムアウト20000msは、リボン読み取りと接続タイムアウトの組み合わせである40000msよりも低く設定されています。

それぞれ15秒と5秒に設定したいと思っていたので、これらの数値がどこから来たのかわかりません。この数字が2倍になるのはなぜですか?

4
David

実際、リボンタイムアウトには、すべて同じサーバーの再試行と次のサーバーの再試行が含まれます。

ribbonTimeout = (ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) * (ribbon.MaxAutoRetriesNextServer + 1);
// ...
if(hystrixTimeout < ribbonTimeout) {
        LOGGER.warn("The Hystrix timeout of " + hystrixTimeout + "ms for the command " + commandKey +
            " is set lower than the combination of the Ribbon read and connect timeout, " + ribbonTimeout + "ms.");
    }

構成内:

  • ribbon.connectionTimeoutは5000です
  • ribbon.readTimeoutは15000です
  • ribbon.maxAutoRetriesは0(デフォルト)です
  • ribbon.maxAutoRetriesNextServerは1(デフォルト)です

したがって、hystrixTimeoutは次のようになります。

(5000 + 15000) * (1 + 0) * (1 + 1) // -> 40000 ms

Hystrixタイムアウトを構成しないことを選択した場合、デフォルトのHystrixタイムアウトは40000msになります。

19.13 Spring CloudドキュメントのZuulタイムアウト

15
bootsoon