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 メッセージをデコードしたりするのをブロックしたくないのは正しいことです。それを軽減するためにできることが 2 つあります。
まず、Async netty クライアントを使用して発信リクエストを作成し、発信リクエストが返されたときにリスナーが元のリクエスト チャネルにレスポンスを書き込むようにします。これは、ブロックして待機しないことを意味します。つまり、それらの要求を処理するために使用できるスレッドの数よりも多くの同時発信要求を処理できます。
次に、独自の 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);
}
};
つまり、送信リクエストは、受信リクエストの受け入れ/処理に使用されるスレッドを占有しません。