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

Does AsyncHttpClient knows how many threads to allocate for all the HTTP requests

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

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

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

我不介意使用其他版本,如果后续版本有优化的话

编辑:

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

谁能解释一下我错过了什么?

提前致谢

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

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

AHC 有两种类型的线程:

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

正如你提到的:

maxConnections just means number of open connections which does not directly affect the number of threads

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