HttpAsyncClient 4 如何工作?
How does HttpAsyncClient 4 work?
在 HttpClient
的早期版本中,目标主机被设置到客户端本身。在上一个版本中(HttpAsyncClient
是 4.1.1)每次我发出请求时,主机都设置为 HttpRequest
(HttpGet
、HttpPost
等)。
我想使用持久连接,所以我使用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()
有什么区别?
谢谢!
默认情况下,根据 RFC 2616 规范,HttpAsyncClient 仅允许两个并发连接到同一主机。此限制与 i/o 反应器内部使用的 i/o 调度线程数无关。
上面的代码最多会创建两个传出连接。
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
在 HttpClient
的早期版本中,目标主机被设置到客户端本身。在上一个版本中(HttpAsyncClient
是 4.1.1)每次我发出请求时,主机都设置为 HttpRequest
(HttpGet
、HttpPost
等)。
我想使用持久连接,所以我使用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()
有什么区别?
谢谢!
默认情况下,根据 RFC 2616 规范,HttpAsyncClient 仅允许两个并发连接到同一主机。此限制与 i/o 反应器内部使用的 i/o 调度线程数无关。
上面的代码最多会创建两个传出连接。
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