GRPC Javaサーバーのプロファイリングを試みました。そして、主に以下のスレッドプールのセットが表示されます。
全体として、gRPC Javaサーバー、NettyスタイルまたはJetty/Tomcatスタイルですか?または両方の方法で実行するように構成できますか?
gRPC Javaサーバーは、非同期であることを除いて、Jetty/Tomcatスタイルに近い形で公開されます。つまり、通常のサーブレットでは、各リクエストは完了するまでスレッドを消費します。新しいバージョンのサーブレットでは、デタッチできます。専用スレッドから非同期で作業を続行する(他の用途のためにスレッドを解放する)ことは一般的ではありません。gRPCではどちらのスタイルでも自由に作業できます。gRPCはデフォルトでcachedThreadPoolを使用してスレッドを再利用しますが、サーバー側ではServerBuilder.executor()
を使用して、デフォルトのエグゼキュータを独自の、通常は固定サイズのプールに置き換えることをお勧めします。
内部的にはgRPC JavaはNettyスタイルを使用します。つまり、完全に非ブロッキングです。ServerBuilder.directExecutor()
を使用してNettyスレッドで実行できます。ただし、その場合は、 NettyServerBuilder.bossEventLoopGroup()
、workerEventLoopGroup()
を指定し、互換性のためにchannelType()
を指定します。
私の知る限り、GRPCサーバー/クライアントを構築するときにdirectExecutor()を使用して指定できます。これにより、すべての作業がIOスレッドで行われるため、スレッドが共有されます。デフォルトはIOスレッド(そこでブロックしてはいけないように)にいる場合は、何をするかについて非常に注意する必要があるため、安全上の理由からこれを行わないでください。