7

以前のバージョンのHttpClientターゲット ホストは、クライアント自体にセットアップされていました。最後のバージョン( 4.1.1の場合)では、リクエストを行うたびにホストが(など)HttpAsyncClientに設定されます。HttpRequestHttpGetHttpPost

永続的な接続を使用したいので、使用しますHttpAsyncClient。私は次のように作成して使用します。

CloseableHttpAsyncClient client = HttpAsyncClients.createDefault();
client.start();
List<Future<HttpResponse>> responses = new ArrayList<>();
for (int i = 0; i < 10; i++)
{
    HttpGet get = new HttpGet("https://google.com/");
    responses.add(client.execute(get, null));
}
for (Future<HttpResponse> response : responses) {
    response.get(); //wait for the response
}

テストしたところ、通常よりも高速に動作HttpClientします (すべての要求を実行してから、すべての応答を待つ場合)。

しかし、それが内部でどのように機能するか、完全には理解できません。との接続はhttps://google.com/いくつ確立されていますか? clientあるホストに使用してから別のホストに使用するとどうなりますか? (私がテストしたように、応答は任意の順序で来る可能性があるため、少なくとも2つの接続が並行していると思います). HttpAsyncClients.createDefault()とはどう違いHttpAsyncClients.createPipelining()ますか?

ありがとう!

4

1 に答える 1

6

デフォルトでは、HttpAsyncClient は、RFC 2616 仕様に従って、同じホストへの同時接続を 2 つだけ許可します。この制限は、I/O リアクターによって内部的に使用される I/O ディスパッチ スレッドの数とは関係ありません。

上記のコードは、最大で 2 つの発信接続を作成します。

HTTP メッセージのパイプライン処理は、接続の永続性自体とは何の関係もありませんが、パイプライン化された要求の実行は永続的な接続の使用を意味します。

HTTP パイプラインは、メッセージの順序付けに関するものです。パイプライン モードの HttpAsyncClient は、各応答を待たずに複数の要求を送信できます。

デフォルトモード:

C -> request1 -> S
C <- response1 <- S
C -> request2 -> S
C <- response2 <- S

パイプライン モード:

C -> request1 -> S
C -> request2 -> S
C <- response1 <- S
C <- response2 <- S
于 2016-01-04T13:52:30.850 に答える