2017-09-18 3 views
-1

私はC#WebAPIプロジェクトを持っていて、NESTを使ってローカルのElasticSearchデータベースに接続しています。 WebAPIとElasticSearchは、2つの別々のWindowsサービスとして実行されています。私が気づいた問題の1つは、ESサービスがWebAPIよりも前に起動しなければならないことです。さもなければ、WebAPIが利用できないデータベースを初期化しようとして失敗することがあります。ElasticSearchが起動して実行されるのを待つ

この問題は、Windowsサービスオプションに依存関係を強制することで部分的に解決されています.WindowsはまずESを起動してからWebAPIを起動します。 ESが実際に準備が整うまでに時間がかかることがあり、WebAPIサービスが失敗する可能性があるため、問題は完全に解決されません。

オプション/タイムアウト/再試行NESTライブラリに設定して、データベースへの最初の要求を発行するまで待つことができますか? DIYに行って自分のリトライループをコードする必要がありますか?

+0

「自動(遅延開始)」に設定されたWebAPIスタートアップタイプはありますか? – mjwills

+0

はい、また、依存関係セットがあります(タブの「サービスプロパティの下の依存関係」) –

+0

NESTライブラリのAPIまたは何かを求めていました –

答えて

3

これを解決するための何も組み込みはありませんが、あなたの問題を克服するために、再試行ポリシーとともにPollyのようなものを使用する可能性があります。

Policy 
    .Handle<YourNESTExceptionHere>() 
    .WaitAndRetryForever(retryAttempt => TimeSpan.FromSeconds(1)); 
    .Execute(() => 
    { 
     // code that raises the exception 
    }); 

それは例外を発生させずに完了するまで、これは継続的に、それぞれの試行の間に1秒を待って、コードを実行しようとします。再試行間の時間は、明らかにあなたのシナリオに合ったものに変更することができます。これは基本的に、Elasticsearchクラスタがすぐに利用できないという問題の周りを取り巻くことになります。例外を飲み込んだら、すぐに再試行します。

他にもPollyが提供するポリシーがあります。たとえば、サーキットブレーカを使用したいと思うかもしれません。そのため、サービスに何らかの問題がある場合には、最終的には終了し、その後の試行をやめてしまいます。あなたはPollyのreadmeを読んで、あなたのさまざまなオプションを理解する必要があります。長くても短くても、例外をキャッチして再試行するには何らかの方法が必要です。

関連する問題