web-dev-qa-db-ja.com

grpc-JavaのServerBuilderでのエグゼキュータの正確な使用法は何ですか?ハンドラーメソッドを実行するだけですか?

grpc-JavaはServerBuilderでエグゼキュータを使用します。エグゼキュータは、builder.executor()メソッドで定義されていない場合、デフォルトで静的キャッシュスレッドプールを使用します。このエグゼキュータの正確な使用法は何ですか?ハンドラーメソッドを実行するだけですか、それとも「他の何か」も実行しますか?

また、grpcはnettyワーカーEventLoopGroupをどのように定義しますか?具体的には、ワーカースレッドがこのワーカーグループにどのように割り当てられているかを知りたいです。スレッド数のデフォルトはありますか、それともマシンのコア数の関数ですか?また、上記の質問に関連して、これらのネット労働者はどのように遺言執行者と協力しますか?それらはI/Oだけを処理しますか?チャネルの読み取りと書き込みですか?

編集:Nettyは、デフォルトで(2 *コア数)ワーカースレッドを作成します。

14
gravetii

指定したExecutorは、rpcのコールバックを実際に実行するものです。これにより、EventLoopが解放され、接続でデータの処理を続行できます。新しいメッセージがネットワークから到着すると、イベントループで読み取られ、スタックを上ってエグゼキュータに伝播されます。エグゼキュータはメッセージを受け取り、実際にデータの処理を行うServerCall.Listenerに渡します。

デフォルトでは、gRPCはキャッシュされたスレッドプールを使用するため、開始は非常に簡単です。ただし、独自のエグゼキュータを提供することを強くお勧めします。その理由は、デフォルトのスレッドプールが負荷の下で正しく動作せず、残りがビジーのときに新しいスレッドを作成するためです。

イベントループグループを設定するには、NettyServerBuilderで workerEventLoopGroup メソッドを呼び出します。 gRPCはNettyに厳密に依存していないため(他のサーバートランスポートも可能)、Netty固有のビルダーを使用する必要があります。

17