送信されたすべてのHTTPリクエストをカウントし、再試行するにはどうすればよいですか?

パスカル

一部のユースケースでは、ApacheAPIによって送信されたリクエストをカウントできる必要があります。たとえば、Web APIを大量にリクエストする場合、どのAPIがAPIキーを介した認証を必要とし、どのTOSが各キーのリクエストカウントを時間内に制限します。

ケースをより具体的https://domain1/fooNeedNoKeyにお願いしたいのhttps://domain2/fooNeedKeyWithRequestsCountRestrictionsですが、その回答分析データに応じて、お願いします。これらの1対2のリクエストシーケンスのすべての送信は、単一のorg.apache.http.impl.client.FutureRequestExecutionServiceを介して実行されます。

現在のところ、org.apache.httpcomponents:httpclient:4.3.3に応じて、次のAPI要素を使用しています。

  • org.apache.http.impl.client.FutureRequestExecutionService、マルチスレッドHTTPリクエストを実行します。時間メトリック(HTTPスレッドが終了するまでにかかった時間)を提供しますが、要求カウンターメトリックはありません
  • final CloseableHttpClient httpClient = HttpClients.custom() // the auto-retry feature of the Apache API will retry up to 5 // times on failure, being also allowed to send again requests // that were already sent if necessary (I don't really understand // the purpose of the second parameter below) .setRetryHandler(new StandardHttpRequestRetryHandler(5, true)) // for HTTP 503 'Service unavailable' errors, also retrying up to // 5 times, waiting 500ms between each retry. Guessed is that those // 5 retries are part of the previous "global" 5 retries setting. // The below setting, when used alone, would allow to only enable // retries for HTTP 503, or to get a greater count of retries for // this specific error .setServiceUnavailableRetryStrategy(new DefaultServiceUnavailableRetryStrategy(5, 500)) .build();、ApacheAPIの再試行動作をカスタマイズします

トピックに戻る:

  • 前に引用したApacheAPI再試行関連クラスを拡張することでリクエストカウンターを作成できます
  • あるいは、Apache APIサポートの無関係なチケットは、このリクエストを示す傾向があります-カウンターメトリックが利用可能であり、APIからJavaNIOに転送される可能性があります

編集1:ApacheAPIではこれを許可しないようです。APIの内部から引用すると、RetryExecはAPIコードI / Oで拡張可能ではありません。

package org.apache.http.impl.execchain;

public class RetryExec implements ClientExecChain {
    ..
    public CloseableHttpResponse execute(
            final HttpRoute route,
            final HttpRequestWrapper request,
            final HttpClientContext context,
            final HttpExecutionAware execAware) throws IOException, HttpException {
        ..
        for (int execCount = 1;; execCount++) {
            try {
                return this.requestExecutor.execute(route, request, context, execAware);
            } catch (final IOException ex) {
                ..
                if (retryHandler.retryRequest(ex, execCount, context)) {
                    ..
        }
        ..
    }
}

'execCount'変数は必要な情報であり、ローカルでのみ使用されるためアクセスできません。

同様に、「retryHandler」を拡張して、その中のリクエストを手動でカウントすることもできますが、「retryHandler.retryRequest(ex、execCount、context)」には「request」変数が提供されていないため、私たちが何であるかを知ることができません。カウンターのインクリメント(特定のドメインに送信された要求のカウンターのみをインクリメントしたい場合があります)。

私はそれについてのJavaのアイデアが不足しています。サードパーティの代替手段:Javaプロセスにディスク上のファイルをポーリングさせ、必要な要求をカウントするシェルスクリプトによって管理します。確かにそれは多くのディスク読み取りアクセスを行い、ハードウェアキラーオプションになるでしょう。

パスカル

回避策は簡単でした。APIのHttpContextクラスはこれを目的としています。

// optionnally, in case your HttpCLient is configured for retry
class URIAwareHttpRequestRetryHandler extends StandardHttpRequestRetryHandler {
    public URIAwareHttpRequestRetryHandler(final int retryCount, final boolean requestSentRetryEnabled)
    {
        super(retryCount, requestSentRetryEnabled);
    }

    @Override
    public boolean retryRequest(final IOException exception, final int executionCount, final HttpContext context)
    {
        final boolean ret = super.retryRequest(exception, executionCount, context);
        if (ret) {
            doForEachRequestSentOnURI((String) context.getAttribute("requestURI"));
        }
        return ret;
    }
}

// optionnally, in addition to the previous one, in case your HttpClient has specific settings for the 'Service unavailable' errors retries 
class URIAwareServiceUnavailableRetryStrategy extends DefaultServiceUnavailableRetryStrategy {
    public URIAwareServiceUnavailableRetryStrategy(final int maxRetries, final int retryInterval)
    {
        super(maxRetries, retryInterval);
    }

    @Override
    public boolean retryRequest(final HttpResponse response, final int executionCount, final HttpContext context)
    {
        final boolean ret = super.retryRequest(response, executionCount, context);
        if (ret) {
            doForEachRequestSentOnURI((String) context.getAttribute("requestURI"));
        }
        return ret;
    }
}

// main HTTP querying code: retain the URI in the HttpContext to make it available in the custom retry-handlers code
httpContext.setAttribute("requestURI", httpGET.getURI().toString());
try {
    httpContext.setAttribute("requestURI", httpGET.getURI().toString());
    httpClient.execute(httpGET, getHTTPResponseHandlerLazy(), httpContext);
    // if request got successful with no need of retries, of if it succeeded on the last send: in any cases, this is the last query sent to server and it got successful
    doForEachRequestSentOnURI(httpGET.getURI().toString());
} catch (final ClientProtocolException e) {
    // if request definitively failed after retries: it's the last query sent to server, and it failed
    doForEachRequestSentOnURI(httpGET.getURI().toString());
} catch (final IOException e) {
    // if request definitively failed after retries: it's the last query sent to server, and it failed
    doForEachRequestSentOnURI(httpGET.getURI().toString());
} finally {
    // restoring the context as it was initially
    httpContext.removeAttribute("requestURI");
}

解決しました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

RxJS5でHTTPリクエストを送信するための再試行を遅らせるにはどうすればよいですか?

分類Dev

Python zeepで再試行処理を取得するにはどうすればよいですか?リクエストの再試行セッションを使用していますが、例外が処理されません

分類Dev

再実行されたテストのteamcityで失敗したテストカウントを修正するにはどうすればよいですか?

分類Dev

ディレクトリ内のすべてのコード行を再帰的にカウントするにはどうすればよいですか?

分類Dev

ディレクトリを介してすべてのファイルを再帰的にカウントするにはどうすればよいですか

分類Dev

ディレクトリを介してすべてのファイルを再帰的にカウントするにはどうすればよいですか

分類Dev

Pythonリクエストを使用して別のプロキシ経由で接続を再試行するにはどうすればよいですか?

分類Dev

ログインに成功した後、すべてのリクエストと一緒にJWTを送信するにはどうすればよいですか?

分類Dev

SuperAgentが行うすべてのリクエストにカスタムHTTPヘッダーを挿入するにはどうすればよいですか?

分類Dev

サブクエリを使用して返された列値のカウントを取得するにはどうすればよいですか?

分類Dev

akka httpのPOSTリクエストに再試行を追加するにはどうすればよいですか?

分類Dev

Apache httpクライアントのURIBuilderを使用してHTTPリクエストで本文を送信するにはどうすればよいですか?

分類Dev

AFNetworking-タイムアウトが発生した場合に再試行されるようにリクエストを設定するにはどうすればよいですか?

分類Dev

バックエンドを介してWooCommerce注文で実行された変更のリストを取得するにはどうすればよいですか?

分類Dev

MarkLogicにクエリを実行して、インデックスの再作成のコストを判断するにはどうすればよいですか?

分類Dev

カウントと属性のwhereクエリを実行するにはどうすればよいですか?

分類Dev

成功するまでセロリにリクエストを再試行させるにはどうすればよいですか?

分類Dev

再試行メカニズムをPythonリクエストライブラリに実装するにはどうすればよいですか?

分類Dev

列の重複エントリを除くすべての行をカウントするにはどうすればよいですか?

分類Dev

Flaskですべてのリクエストに対してアクションを実行するにはどうすればよいですか?

分類Dev

Microsoft Graph SDKのデフォルトの再試行ハンドラーは、リクエストを送信する前にエンドポイントがスロットルされているかどうかをチェックしますか?

分類Dev

SOAP UIで複数のリクエストを実行し、すべてのレスポンスを保存するにはどうすればよいですか?

分類Dev

MySQLクエリを実行して、IDでソートされたさまざまなサブスクリプションからすべての行を取得するにはどうすればよいですか?

分類Dev

MySQLクエリを実行して、IDでソートされたさまざまなサブスクリプションからすべての行を取得するにはどうすればよいですか?

分類Dev

失敗したテストを再試行するにはどうすればよいですか?

分類Dev

非同期フェッチリクエストを実行してから、最後に失敗したリクエストを再試行するにはどうすればよいですか?

分類Dev

HTTPリクエストでurllib2を使用してカスタムヘッダーを送信するにはどうすればよいですか?

分類Dev

クライアントが実行したhttpリクエストのログインを認証するにはどうすればよいですか?

分類Dev

JWTを保存し、reactを使用してすべてのリクエストで送信するにはどうすればよいですか?

Related 関連記事

  1. 1

    RxJS5でHTTPリクエストを送信するための再試行を遅らせるにはどうすればよいですか?

  2. 2

    Python zeepで再試行処理を取得するにはどうすればよいですか?リクエストの再試行セッションを使用していますが、例外が処理されません

  3. 3

    再実行されたテストのteamcityで失敗したテストカウントを修正するにはどうすればよいですか?

  4. 4

    ディレクトリ内のすべてのコード行を再帰的にカウントするにはどうすればよいですか?

  5. 5

    ディレクトリを介してすべてのファイルを再帰的にカウントするにはどうすればよいですか

  6. 6

    ディレクトリを介してすべてのファイルを再帰的にカウントするにはどうすればよいですか

  7. 7

    Pythonリクエストを使用して別のプロキシ経由で接続を再試行するにはどうすればよいですか?

  8. 8

    ログインに成功した後、すべてのリクエストと一緒にJWTを送信するにはどうすればよいですか?

  9. 9

    SuperAgentが行うすべてのリクエストにカスタムHTTPヘッダーを挿入するにはどうすればよいですか?

  10. 10

    サブクエリを使用して返された列値のカウントを取得するにはどうすればよいですか?

  11. 11

    akka httpのPOSTリクエストに再試行を追加するにはどうすればよいですか?

  12. 12

    Apache httpクライアントのURIBuilderを使用してHTTPリクエストで本文を送信するにはどうすればよいですか?

  13. 13

    AFNetworking-タイムアウトが発生した場合に再試行されるようにリクエストを設定するにはどうすればよいですか?

  14. 14

    バックエンドを介してWooCommerce注文で実行された変更のリストを取得するにはどうすればよいですか?

  15. 15

    MarkLogicにクエリを実行して、インデックスの再作成のコストを判断するにはどうすればよいですか?

  16. 16

    カウントと属性のwhereクエリを実行するにはどうすればよいですか?

  17. 17

    成功するまでセロリにリクエストを再試行させるにはどうすればよいですか?

  18. 18

    再試行メカニズムをPythonリクエストライブラリに実装するにはどうすればよいですか?

  19. 19

    列の重複エントリを除くすべての行をカウントするにはどうすればよいですか?

  20. 20

    Flaskですべてのリクエストに対してアクションを実行するにはどうすればよいですか?

  21. 21

    Microsoft Graph SDKのデフォルトの再試行ハンドラーは、リクエストを送信する前にエンドポイントがスロットルされているかどうかをチェックしますか?

  22. 22

    SOAP UIで複数のリクエストを実行し、すべてのレスポンスを保存するにはどうすればよいですか?

  23. 23

    MySQLクエリを実行して、IDでソートされたさまざまなサブスクリプションからすべての行を取得するにはどうすればよいですか?

  24. 24

    MySQLクエリを実行して、IDでソートされたさまざまなサブスクリプションからすべての行を取得するにはどうすればよいですか?

  25. 25

    失敗したテストを再試行するにはどうすればよいですか?

  26. 26

    非同期フェッチリクエストを実行してから、最後に失敗したリクエストを再試行するにはどうすればよいですか?

  27. 27

    HTTPリクエストでurllib2を使用してカスタムヘッダーを送信するにはどうすればよいですか?

  28. 28

    クライアントが実行したhttpリクエストのログインを認証するにはどうすればよいですか?

  29. 29

    JWTを保存し、reactを使用してすべてのリクエストで送信するにはどうすればよいですか?

ホットタグ

アーカイブ