Asynchronous apache http异步客户端中的I/O Dispatcher数

Asynchronous apache http异步客户端中的I/O Dispatcher数,asynchronous,io,apache-httpclient-4.x,nonblocking,Asynchronous,Io,Apache Httpclient 4.x,Nonblocking,我使用ApacheHTTPAsync客户端(通过使用Kafka总线的数据)发出HTTP请求,并在回调中处理响应 我在我的日志中发现了一些有趣的回调行为,我想知道它是什么样子的 以下是部分代码(使用kafka的数据并发出http请求): 所以情况是,在某个时候,我启动了这个程序,它开始使用卡夫卡的数据。每次轮询的最大记录数为500 由于卡夫卡已经有很多未使用的数据,该程序面临着高吞吐量 现在,日志如下所示: [INFO ] 2018-04-29 04:11:29.234 [main] MyClas

我使用ApacheHTTPAsync客户端(通过使用Kafka总线的数据)发出HTTP请求,并在回调中处理响应

我在我的日志中发现了一些有趣的回调行为,我想知道它是什么样子的

以下是部分代码(使用kafka的数据并发出http请求):

所以情况是,在某个时候,我启动了这个程序,它开始使用卡夫卡的数据。每次轮询的最大记录数为500

由于卡夫卡已经有很多未使用的数据,该程序面临着高吞吐量

现在,日志如下所示:

[INFO ] 2018-04-29 04:11:29.234 [main] MyClass - Polling got records: 500
[INFO ] 2018-04-29 04:11:30.362 [I/O dispatcher 1] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 2] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 1] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 1] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 2] SUCCESS blablabla
...
...
[INFO ] 2018-04-29 06:28:35.003 [main] MyClass - Polling got records: 500
[INFO ] 2018-04-29 06:28:35.363 [I/O dispatcher 386] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 385] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 386] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 385] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 386] SUCCESS blablabla
...
[INFO ] 2018-04-29 06:31:35.003 [main] MyClass - Polling got records: 500
[INFO ] 2018-04-29 06:32:12.418 [I/O dispatcher 405] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 406] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 405] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 406] SUCCESS blablabla
[INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 405] SUCCESS blablabla
...
[ERROR] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 405] FAILED blablabla! org.apache.http.ConnectionClosedException: Connection closed unexpectedly
[ERROR] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 406] FAILED blablabla! org.apache.http.ConnectionClosedException: Connection closed unexpectedly
// there the program stopped
以下是我无法理解的:

  • 为什么每500个请求(响应处理)只有两个I/O调度器?是因为默认设置为max 2吗
  • 为什么每500个请求的I/O分派器数量不断增加?通常,我以前的经验是,I/O调度程序的数量将增加,但也将减少到1和2。我的假设是:它将重用以前的一些I/O分派器,而不是每次创建新的分派器
  • 为什么要在结尾处使用ConnectionClosedException?是因为太多的I/O调度器停止了程序吗
  • 更新 感谢Oleg的评论,我发现I/O dispatchers的数量不断增加是因为每次我从Kafka获得数据时,都会创建一个新的http客户端。然后,将会有大量空闲的客户端占用IOs和资源。这也是程序停止的原因

    我还有一些问题要问:

  • 日志中显示的I/O调度程序的数量是什么意思?是不同线程的数量吗
  • 如何控制一个http客户端的最大I/O分派器数?它是由I/O调度程序执行的吗
  • I/O调度器的数量与连接的数量之间有什么区别
  • 如何根据运行程序的机器和数据吞吐量/大小估计I/O调度器的数量和需要的连接数量
  • 它表示线程名称

  • 可以使用
    IOReactorConfig

  • 少量的I/O调度器管理大量的连接

  • 对于大多数应用程序来说,每个CPU核一个I/O调度线程很可能是一个合理的默认值,不应该更改它


  • 您不是每次都在创建HttpAsyncClient的新实例,是吗?@oleg是的,我是。我也刚刚发现了这个bug。客户端尚未关闭,新客户端已创建。然后我们有很多闲置的客户。这就是io调度程序数量不断增加的原因。谢谢。您真的,真的应该为所有逻辑相关的应用程序重新使用同一个HttpAsyncClient实例requests@oleg我还有一些问题:1。I/O调度程序的数量意味着什么?是不同线程的数量吗?2.如何控制一个http客户端的最大I/O分派器数?是否由I/O调度程序执行?3.io调度器的数量与连接的数量之间有什么区别?谢谢你能更新你的问题吗?我会全部回答你的问题?
    public class SomeCallback {
        // ...
        @Override
        public void completed(final HttpResponse response) {
            // do something
            logger.info("{} - blablabla", status, ...);
            latch.countDown();
        }
    
        @Override
        public void failed(final Exception ex) {
            // do something
            logger.error("{} - blablabla", FAILED, ..., ex);
            latch.countDown();
        }
    
        @Override
        public void cancelled() {
            // do something
            logger.error("{} - blablabla!", CANCELLED, ...);
            latch.countDown();
        }
    }
    
    [INFO ] 2018-04-29 04:11:29.234 [main] MyClass - Polling got records: 500
    [INFO ] 2018-04-29 04:11:30.362 [I/O dispatcher 1] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 2] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 1] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 1] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 2] SUCCESS blablabla
    ...
    ...
    [INFO ] 2018-04-29 06:28:35.003 [main] MyClass - Polling got records: 500
    [INFO ] 2018-04-29 06:28:35.363 [I/O dispatcher 386] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 385] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 386] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 385] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 386] SUCCESS blablabla
    ...
    [INFO ] 2018-04-29 06:31:35.003 [main] MyClass - Polling got records: 500
    [INFO ] 2018-04-29 06:32:12.418 [I/O dispatcher 405] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 406] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 405] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 406] SUCCESS blablabla
    [INFO ] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 405] SUCCESS blablabla
    ...
    [ERROR] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 405] FAILED blablabla! org.apache.http.ConnectionClosedException: Connection closed unexpectedly
    [ERROR] 2018-04-29 xx:xx:xx.xxx [I/O dispatcher 406] FAILED blablabla! org.apache.http.ConnectionClosedException: Connection closed unexpectedly
    // there the program stopped