AsyncHttpClient是否知道要为所有HTTP请求分配多少线程

时间:2016-02-16 11:31:14

标签: java multithreading http netty asynchttpclient

我正在评估AsyncHttpClient的大负载(~1M HTTP请求)。 对于每个请求,我想使用AsyncCompletionHandler调用回调,它只是将结果插入阻塞队列

我的问题是:如果我在紧密循环中发送异步请求,AsyncHttpClient将使用多少个线程? (我知道你可以设置最大值,但显然你冒了丢失请求的风险,我已经看过了here

我目前正在使用这些版本的Netty实现:

  • async-http-client v1.9.33
  • netty v3.10.5.Final

如果在以后的版本中有任何优化,我不介意使用其他版本

编辑:

我读到Netty使用reactor pattern来响应HTTP响应,这意味着它分配了很少的线程来充当选择器。这也意味着分配的线程数不会随着请求量的增加而增加。但是,这与设置最大连接数的需要相矛盾。

任何人都可以解释我错过的内容吗?

提前致谢

2 个答案:

答案 0 :(得分:6)

AsyncHttpClient客户端(以及其他非阻塞IO客户端)不需要为每个请求分配一个线程,即使你用请求轰炸它,客户端也不需要调整其线程池的大小。如果不使用HTTP keep-alive或调用多个主机,则会启动许多连接,但它们都可以由单个线程客户端处理(可能有多个IO线程,具体取决于实现)。

但是,限制每个主机的最大请求数和每个域的最大请求数总是一个好主意,以避免特定主机或站点上的服务过载,并避免被阻止。这就是HTTP客户端添加maxConnectionsPerXxx设置的原因。

答案 1 :(得分:0)

AHC有两种类型的线程:

  1. 用于I / O操作。在您的屏幕上,它是AsyncHttpClient-x-x线程。 AHC创建其中的 2 * core_number
  2. 超时。在您的屏幕上,它是AsyncHttpClient-timer-1-1线程。应该只一个

正如您提到的:

  

maxConnections仅表示打开的连接数,而没有   直接影响线程数

来源:在GitHub上发布的问题:https://github.com/AsyncHttpClient/async-http-client/issues/1658