6

JavaでHTTPクライアントを実装する必要がありますが、私のニーズでは、HTTPパイプラインを実装するのが最も効率的な方法のようです(RFC2616による)。

余談ですが、POSTをパイプライン化したいと思います。(また、多重化について話しているのではありません。パイプラインについて話しているのです。つまり、HTTP要求の応答バッチ処理を受信する前に、1つの接続を介して多くの要求を処理します)

パイプラインをサポートしていることを明示的に示しているサードパーティのライブラリが見つかりませんでした。しかし、たとえばApache HTTPCoreを使用してそのようなクライアントを構築することも、必要に応じて自分で構築することもできます。

私が抱えている問題は、それが良い考えであるかどうかです。HTTPパイプラインは理論モデル以上のものであり、HTTPサーバーによって適切に実装されているという信頼できる参照は見つかりませんでした。さらに、パイプラインをサポートするすべてのブラウザでは、デフォルトでこの機能がオフになっています。

したがって、そのようなクライアントを実装しようとすると、サーバーの実装(またはプロキシ)が原因で多くの問題が発生します。これらに関するガイドラインを提供する参考資料はありますか?

それが悪い考えである場合、効率のための代替プログラミングモデルは何でしょうか?個別のTCP接続?

4

3 に答える 3

10

POSTはパイプライン化されるべきではありません

8.1.2.2パイプライン

持続的接続をサポートするクライアントは、その要求を「パイプライン化」することができます(つまり、各応答を待たずに複数の要求を送信します)。サーバーは、要求が受信されたのと同じ順序でそれらの要求への応答を送信する必要があります。

接続の確立直後に永続的な接続とパイプラインを想定するクライアントは、最初のパイプラインの試行が失敗した場合に接続を再試行する準備をする必要があります。クライアントがそのような再試行を行う場合、接続が永続的であることを認識する前にパイプラインを作成してはなりません(MUSTNOT)。また、対応するすべての応答を送信する前にサーバーが接続を閉じた場合、クライアントは要求を再送信する準備をしなければなりません。

クライアントは、非べき等メソッドまたは非べき等のメソッドシーケンスを使用してリクエストをパイプライン化するべきではありません(セクション9.1.2を参照)。そうしないと、トランスポート接続の早期終了が不確定な結果につながる可能性があります。非べき等の要求を送信したいクライアントは、前の要求の応答ステータスを受信するまで、その要求の送信を待つ必要があります。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

于 2010-07-21T10:50:46.610 に答える
8

パイプライン化されたHTTPクライアントを実装しました。基本的な概念は簡単に聞こえますが、エラー処理は非常に困難です。パフォーマンスの向上は非常に重要ではないため、ずっと前にコンセプトをあきらめました。

私の意見では、通常のユースケースには意味がありません。リクエストにロジック接続がある場合にのみ、いくつかの利点があります。たとえば、3リクエストのトランザクションがあり、それらすべてをバッチで送信できます。ただし、通常、パイプライン化できる場合は、それらを1つのリクエストに組み合わせることができます。

以下は私が覚えているいくつかのハードルです、

  1. TCPのキープアライブは、持続的接続を保証するものではありません。接続に3つのリクエストがパイプされている場合、サーバーは最初の応答後に接続を切断します。次の2つのリクエストを再試行することになっています。

  2. 複数の接続がある場合、負荷分散も注意が必要です。アイドル状態の接続がない場合は、ビジー接続を使用するか、新しい接続を作成できます。

  3. タイムアウトも注意が必要です。1つのリクエストがタイムアウトすると、順番に戻る必要があるため、その後はすべて破棄する必要があります。

于 2010-07-21T12:27:43.667 に答える
-1

パイプラインはhttpサーバーにほとんど違いはありません。彼らは通常、接続でリクエストをシリアルに処理します-リクエストを読み取り、応答を書き込み、次のリクエストを読み取ります...

ただし、クライアントは多重化によってスループットを向上させる可能性が非常に高くなります。Webサイトには通常、複数のCPUを搭載した複数のマシンがありますが、なぜ自発的にリクエストを1行に制限したいのですか?今日では、水平方向のスケーラビリティ(同時要求)が重要になっています。もちろん、ベンチマークするのが最善です。

于 2010-07-21T21:21:03.323 に答える