網状のいくつかの理解

Nettyそれは、高性能、非同期イベント駆動型でNIO提供するフレームワークTCPUDPサポート、およびファイル転送。最も人気のようNIOなフレームワークNetty、インターネットの分野では、ビッグデータは、このような用途の広い範囲へのアクセスとして、ゲーム業界、通信業界を、分散コンピューティング、業界をリードするオープンソースコンポーネントの一部も基づいているビルドするためのフレームワーク。NettyNIO

Netty活用しJava、使いやすい提供するために、その背後の複雑さを隠し、高度なネットワークの能力API、より高速な伝送、高い並列性を有している、クライアント/サーバーを構築することが、より良い包装など。

高い並行性がNetty基づいているNIONonblocking I/O非ブロッキングIOとは対照的に、開発のための)ネットワーク通信フレームワークBIOBlocking I/OブロッキングIO)、その同時パフォーマンスが大幅に改善されています。

高速伝送Nettyの高速伝送のは、実際に依存しているNIO-一つの特徴ゼロコピー

グッドパッケージネッティーNIOは、操作の詳細の多くを使用するAPIに簡単に提供するだけでなく、ハートビート再接続メカニズム、プログラムを開梱スティックパッケージの特性をカプセル化し、迅速かつ効率的に堅牢で高い同時実行アプリケーションを構築することができます。

なぜネッティー?

JDKネイティブ問題プログラムNIO

JDKネイティブは、Webアプリケーションを持っているAPIが、一連の問題、とりわけ以下:

  • NIOライブラリとAPI複雑、面倒に使用します。あなたはマスターする必要があるSelectorServerSocketChannelSocketChannelByteBufferとになります。
  • その他必要が道を開くために、追加のスキルを持っています。精通例えばJavaので、マルチスレッドプログラミング、NIOプログラムが必要とするReactorモードを、あなたはマルチスレッドにあり、ネットワークプログラミングは、高品質な書き込みをするためには、非常に精通しているNIOプログラムを。
  • 満たされた信頼性の能力は、開発のワークロードと難易度が非常に大きいです。例えば、クライアント面は、ネットワークグリッチ、ハーフパックリーダ、キャッシュ障害、異常な処理ネットワークの混雑等ストリーム上を切断し再接続します。NIOプログラミングは、機能の開発によって特徴付けられる比較的容易であるが、容量いっぱいの作業負荷と難易度の信頼性は非常に大きいです。
  • JDK NIOA Bug悪名高い例えばEpoll Bug、それはにつながるSelector最終的にリードする、空のポーリングCPU 100%当局は言うJDK 1.6バージョンがupdate 18するまで、問題を修正しますが、JDK 1.7問題のバージョンがまだ存在しますが、Bugそれのいくつかを軽減する確率は、根本的に発生解決されていません。

Netty 特長

NettyするためにJDK所有して上記の問題を解決するため、カプセル化、主な機能は次のとおりです。NIOAPI

  • エレガントのトランスポート・タイプの調和のために設計されたAPIブロッキング及び非ブロッキングSocket高度にカスタマイズスレッドモデル-単一のスレッド、一つ以上のスレッドプール;明確懸念を分離し、柔軟で拡張可能なイベントモデルに基づいて、真(からコネクションレスのデータグラムソケットのサポート3.1開始)。
  • 使いやすい、詳細なレコードJavadoc、ユーザーガイドおよび実施例; NO他の依存関係、JDK 5()Netty 3.x又は6()Netty 4.xで十分です。
  • パフォーマンス、より高いスループット、低遅延、リソースの消費を減らす、不要なメモリコピーを最小限に抑えます。
    完全に安全、SSL/TLSおよびStartTLSサポート。
  • コミュニティ活動家は、常に、社会活動家を更新し、見つかった短いバージョンの反復が、Bug時間内に修復することができ、同時に、より多くの新機能が追加されます。

ネッティー内部実行フロー

サーバー:image.pngimage.png

  • 作成ServerBootStrap事例
  • セットとバインドReactorスレッドプールは:EventLoopGroupEventLoopこのスレッドのすべてを処理するために登録されたSelector上でChannel
  • セットとバインドサービス側Channel
  • プロセスのネットワークイベントを作成ChannelPipelineしてhandler、流れの中の流れネットワークタイムの形で、handlerカスタム機能の大部分を完了するには:等コーデックとしてSSl安全認証
  • バインディングとポートをリスニングを開始
  • 準備ができたらと回転トレーニングchannelによって後のReactorスレッド:NioEventLoop実装pipline方法の、最終的なスケジューリングと実行channelHandler

クライアント:ネッティークライアントは、タイミング図を作成します.PNGimage.png

ネッティーアーキテクチャ設計

次のように図の主な特徴は以下のとおりです。image.png

Netty 次のような機能は次のとおりです。

  • トランスポートサービス、サポートBIONIO
  • コンテナの統合、サポートOSGIJBossMCSpringGuiceコンテナ。
  • プロトコルHTTPのサポートProtobufバイナリ、テキスト、WebSocketおよび一般的な一連のプロトコルがサポートされています。また、コーディングおよびロジックをデコードし実行することで実現カスタム・プロトコルをサポートしています。
  • Coreコア、スケーラブルなイベントモデル、ユニバーサルコミュニケーションAPI、ゼロコピーのサポートByteBufバッファオブジェクト。

モジュールアセンブリ

BootstrapServerBootstrap

Bootstrapガイド手段であるNetty通常で構成されたアプリケーションBootstrapの開始、主な役割は、全体の構成ですNetty、プログラムをシリーズでさまざまなコンポーネントのクラスは、クラスブートクライアントプログラム、あるブートサーバクラス。NettyBootstrapServerBootstrap

FutureChannelFuture

先に述べたように、NettyすべてのIO操作は非同期で、すぐにメッセージが正しく処理されているかどうか分かりません。

しかし、しばらくすると、直接リスナーを登録完了または実行することができるよう、具体的な実装は、経由でFutureChannelFutures、彼らは監視の操作の成功または失敗は自動的にイベントをリッスンするために、登録トリガされるリスナーを登録することができます。

Channel

Nettyネットワーク通信の構成要素は、ネットワーク実行するために使用することができるI/O動作を制御します。Channelをユーザーに提供するには:

  • 現在のチャネルネットワーク接続の状態(例えば、開くかどうか?あなたが接続されていますか?)
  • 接続のためのネットワーク設定パラメータ(例えば、サイズを受信バッファ)
  • これは、非同期ネットワークの提供I/Oあらゆることを、(ポートにバインドするために、このような接続を確立するなど、読み取りおよび書き込み)操作は非同期呼び出し手段をI/O呼び出しはすぐに返され、要求への呼び出しの終わりを保証するものではありません。I/O操作が完了しました。すぐにコールを返すChannelFutureにリスナーを登録することで、インスタンスをChannelFuture上の、あなたがすることができI/O、成功した操作発信者通知をコールバックキャンセルするか失敗します。
  • アソシエーション支持I/O対応する処理プログラムを用いて動作を制御します。

異なるプロトコル、ブロックの異なるタイプは、異なる接続有し、Channelそれに対応するタイプ。ここではいくつかの共通しているChannelタイプは:

  • NioSocketChannel非同期クライアントTCP Socket接続。
  • NioServerSocketChannel、非同期サーバーTCP Socket接続。
  • NioDatagramChannel、非同期UDP接続。
  • NioSctpChannel非同期クライアントSctp接続。
  • NioSctpServerChannel、非同期Sctpチャネルカバーサーバ側の接続、UDPおよびTCPネットワークIOおよびファイルをIO

Selector

Netty基づいてSelector達成するためにオブジェクトI/Oによって多重Selectorあなたがスレッドを聞くことができる複数の接続Channelイベント。

以下のようにSelector登録ChannelSelector内部機構が自動的にクエリ(し続けることができるSelectの)これらの登録Channel準備があったか否かをI/Oプログラムが単に使用できるように、(ネットワーク接続など、完了し、読み取り、書き込みなど)イベント複数のスレッドの効率的な管理Channel

NioEventLoop

NioEventLoop維持スレッドやタスクキュー、サポート非同期タスクを提出スレッド開始時に呼び出されるNioEventLooprunメソッドが実行するI/Oタスクと非I/Oタスク:

  • I/OすなわちタスクselectionKeyにおけるreadyようなイベント、acceptconnectreadwrite等、によってprocessSelectedKeysトリガー方法。
  • IOに追加タスク、taskQueueタスクなどregister0bind0および他のタスク、runAllTasksトリガー方法。
    変数の二種類のタスク実行時間比率ioRatio制御は、デフォルトで50は、非許可を示し、IO時間およびタスク実行は、IOタスクの実行時間に等しいです。

NioEventLoopGroup

NioEventLoopGroupメイン管理eventLoopライフサイクルは、内部スレッドのセットを維持するために、スレッドプールとして理解することができ、それぞれは(NioEventLoop)は、複数の処理を担当するChannelイベント、Channel唯一のスレッドに対応します。

ChannelHandler

ChannelHandler処理するためのインターフェースであるI/Oイベント又は傍受I/O操作を、そして転送し、そのするChannelPipeline(処理チェーン)次のハンドラ。

ChannelHandler 自体は多くの方法が実装するために、このインタフェースの必要性があるので使いやすいの間に、それはサブクラスを継承することができ、多くの方法を提供していません。

  • ChannelInboundHandlerInbound処理のI/Oイベントを。
  • ChannelOutboundHandlerアウトバウンド処理するためのI/O動作を制御します。
    または、次のアダプタクラスを使用します:
  • ChannelInboundHandlerAdapterInbound処理のI/Oイベントを。
  • ChannelOutboundHandlerAdapterアウトバウンド処理するためのI/O動作を制御します。
  • ChannelDuplexHandler インバウンドとアウトバウンドのイベントのために。
  • ChannelHandlerContext保存しChannel、関連するすべてのコンテキスト情報だけでなく、関連するChannelHandlerオブジェクト。

ChannelPipline

保存ChannelHandlerList処理または遮断するため、Channelインバウンドとアウトバウンドのイベント操作を。

ChannelPipeline実装遮断フィルタモードの高度なフォーム、ユーザーは、フルコントロールのイベント処理を持っているだけでなく、ChannelそれぞれにChannelHandlerどのように相互作用お互いに。

ネッティー高性能設計

Netty非同期イベント駆動型ネットワーク、その高いパフォーマンスから来ているI/Oモデルとスレッドモデル、かつてどのように決定するかのデータを決定するデータを受信する方法。

I/O 模型

種類のチャンネルの何相互にデータを送信するためにBIONIOまたはAIOI/Oモデルが大きく、性能の枠組みを決定します。

I / Oをブロック

伝統的な閉塞は、I/OBIO)次の図で表すことができます。image.png

次の特性と短所:

  • 各要求は完全なデータに別のスレッドが必要ですRead、ビジネスプロセス、データのWrite整合性の操作上の問題を。
  • 同時必要性の多数は、ハンドル接続、システムリソースの消費に多数のスレッドを作成するとき。
  • 接続が確立された後、現在のスレッドが一時的に読み出すべきデータではない場合、スレッドは、でブロックReadリソーススレッドの浪費をもたらす、操作。

I / Oの多重化モデルimage.pngI/Oモデルを多重化が使用されるSelectこの関数はまた、ブロッキング、及びブロッキング処理を行いますが、I/O違いは、この関数は、複数の同時遮断することができるということであるI/O動作を制御します。

しかし、また同時に読み取り操作を複数に、前記複数の書き込み操作I/O機能は、データの読み取りまたは書き込まれるまで、それは本当に呼び出して、検出されたI/O操作機能を。

NettyノンブロッキングI/O達成の鍵をされに基づいて再利用モデルここで使用し、オブジェクトを表します。I/OSelectorimage.png

NettyIOスレッドは、NioEventLoopマルチプレクサの重合はSelector同時クライアント接続の数百人を扱うことができます。

場合は、クライアントからのスレッドがSocket使用可能なデータがない場合とき、読み取りおよび書き込みデータチャネル、スレッドは他のタスクを実行することができます。

スレッドは通常ノンブロッキングされるIO他のチャネル行うためのアイドル時間IO個々のスレッドが入出力複数のチャネルを管理することができ、動作を制御します。

読み出しおよび書き込み動作が完全に向上させることができ、非ブロッキングであるので、IOスレッドの効率を、頻繁に回避I/Oスレッドサスペンションによって引き起こされる詰まりを。

I/Oスレッドが並行処理できるNクライアント接続をし、読み、基本的に伝統的な同期ブロッキングを解決する書き込み動作、I/Oスレッドモデル、アーキテクチャ、パフォーマンス、弾性スケーラビリティおよび信頼性が大幅に改善された接続を。

Netty スレッドモデル

Netty主に基づいて、マスタ・スレーブマルチスレッドモデル、いくつかの修正を行う(下記参照)から前記マスタマルチスレッド複数のモデルReactorsReactorReactor

MainReactorクライアントの接続要求を担当し、要求がに転送されますSubReactorSubReactor対応するチャネルを担当してIO読み取りおよび書き込み要求。IO要求は(特に論理処理)を待っているタスクキューに直接書き込まれるworker threads処理のために。全体Doug Leeの偉大な神Reactor紹介:Scalable IO in Javaマスター・スレーブの内部のReactorマルチスレッドモデルのビュー:image.png特別な注意事項は以下のとおりですが、Nettyスレッドモデルは、マスタースレーブに基づいてReactor、マルチスレッド、借りMainReactorおよびSubReactor構造。しかし、実際の実装SubReactorWorkerスレッドプール付きのスレッドに。

Netty ゼロコピー

データが送信されると、伝統的な実装は次のとおりです。

File.read(bytes);
Socket.send(bytes);复制代码

この実施形態は、4つのデータとコンテキストスイッチの4つのコピーが必要です。

  • データはカーネルにディスクから読み取られますread buffer
  • データはカーネルバッファからユーザバッファにコピーされます
  • カーネルバッファへのユーザからデータをコピーしますsocket buffer
  • カーネルデータsocket bufferネットワークインタフェース(ハードウェア)バッファにコピー

ゼロコピーの概念

有意第二及び第三工程上記により、必要ではない(基礎となるオペレーティング・システムでサポートされているコースの、)上記2つの余分なコピーを回避する方法javaFileChannel.transferTo

  • 通話transferTo、ファイルからデータをDMAカーネルにコピーエンジンread buffer
  • そして、DMAカーネルからread bufferコピーしたデータのネットワークインタフェースへbuffer

2以上の操作は必要ありませんCPU、私はゼロコピーに達したので、参加します。

Nettyゼロコピーは主に3つの側面に反映されています。

  • bytebuffer

Netty主にメッセージを送信および受信するために使用されbytebufferbytebuffer外部メモリ(使用DirectMemory)を直接Socket読み書きします。

理由:のための伝統的なヒープメモリを使用してSocket読み書き、JVMメモリヒープうbufferに書き込まれた後、メモリに直接コピーをしてsocket、バッファメモリのコピーを複数。DirectMemoryこれは、DMAインタフェースを介してカードに直接送信することができます。

  • Composite Buffers

伝統的には、ByteBuffer次の2つのが必要な場合は、ByteBuffer一緒にデータの組み合わせを、私たちは、最初に作成する必要がありsize=size1+size2、新しいアレイの2つのアレイにデータをコピーし、新しい配列のサイズを。

しかし、の使用Nettyに提供組み合わせがByteBufあるため、あなたは、このような操作を避けることができるCompositeByteBuf本当の複数がBuffer組み合わされていないが、これはゼロコピーを実現するために、データのコピーを避け、それらへの参照を保持しています。

  • 以下のためのFileChannel.transferTo使用

Nettyで使用するFileChannel的transferTo方法、この方法は、ゼロコピーを実現するために、オペレーティング・システムに依存しています。

ブログ記事複数のプラットフォームからこの記事OpenWriteリリース!

詳細については、私のブログをクリックしてくださいムー陳

おすすめ

転載: juejin.im/post/5df4ec2ce51d4557f852c1fb