web-dev-qa-db-ja.com

Nettyはスレッドプールをどのように使用しますか?

Nettyがどのようにスレッドプールを使用して機能するか説明していただけますか?スレッドプールには、ボスとワーカーの2種類があることを正しく理解していますか。ボスのものはI/Oを実行するために使用され、ワー​​カーはデータを処理するためにユーザーコールバック(messageReceived)を呼び出すために使用されますか?

37

これはNioServerSocketChannelFactoryドキュメントからです

サーバーサイドNIOベースのServerSocketChannelを作成するServerSocketChannelFactory。 NIOで導入されたノンブロッキングI/Oモードを利用して、多数の同時接続を効率的に処理します。

スレッドのしくみ
NioServerSocketChannelFactoryには2種類のスレッドがあります。 1つはボススレッドで、もう1つはワーカースレッドです。

ボススレッド
バインドされた各ServerSocketChannelには独自のボススレッドがあります。たとえば、80や443などの2つのサーバーポートを開いた場合、2つのボススレッドがあります。ボススレッドは、ポートがバインド解除されるまで着信接続を受け入れます。接続が正常に受け入れられると、ボススレッドは受け入れたチャネルをNioServerSocketChannelFactoryが管理するワーカースレッドの1つに渡します。

ワーカースレッド
1つのNioServerSocketChannelFactoryは、1つ以上のワーカースレッドを持つことができます。ワーカースレッドは、非ブロッキングモードで1つ以上のチャネルの非ブロッキング読み取りおよび書き込みを実行します。

Nioモデルでは、bossThreadがすべての境界ソケット(リッスンソケット)を処理し、workerThreadがAccepted-socketを処理します(IOを含み、messageReceivedなどのイベントメソッドを呼び出します)。

32
secmask

Netty Nio実装(3.2.4.Final)NioServerSocketChannelFactoryに関連する説明。

ワーカースレッドプール 少なくともワーカー数のスレッド(現在のデフォルトは2 *コア数)を提供できる必要があります。

どうして?

この実装の場合、各ワーカーには独自のセレクターループがあります。これは、各ワーカーが1つのスレッドを「食べて」、セレクターでスリープすることを意味します。また、そのワーカー(および関連するスレッド)は、実際のすべての書き込みと読み取り(パイプラインでのイベントの起動を含む、つまりハンドラーがそのワーカースレッドで実行されることを含む)を実行する責任があります。

ボスの場合 現在の実装ではスレッドプールを1つしか取得しないため、スレッドプールは実際には不要です。そのスレッドは、接続を受け入れた後、ほとんどの場合、サーバーソケットのセレクターでスリープ状態になり、その接続はワーカーに登録されます。その瞬間から、ワーカーはその接続を提供する責任があります。

17
Lukasz Wysocki