假设你问的是 Netty 4。
使用 ServerBootstrap 配置的 Netty 将具有固定数量的工作线程,用于接受请求并执行通道,如下所示:
Two threads accepting / processing requests
bootstrap.group(NioEventLoopGroup(2))
One thread accepting requests, two threads processing.
bootstrap.group(NioEventLoopGroup(1), NioEventLoopGroup(1))
在您的情况下,您有一个通道包括一堆 Http Codec 解码/编码内容和您自己的处理程序,该处理程序本身发出传出 Http 请求。您是对的,您不想阻止服务器接受传入的请求或解码传入的 Http 消息,您可以做两件事来缓解这种情况,您已经解决了第一件事。
首先,您想使用异步网络客户端发出传出请求,当传出请求返回时,让侦听器将响应写入原始请求通道。这意味着您不会阻塞和等待,这意味着您可以处理比可用于处理这些请求的线程数更多的并发传出请求。
其次,您可以让您的自定义处理程序在其自己的 EventExecutorGroup 中运行,这意味着它在与接受器/http 编解码器通道处理程序不同的线程池中运行,如下所示:
// Two separate threads to execute your outgoing requests..
EventExecutorGroup separateExecutorGroup new DefaultEventExecutorGroup(2);
bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) {
ChannelPipeline pipeline = ch.pipeline();
.... http codec stuff ....
pipeline.addLast(separateExecutorGroup, customHandler);
}
};
这意味着您的传出请求不会占用用于接受/处理传入请求的线程。