5つのシリーズの網状ソースコード分析:網状マルチスレッドモデル

入門

我々は常に言っNetty最後に、それはなぜ高性能アプリケーションである、高性能サーバのですか?スレッドモデルが直接ネットワークアプリケーションのパフォーマンスに影響を与え、します。この記事Nettyモデルの開始をマルチスレッド化は、その高性能な特性を発表しました。

マルチスレッドモデル

質問(1)伝統的なIOモデル

私たち自身である場合はNetty、ネットワークアプリケーションの設計者、あなたは高性能ネットワーク・アプリケーションを設計したい、顔に最初の問題は、ネットワークプログラミングのパフォーマンスのボトルネックを解決する方法です。だから、ネットワークアプリケーションのパフォーマンスのボトルネック、それは何ですか?我々は、すべての伝統的なネットワークアプリケーションが使用していることを知ってBIOブロックしているモデルをIOネットワークプログラム処理の中read()及びwrite()動作現在のスレッドをブロックします。このため、従来ではIO、各モデル間のsocket接続処理のために別のスレッドを有することになります。
ここに画像を挿入説明
クライアント接続が何百万-十億レベルかもしれないが、インターネットの現在の年齢では、サーバはクライアントの要求を処理するために非常に多くのスレッドを作成できませんでした。これは伝統的であるIO、ネットワーク接続パフォーマンスのボトルネック。

(2)最適化モデル

伝統の内容としてはIO、パフォーマンスのボトルネックモデルは、各サーバのために必要とされるsocketビジネスプロセスのニーズを満たすためにスレッドを割り当てる接続。また、クライアントの要求を処理できるように多くの接続を確立する必要がないようにする方法はありますか?あなたは、スレッドが複数の要求を処理したい場合は、それがBIO実現することはできません。したがって、我々は使用することができ、熟練最適化このセクションの操作を。練習が使用するモードを、いわゆるモードは、I / Oマルチプレクサ同期機構ノンブロッキングを使用してモードです。説明を展開するもうありません。javaNIONettyReactorReactor

ではNetty世界では、EventLoopGroupそれは非常に重要な中心的な概念です。いわゆるEventLoopGroupということであるEventLoopコレクションはイベントループです。どのNioEventLoopポーリング・マルチプレクサを担当し、捕捉チャネルは、ネットワーク接続、クライアントの要求へのアクセス、読み取りおよび書き込みに関連する操作を実行する、レディ状態に既にあります。bossGroup接続要求を処理するために使用され、workerGroupハンドルの読み取りおよび書き込み要求に使用されています。bossGroup接続要求を処理した後、接続をするために提出されworkerGroup、処理されるべきworkerGroup複数有しEventLoopworkerGroup実際の読み取りおよび書き込み操作を処理することです。新しい接続がこれに転送されることに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処理readwriteイベント。

88元記事公開 ウォン称賛49 ビューに10万+を

おすすめ

転載: blog.csdn.net/Diamond_Tao/article/details/105031472