grpc-JavaはServerBuilder
でエグゼキュータを使用します。エグゼキュータは、builder.executor()
メソッドで定義されていない場合、デフォルトで静的キャッシュスレッドプールを使用します。このエグゼキュータの正確な使用法は何ですか?ハンドラーメソッドを実行するだけですか、それとも「他の何か」も実行しますか?
また、grpcはnettyワーカーEventLoopGroup
をどのように定義しますか?具体的には、ワーカースレッドがこのワーカーグループにどのように割り当てられているかを知りたいです。スレッド数のデフォルトはありますか、それともマシンのコア数の関数ですか?また、上記の質問に関連して、これらのネット労働者はどのように遺言執行者と協力しますか?それらはI/Oだけを処理しますか?チャネルの読み取りと書き込みですか?
編集:Nettyは、デフォルトで(2 *コア数)ワーカースレッドを作成します。
指定したExecutor
は、rpcのコールバックを実際に実行するものです。これにより、EventLoop
が解放され、接続でデータの処理を続行できます。新しいメッセージがネットワークから到着すると、イベントループで読み取られ、スタックを上ってエグゼキュータに伝播されます。エグゼキュータはメッセージを受け取り、実際にデータの処理を行うServerCall.Listener
に渡します。
デフォルトでは、gRPCはキャッシュされたスレッドプールを使用するため、開始は非常に簡単です。ただし、独自のエグゼキュータを提供することを強くお勧めします。その理由は、デフォルトのスレッドプールが負荷の下で正しく動作せず、残りがビジーのときに新しいスレッドを作成するためです。
イベントループグループを設定するには、NettyServerBuilderで workerEventLoopGroup メソッドを呼び出します。 gRPCはNettyに厳密に依存していないため(他のサーバートランスポートも可能)、Netty固有のビルダーを使用する必要があります。