ネットアーキテクチャの原理



Principle Netty Architecture



  • Nettyとは
    Nettyは、非同期のイベント駆動型ネットワークアプリケーションフレームワークとツールを提供して、高性能で信頼性の高いネットワークサーバーおよびクライアントプログラムを迅速に開発します。
    言い換えれば、NettyはNIOベースのクライアントおよびサーバー側のプログラミングフレームワークです。 Nettyを使用すると、特定のプロトコルを実装するクライアントなどのネットワークアプリケーションをすばやく簡単に開発できます。3。サーバーアプリケーション。 Nettyは、ネットワークアプリケーションのプログラミング開発プロセスを簡素化および合理化することと同等です。たとえば、TCPおよびUDPに基づくソケットサービス開発です。
    簡単に言えば、Nettyは高い同時実行性を処理できるネットワークサービスアーキテクチャです。 Nettyを使用すると、独自のHTTPサーバー、FTPサーバー、UDPサーバー、RPCサーバー、WebSocketサーバー、Redisプロキシサーバー、MySQLプロキシサーバーなどを実装できます。

  • Netty、なぜそれを使うのか
    まず、分散アーキテクチャのノード間のリモートサービス呼び出し、高性能RPCフレームワークなど、自分でtcpサーバーを構築するなど、nettyを使用できる場所です。



  • Nettyの特徴
    Nettyの3層ネットワークアーキテクチャは次のように設計されています。
    第1層:原子炉通信スケジューリング層。この層の主な役割は、ネットワーク接続と読み取りおよび書き込み操作を監視し、ネットワーク層のデータをメモリバッファーに読み取り、接続の作成、接続のアクティブ化、読み取りイベントなどのさまざまなネットワークイベントをトリガーすることです。イベントの書き込みなど。これらのイベントはパイプラインにトリガーされ、その後、パイプラインが後続の処理として機能する責任のパイプラインがトリガーされます。
    2番目のレイヤー:責任チェーンのパイプラインレイヤー。責任のあるイベントは、責任チェーン内で整然と順方向(逆方向)に伝播され、責任チェーンを動的に調整する責任もあります。パイプラインは、関心のあるイベントを監視および処理することを選択できます。
    3番目の層:ビジネスロジック処理層。通常、次の2つのカテゴリに分類できます。ログ、注文処理などの純粋なビジネスロジック処理。 b。 HTTP(S)プロトコル、FTPプロトコルなどのアプリケーション層プロトコル管理。

最初の2つのフロアの探索の旅を始めましょう:



原子炉通信スケジューリング層:
nettyは、非同期のイベント駆動型ネットワークです。高性能は主にI / Oモデルとスレッド処理モデルに由来します。前者はデータの送受信方法を決定し、後者はデータの処理方法を決定します。

  • ネットワークI / Oモデルに関しては、Nettyは非ブロッキングI / Oベースの実装を使用し、最下層はJDKNIOフレームワークのセレクターに依存しています。
  • スレッドスケジューリングモデルに関して、NettyはReactor(リアクターモード)スレッドモデルを使用します。
    IO多重化論理図:
    画像
    1つのI / Oスレッドは、N個のクライアント接続と読み取りおよび書き込み操作を同時に処理できます。これにより、従来の同期ブロッキングI / O 1接続1スレッドモデルが根本的に解決され、アーキテクチャのパフォーマンス、柔軟性、信頼性が大幅に向上しました。
    ここでのセレクターは、新しい接続要求があるかどうかを常に検出するwhile(true)ループ内のスレッドとして理解できます。設計モードの観点から、分析は反応ペアモード(リアクター)を使用することです。
    Reactorモデルには2つの主要なコンポーネントがあります。

1)Reactor:Reactorは別のスレッドで実行され、イベントの監視と配布、およびIOイベントに反応するための適切なハンドラーへの配布を担当します。それは会社の電話オペレーターのようなもので、顧客からの電話に応答し、適切な連絡先に回線を転送します

2)ハンドラー:ハンドラーがI / Oイベントを実行して完了する実際のイベント。これは、顧客が話したい会社の実際の役人と同様です。 Reactorは適切なハンドラーをスケジュールすることでI / Oイベントに応答し、ハンドラーは非ブロッキング操作を実行します。
画像
Reactorの数とHanndlerスレッドの数に応じて、Reactorモデルには次の3つのバリエーションがあります。



1)シングルリアクターシングルスレッド
画像
すべてのIO操作は1つのスレッドで完了します。つまり、多重化、イベントの配布、および処理は1つのスレッドで完了します。 **クライアントの接続要求を受け入れるためとサーバーへの両方
接続を開始するには、要求または応答/応答メッセージを送信または読み取る必要があります。ただし、スレッドが数百または数千のリンクを同時に処理する場合、パフォーマンスはサポートされません。イベント本体が大きい場合は遅くなります。スレッドが無限ループに入ると、プログラム全体が利用できなくなります。高負荷、大規模な同時アプリケーションシナリオは不適切です。

2)シングルリアクターマルチスレッド
画像
ポートのリッスンとクライアントからのTCP接続要求の受け入れのみを担当するNIOスレッドがあり、NIOスレッドプールはネットワークIO操作、つまりメッセージの読み取り、デコード、エンコード、および送信を担当します。ただし、100万のクライアント接続要求が同時に発生する場合、NIOスレッドのパフォーマンスが不十分になる可能性があります。
3)マスタースレーブリアクターのマルチスレッド。
画像
Acceptorスレッドは、リスニングポートをバインドし、クライアント接続を受け入れ、メインスレッドプールのReactorスレッドのマルチプレクサからSocketChannelを削除し、子スレッドプールに再登録するために使用されます。スレッドでは、Iを処理するために使用されます。 / O読み取りおよび書き込み操作。これにより、メインスレッドがアクセス認証、ハンドシェイク、およびその他の操作のみを担当するようになります。
実際、これは、メインスレッドが監視し、監視した後、メインスレッドによって監視されたイベントを子スレッドに移動することを意味します。
特に、NettyのスレッドモデルはマスタースレーブReactorのマルチスレッドに基づいていますが、MainReactorとSubReactorの構造を借用しています。ただし、実際の実装では、SubReactorスレッドとWorkerスレッドは同じスレッドプールにあります。

EventLoopGroup bossGroup = newNioEventLoopGroup() EventLoopGroup workerGroup = newNioEventLoopGroup() ServerBootstrap server = newServerBootstrap() server.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class)

上記のコードのbossGroupとworkerGroupは、Bootstrapコンストラクターで渡される2つのオブジェクトです。どちらのグループもスレッドプールです。

1)bossGroupスレッドプールは、バインド内の特定のポートの後にMainReactorとしてスレッドの1つのみを取得します。これは、ポートのAcceptイベントを具体的に処理し、各ポートはBossスレッドに対応します。

2)workerGroupスレッドプールは、さまざまなSubReactorおよびWorkerスレッドによって完全に利用されます。
デューティチェーンパイプラインレイヤー: