3

htp://(some ip)//{id} という形式の Web サービスに対して数百万の http リクエストを作成したいと考えています。

私は私と一緒にIDのリストを持っています。簡単な計算では、私の Java コードが API からデータを取得するのに約 4 ~ 5 時間かかることが示されています。コードは次のとおりです。

URL getUrl = new URL("http url");
URLConnection conn = getUrl.openConnection();
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sbGet = new StringBuffer();
String getline;
while ((getline = rd.readLine()) != null)
{
    sbGet.append(getline);
}
rd.close();
String getResponse = sbGet.toString();

このようなリクエストをより効率的に行う方法はありますか?

4

3 に答える 3

1

1 つの方法は、固定スレッド プール (サイズは、対象の HTTP サービスが処理できる量によって異なります) でエグゼキュータ サービスを使用し、サービスへのリクエストを並行して砲撃することです。Runnable は基本的に、サンプル コードで概説した手順を実行します。

于 2012-09-03T09:16:24.090 に答える
0

最適化を開始する前に、コードをプロファイリングする必要があります。そうしないと、間違った部分を最適化してしまう可能性があります。プロファイリングから得た結果に応じて、次のオプションを検討してください。

  • リクエストをバッチ処理できるようにプロトコルを変更します
  • 複数のリクエストを並行して発行します (複数のスレッドを使用するか、複数のプロセスを並行して実行します。この記事を参照してください) 。
  • 以前の結果をキャッシュしてリクエストの数を減らす
  • リクエストまたはレスポンスを圧縮する
  • HTTP 接続を維持する
于 2012-09-03T09:20:17.093 に答える
0

時間がかからず、より効率的にそのようなリクエストを行う方法はありますか?

おそらく少数のリクエストを並行して実行できますが、サーバーが飽和状態になる可能性があります。1 秒あたりのリクエスト数が一定数を超えると、スループットが低下する可能性があります ...

この制限を超えるには、サーバーやサーバーの Web API を再設計する必要があります。例えば:

  • クライアントが各リクエストで多数のオブジェクトを取得できるように Web API を変更すると、リクエストのオーバーヘッドが削減されます。

  • 圧縮が役立つ可能性がありますが、ネットワーク帯域幅と CPU 時間および/またはレイテンシーをトレードオフしています。高速なエンド ツー エンドのネットワークを使用している場合、圧縮によって実際に速度が低下する可能性があります。

  • キャッシングは一般的に役立ちますが、おそらくあなたのユースケースでは役に立ちません。(各オブジェクトを一度だけリクエストしています...)

  • 永続的な HTTP 接続を使用すると、リクエストごとに新しい TCP/IP 接続を作成するオーバーヘッドを回避できますが、HTTPS でこれを行うことができないとは思いません。(そして、HTTPS 接続の確立にはかなりのコストがかかるため、これは残念です。)

于 2012-09-03T09:22:58.260 に答える