web-dev-qa-db-ja.com

gRPCサーバーはリクエストごとに新しいスレッドを起動しますか?

GRPC Javaサーバーのプロファイリングを試みました。そして、主に以下のスレッドプールのセットが表示されます。

  • grpc-default-executorスレッド:着信リクエストごとに1つ作成されます。
  • grpc-default-worker-ELGスレッド:着信gRPCリクエストをリッスンし、上記の「grpc-default-executor」スレッドに割り当てる場合があります。

全体として、gRPC Javaサーバー、NettyスタイルまたはJetty/Tomcatスタイルですか?または両方の方法で実行するように構成できますか?

8
Venkata Naresh

gRPC Javaサーバーは、非同期であることを除いて、Jetty/Tomcatスタイルに近い形で公開されます。つまり、通常のサーブレットでは、各リクエストは完了するまでスレッドを消費します。新しいバージョンのサーブレットでは、デタッチできます。専用スレッドから非同期で作業を続行する(他の用途のためにスレッドを解放する)ことは一般的ではありません。gRPCではどちらのスタイルでも自由に作業できます。gRPCはデフォルトでcachedThreadPoolを使用してスレッドを再利用しますが、サーバー側ではServerBuilder.executor()を使用して、デフォルトのエグゼキュータを独自の、通常は固定サイズのプールに置き換えることをお勧めします。

内部的にはgRPC JavaはNettyスタイルを使用します。つまり、完全に非ブロッキングです。ServerBuilder.directExecutor()を使用してNettyスレッドで実行できます。ただし、その場合は、 NettyServerBuilder.bossEventLoopGroup()workerEventLoopGroup()を指定し、互換性のためにchannelType()を指定します。

5
Eric Anderson

私の知る限り、GRPCサーバー/クライアントを構築するときにdirectExecutor()を使用して指定できます。これにより、すべての作業がIOスレッドで行われるため、スレッドが共有されます。デフォルトはIOスレッド(そこでブロックしてはいけないように)にいる場合は、何をするかについて非常に注意する必要があるため、安全上の理由からこれを行わないでください。

0
Norman Maurer