入門
我々は常に言っNetty
最後に、それはなぜ高性能アプリケーションである、高性能サーバのですか?スレッドモデルが直接ネットワークアプリケーションのパフォーマンスに影響を与え、します。この記事Netty
モデルの開始をマルチスレッド化は、その高性能な特性を発表しました。
マルチスレッドモデル
質問(1)伝統的なIOモデル
私たち自身である場合はNetty
、ネットワークアプリケーションの設計者、あなたは高性能ネットワーク・アプリケーションを設計したい、顔に最初の問題は、ネットワークプログラミングのパフォーマンスのボトルネックを解決する方法です。だから、ネットワークアプリケーションのパフォーマンスのボトルネック、それは何ですか?我々は、すべての伝統的なネットワークアプリケーションが使用していることを知ってBIO
ブロックしているモデルをIO
。ネットワークプログラム処理の中read()
及びwrite()
動作現在のスレッドをブロックします。このため、従来ではIO
、各モデル間のsocket
接続処理のために別のスレッドを有することになります。
クライアント接続が何百万-十億レベルかもしれないが、インターネットの現在の年齢では、サーバはクライアントの要求を処理するために非常に多くのスレッドを作成できませんでした。これは伝統的であるIO
、ネットワーク接続パフォーマンスのボトルネック。
(2)最適化モデル
伝統の内容としてはIO
、パフォーマンスのボトルネックモデルは、各サーバのために必要とされるsocket
ビジネスプロセスのニーズを満たすためにスレッドを割り当てる接続。また、クライアントの要求を処理できるように多くの接続を確立する必要がないようにする方法はありますか?あなたは、スレッドが複数の要求を処理したい場合は、それがBIO
実現することはできません。したがって、我々は使用することができ、熟練最適化このセクションの操作を。練習が使用するモードを、いわゆるモードは、I / Oマルチプレクサ同期機構ノンブロッキングを使用してモードです。説明を展開するもうありません。java
NIO
Netty
Reactor
Reactor
ではNetty
世界では、EventLoopGroup
それは非常に重要な中心的な概念です。いわゆるEventLoopGroup
ということであるEventLoop
コレクションはイベントループです。どのNioEventLoop
ポーリング・マルチプレクサを担当し、捕捉チャネルは、ネットワーク接続、クライアントの要求へのアクセス、読み取りおよび書き込みに関連する操作を実行する、レディ状態に既にあります。bossGroup
接続要求を処理するために使用され、workerGroup
ハンドルの読み取りおよび書き込み要求に使用されています。bossGroup
接続要求を処理した後、接続をするために提出されworkerGroup
、処理されるべきworkerGroup
複数有しEventLoop
、workerGroup
実際の読み取りおよび書き込み操作を処理することです。新しい接続がこれに転送されることにEventLoop
それに対処するために?これは、負荷分散アルゴリズムが必要とするNetty
ポーリングアルゴリズムで使用されています。Netty
支持複数Reactor
ようなシングルスレッドモデル、マルチスレッドからのマスターモデルとしてのモードは、ユーザが実際のシーンに対応するスイッチングパターンを開始するようにパラメータを設定することができ、モデルをマルチスレッド。
(3)解析コード
、シングルスレッドモデル
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup)
.channel(NioServerSocketChannel.class)
...
}
...
コードを見ることができるように、パラメータ1を作成bossGroup
主EventLoopGroupクライアント接続を受信するために使用され、シングルスレッドモデルです。
B、マルチスレッドモデル
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
...
}
...
作成し、別のシングルスレッドモード、マルチスレッドモードworkerGroup
処理するためIO
の動作を、デフォルト数はCPU数の二倍です。
マルチスレッドマスターモデルからC、
このモデルでは、もはや単一のクライアント接続の受信のためのスレッドNIO
のスレッドではなく、スレッドプールを。
//创建boss线程组,处理客户端连接
EventLoopGroup bossGroup = new NioEventLoopGroup(2);
// 创建worker线程组用于SocketChannel 的数据读写
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
// 创建 ServerBootstrap 对象
ServerBootstrap b = new ServerBootstrap();
// 设置EventLoopGroup
b.group(bossGroup, workerGroup)
// 设置要被实例化的为 NioServerSocketChannel 类
.channel(NioServerSocketChannel.class)
...
}
...
概要
本稿では、説明Netty
で使用されるマルチスレッドモデル、Reactor
モデル。接続要求処理の処理IO
スレッド単独運転を。イベントベースのポーリング監視、レディ状態にあるチャネルへの継続的なアクセス。前記Boss
接続要求を処理する責任スレッドプールのスレッドの後に、受信したイベント、対応受け入れるsocket
カプセル化された生成NioSocketChannel
オブジェクトとに送信workBoss
スレッドプール、IO処理read
とwrite
イベント。