【问题标题】:Does AsyncHttpClient knows how many threads to allocate for all the HTTP requestsAsyncHttpClient 是否知道为所有 HTTP 请求分配多少线程
【发布时间】:2016-05-27 15:56:59
【问题描述】:

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

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

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

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

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

编辑:

I read that Netty uses the reactor pattern for reacting to HTTP responses which means it allocates a very small number of threads to act as selectors.这也意味着分配的线程数不会随着请求量的增加而增加。然而,这与设置最大连接数的需要相矛盾。

谁能解释我错过了什么?

提前致谢

【问题讨论】:

  • 提示:HTTP 请求不一定重复使用相同的连接;)
  • @EranHarel 不确定我是否理解提示,但现在我认为最大连接数只是指打开的连接数,它不会直接影响线程数(因为一个选择器监听多个套接字),我我在正确的道路上?
  • 当您不使用 HTTP keep-alive 时,连接不会被重用,因此当您向特定主机或域发送许多请求时 - 您将创建许多连接(每个请求一个)。在某些情况下,您可能会使站点/服务超载,或者在洪水泛滥时被阻止。这就是客户端具有此设置的原因。无论如何,无论你创建多少并发请求/连接,netty 都不会增加线程数。
  • 这绝对可以更好地组织我的脑海中的事情。把它写成答案,我会接受的,谢谢你的帮助

标签: java multithreading http netty asynchttpclient


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 2016-05-25
      • 2012-08-24
      • 1970-01-01
      • 2011-09-29
      • 2014-05-06
      相关资源
      最近更新 更多