2

私は+ 装う + Hystrixリボンを使用して春ブート(1.5.1)といくつかのサービスを作成しようとしています(と私のサービスの発見は、ばねboot-ある飼育係)とIドン'はズールを使用します。春のブートクラウド+リボン+ Feign + Hystrix +飼い葉桶:何が起こっているのは再試行ですか?

私はそれが道を以下に動作するはず思考(ナイーブ)であった:

は(@FeignClientによる注釈付き)装う方法を呼び出す - 送信するので、もしそれが、リボンによって何らかの方法でバランス負荷であるいくつかのHTTPリクエストに変換要求が失敗すると、同じタイプ/名前の次のサービスで再試行するようにリボン設定(つまり、myservice.ribbon.MaxAutoRetriesNextServer=2)を試み、最後にすべての再試行が失敗した場合、Hystrixフォールバック方式を呼び出します。

@Autowired 
private MyServiceClient myServiceClient; 

public Response doSomething() { 
    return myServiceClient.foo(new Object()); 
} 

は、すべてのサービスがある:

だから私の装うインタフェースHystrix FallbackFactory定義

@FeignClient(value = "myservice", fallbackFactory = HystrixMyServiceFallbackFactory.class) 
@RibbonClient(name = "myservice") 
public interface MyServiceClient { 
    @RequestMapping(value = "/foo", method = RequestMethod.POST) 
    Response foo(Object data); 
} 

は、私は次の行を持って私のコードで

public class HystrixMyServiceFallbackFactory implements FallbackFactory<MyServiceClient > { 

    @Override 
    public MyServiceClient create(final Throwable throwable) { 
     return new MyServiceClient() { 

      @Override 
      public Response foo(Object data) { 
       return new Response(-1, "Failed"); 
      } 
     }; 
    } 
} 

どこかにいくつかのデフォルトの応答を返します(私はMyServiceの2つを持っています)、リボンはいいラウンドRobbinでうまく動作しますが、 MyServiceインスタンスの1つをシャットダウンすると、RibbonはRound Robbinで処理を続行するため、2回おきにHystrix Fallbackの結果が返されます(リボンは他のサービスでリトライする必要がありますか?更新されます。

誰もがこれをどのように一緒に働かせるか説明できますか?

答えて

1

これは、あなたが探しているものはおそらくです:https://stackoverflow.com/a/29171396/873590

あなたはリボンを使用している場合、あなたは(あなたのServiceIDのための「localapp」を置き換える)次 と同様の特性を設定することができます。

localapp.ribbon.MaxAutoRetries=5 
localapp.ribbon.MaxAutoRetriesNextServer=5 
localapp.ribbon.OkToRetryOnAllOperations=true 
0

いくつか確認する必要があります。

最初に、あなたのmaven/gradleファイルにspring-retryの依存関係があるかどうかを確認してください。 Feign + Ribbonの再試行ではスプリングリトライが必要で、現在はオプションの依存関係です。したがって、アプリケーションにspring-retryがない場合、再試行はサポートされません。

spring-retryの適用後に再試行が行われなかった場合は、元の例外メッセージを確認する必要があります。これを行うには、フォールバックを削除してメッセージを確認します。 メッセージにmyservice timed-outがある場合は、hystrixタイムアウト例外が発生したことを意味します。

デフォルトでは、Hystrixのタイムアウトは1,000ミリ秒です。読み取り/接続タイムアウトが大きい場合は、http要求を再試行するのに十分でないことがあります。もしそうなら、以下のようにhystrixタイムアウトを調整してみてください。財産上

hystrix: 
    command: 
    default: 
     execution: 
     isolation: 
      thread: 
      timeoutInMilliseconds: 10000 

は10秒にhystrixのあなたのすべてのデフォルトのタイムアウトを変更し、それが十分に通常は大きいです。再試行に十分な時間を持つには、この値を適切な値に設定する必要があります。

特定のサーキットブレーカのヒステリシスタイムアウトを変更することもできます。 Feignの場合、すべての方法に独自の回路遮断器があり、その名前はあなたの場合には以下のようになります。

MyServiceClient#foo(Object) 

以下のように、サーキットブレーカのタイムアウトを変更することができます。

hystrix: 
    command: 
    MyServiceClient#foo(Object): 
     execution: 
     isolation: 
      thread: 
      timeoutInMilliseconds: 10000 
+0

Thx、この構成が見つかりました。しかし、私の意見では、マイクロサービス環境では少し問題になる可能性があります。私が5つの "サービス"を持っていて、2つが遅い場合、それは問題を解決しません:または私はすべての "サービス"コンポーネントを(Hystrix経由で)無効にするか、hystrixを無効にします。ちょっと考えた後、私はそれを解決することに決めました。健康指標を改善するため、「悪いサービス」は健康でないとマークされ、リストからのサービス発見によって削除されます。私はまだ遅いサービスでは "問題"がありますが、遅くて何が "悪い"サービスとしてマークするかを定義する必要があるかもしれません。 –

関連する問題