Netty
それは、高性能、非同期イベント駆動型でNIO
提供するフレームワークTCP
、UDP
サポート、およびファイル転送。最も人気のようNIO
なフレームワークNetty
、インターネットの分野では、ビッグデータは、このような用途の広い範囲へのアクセスとして、ゲーム業界、通信業界を、分散コンピューティング、業界をリードするオープンソースコンポーネントの一部も基づいているビルドするためのフレームワーク。Netty
NIO
Netty
活用しJava
、使いやすい提供するために、その背後の複雑さを隠し、高度なネットワークの能力API
、より高速な伝送、高い並列性を有している、クライアント/サーバーを構築することが、より良い包装など。
高い並行性がNetty
基づいているNIO
( Nonblocking I/O
非ブロッキングIO
とは対照的に、開発のための)ネットワーク通信フレームワークBIO
( Blocking I/O
ブロッキングIO
)、その同時パフォーマンスが大幅に改善されています。
高速伝送Netty
の高速伝送のは、実際に依存しているNIO
-一つの特徴ゼロコピー。
グッドパッケージネッティーNIOは、操作の詳細の多くを使用するAPIに簡単に提供するだけでなく、ハートビート再接続メカニズム、プログラムを開梱スティックパッケージの特性をカプセル化し、迅速かつ効率的に堅牢で高い同時実行アプリケーションを構築することができます。
なぜネッティー?
JDK
ネイティブ問題プログラムNIO
JDK
ネイティブは、Webアプリケーションを持っているAPI
が、一連の問題、とりわけ以下:
NIO
ライブラリとAPI
複雑、面倒に使用します。あなたはマスターする必要があるSelector
、ServerSocketChannel
、SocketChannel
、ByteBuffer
とになります。- その他必要が道を開くために、追加のスキルを持っています。精通例えば
Java
ので、マルチスレッドプログラミング、NIO
プログラムが必要とするReactor
モードを、あなたはマルチスレッドにあり、ネットワークプログラミングは、高品質な書き込みをするためには、非常に精通しているNIO
プログラムを。 - 満たされた信頼性の能力は、開発のワークロードと難易度が非常に大きいです。例えば、クライアント面は、ネットワークグリッチ、ハーフパックリーダ、キャッシュ障害、異常な処理ネットワークの混雑等ストリーム上を切断し再接続します。
NIO
プログラミングは、機能の開発によって特徴付けられる比較的容易であるが、容量いっぱいの作業負荷と難易度の信頼性は非常に大きいです。 JDK NIO
ABug
。悪名高い例えばEpoll Bug
、それはにつながるSelector
最終的にリードする、空のポーリングCPU 100%
。当局は言うJDK 1.6
バージョンがupdate 18
するまで、問題を修正しますが、JDK 1.7
問題のバージョンがまだ存在しますが、Bug
それのいくつかを軽減する確率は、根本的に発生解決されていません。
Netty
特長
Netty
するためにJDK
所有して上記の問題を解決するため、カプセル化、主な機能は次のとおりです。NIO
API
- エレガントのトランスポート・タイプの調和のために設計された
API
ブロッキング及び非ブロッキングSocket
高度にカスタマイズスレッドモデル-単一のスレッド、一つ以上のスレッドプール;明確懸念を分離し、柔軟で拡張可能なイベントモデルに基づいて、真(からコネクションレスのデータグラムソケットのサポート3.1
開始)。 - 使いやすい、詳細なレコード
Javadoc
、ユーザーガイドおよび実施例; NO他の依存関係、JDK 5
()Netty 3.x
又は6
()Netty 4.x
で十分です。 - パフォーマンス、より高いスループット、低遅延、リソースの消費を減らす、不要なメモリコピーを最小限に抑えます。
完全に安全、SSL/TLS
およびStartTLS
サポート。 - コミュニティ活動家は、常に、社会活動家を更新し、見つかった短いバージョンの反復が、
Bug
時間内に修復することができ、同時に、より多くの新機能が追加されます。
ネッティー内部実行フロー
サーバー:
- 作成
ServerBootStrap
事例 - セットとバインド
Reactor
スレッドプールは:EventLoopGroup
、EventLoop
このスレッドのすべてを処理するために登録されたSelector
上でChannel
- セットとバインドサービス側
Channel
- プロセスのネットワークイベントを作成
ChannelPipeline
してhandler
、流れの中の流れネットワークタイムの形で、handler
カスタム機能の大部分を完了するには:等コーデックとしてSSl
安全認証 - バインディングとポートをリスニングを開始
- 準備ができたらと回転トレーニング
channel
によって後のReactor
スレッド:NioEventLoop
実装pipline
方法の、最終的なスケジューリングと実行channelHandler
クライアント:
ネッティーアーキテクチャ設計
次のように図の主な特徴は以下のとおりです。
Netty
次のような機能は次のとおりです。
- トランスポートサービス、サポート
BIO
とNIO
。 - コンテナの統合、サポート
OSGI
、JBossMC
、Spring
、Guice
コンテナ。 - プロトコル
HTTP
のサポート、Protobuf
バイナリ、テキスト、WebSocket
および一般的な一連のプロトコルがサポートされています。また、コーディングおよびロジックをデコードし実行することで実現カスタム・プロトコルをサポートしています。 Core
コア、スケーラブルなイベントモデル、ユニバーサルコミュニケーションAPI
、ゼロコピーのサポートByteBuf
バッファオブジェクト。
モジュールアセンブリ
Bootstrap
、ServerBootstrap
Bootstrap
ガイド手段であるNetty
通常で構成されたアプリケーションBootstrap
の開始、主な役割は、全体の構成ですNetty
、プログラムをシリーズでさまざまなコンポーネントのクラスは、クラスブートクライアントプログラム、あるブートサーバクラス。Netty
Bootstrap
ServerBootstrap
Future
、ChannelFuture
先に述べたように、Netty
すべてのIO
操作は非同期で、すぐにメッセージが正しく処理されているかどうか分かりません。
しかし、しばらくすると、直接リスナーを登録完了または実行することができるよう、具体的な実装は、経由でFuture
とChannelFutures
、彼らは監視の操作の成功または失敗は自動的にイベントをリッスンするために、登録トリガされるリスナーを登録することができます。
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
登録Channel
、Selector
内部機構が自動的にクエリ(し続けることができるSelect
の)これらの登録Channel
準備があったか否かをI/O
プログラムが単に使用できるように、(ネットワーク接続など、完了し、読み取り、書き込みなど)イベント複数のスレッドの効率的な管理Channel
。
NioEventLoop
NioEventLoop
維持スレッドやタスクキュー、サポート非同期タスクを提出スレッド開始時に呼び出されるNioEventLoop
のrun
メソッドが実行するI/O
タスクと非I/O
タスク:
I/O
すなわちタスクselectionKey
におけるready
ようなイベント、accept
、connect
、read
、write
等、によってprocessSelectedKeys
トリガー方法。- 非
IO
に追加タスク、taskQueue
タスクなどregister0
、bind0
および他のタスク、runAllTasks
トリガー方法。
変数の二種類のタスク実行時間比率ioRatio
制御は、デフォルトで50
は、非許可を示し、IO
時間およびタスク実行は、IO
タスクの実行時間に等しいです。
NioEventLoopGroup
NioEventLoopGroup
メイン管理eventLoop
ライフサイクルは、内部スレッドのセットを維持するために、スレッドプールとして理解することができ、それぞれは(NioEventLoop
)は、複数の処理を担当するChannel
イベント、Channel
唯一のスレッドに対応します。
ChannelHandler
ChannelHandler
処理するためのインターフェースであるI/O
イベント又は傍受I/O
操作を、そして転送し、そのするChannelPipeline
(処理チェーン)次のハンドラ。
ChannelHandler
自体は多くの方法が実装するために、このインタフェースの必要性があるので使いやすいの間に、それはサブクラスを継承することができ、多くの方法を提供していません。
ChannelInboundHandler
Inbound処理のI/O
イベントを。ChannelOutboundHandler
アウトバウンド処理するためのI/O
動作を制御します。
または、次のアダプタクラスを使用します:ChannelInboundHandlerAdapter
Inbound処理のI/O
イベントを。ChannelOutboundHandlerAdapter
アウトバウンド処理するためのI/O
動作を制御します。ChannelDuplexHandler
インバウンドとアウトバウンドのイベントのために。ChannelHandlerContext
保存しChannel
、関連するすべてのコンテキスト情報だけでなく、関連するChannelHandler
オブジェクト。
ChannelPipline
保存ChannelHandler
のList
処理または遮断するため、Channel
インバウンドとアウトバウンドのイベント操作を。
ChannelPipeline
実装遮断フィルタモードの高度なフォーム、ユーザーは、フルコントロールのイベント処理を持っているだけでなく、Channel
それぞれにChannelHandler
どのように相互作用お互いに。
ネッティー高性能設計
Netty
非同期イベント駆動型ネットワーク、その高いパフォーマンスから来ているI/O
モデルとスレッドモデル、かつてどのように決定するかのデータを決定するデータを受信する方法。
I/O 模型
種類のチャンネルの何相互にデータを送信するためにBIO
、NIO
またはAIO
、I/O
モデルが大きく、性能の枠組みを決定します。
I / Oをブロック
伝統的な閉塞は、I/O
(BIO
)次の図で表すことができます。
次の特性と短所:
- 各要求は完全なデータに別のスレッドが必要です
Read
、ビジネスプロセス、データのWrite
整合性の操作上の問題を。 - 同時必要性の多数は、ハンドル接続、システムリソースの消費に多数のスレッドを作成するとき。
- 接続が確立された後、現在のスレッドが一時的に読み出すべきデータではない場合、スレッドは、でブロック
Read
リソーススレッドの浪費をもたらす、操作。
I / Oの多重化モデルにI/O
モデルを多重化が使用されるSelect
この関数はまた、ブロッキング、及びブロッキング処理を行いますが、I/O
違いは、この関数は、複数の同時遮断することができるということであるI/O
動作を制御します。
しかし、また同時に読み取り操作を複数に、前記複数の書き込み操作I/O
機能は、データの読み取りまたは書き込まれるまで、それは本当に呼び出して、検出されたI/O
操作機能を。
Netty
ノンブロッキングI/O
達成の鍵をされに基づいて再利用モデルここで使用し、オブジェクトを表します。I/O
Selector
Netty
IO
スレッドは、NioEventLoop
マルチプレクサの重合はSelector
同時クライアント接続の数百人を扱うことができます。
場合は、クライアントからのスレッドがSocket
使用可能なデータがない場合とき、読み取りおよび書き込みデータチャネル、スレッドは他のタスクを実行することができます。
スレッドは通常ノンブロッキングされるIO
他のチャネル行うためのアイドル時間IO
個々のスレッドが入出力複数のチャネルを管理することができ、動作を制御します。
読み出しおよび書き込み動作が完全に向上させることができ、非ブロッキングであるので、IO
スレッドの効率を、頻繁に回避I/O
スレッドサスペンションによって引き起こされる詰まりを。
I/O
スレッドが並行処理できるN
クライアント接続をし、読み、基本的に伝統的な同期ブロッキングを解決する書き込み動作、I/O
スレッドモデル、アーキテクチャ、パフォーマンス、弾性スケーラビリティおよび信頼性が大幅に改善された接続を。
Netty
スレッドモデル
Netty
主に基づいて、マスタ・スレーブマルチスレッドモデル、いくつかの修正を行う(下記参照)から前記マスタマルチスレッド複数のモデル:Reactors
Reactor
Reactor
MainReactor
クライアントの接続要求を担当し、要求がに転送されますSubReactor
。SubReactor
対応するチャネルを担当してIO
読み取りおよび書き込み要求。非IO
要求は(特に論理処理)を待っているタスクキューに直接書き込まれるworker threads
処理のために。全体Doug Lee
の偉大な神Reactor
紹介:Scalable IO in Java
マスター・スレーブの内部のReactor
マルチスレッドモデルのビュー:特別な注意事項は以下のとおりですが、Netty
スレッドモデルは、マスタースレーブに基づいてReactor
、マルチスレッド、借りMainReactor
およびSubReactor
構造。しかし、実際の実装SubReactor
とWorker
スレッドプール付きのスレッドに。
Netty
ゼロコピー
データが送信されると、伝統的な実装は次のとおりです。
File.read(bytes);
Socket.send(bytes);复制代码
この実施形態は、4つのデータとコンテキストスイッチの4つのコピーが必要です。
- データはカーネルにディスクから読み取られます
read buffer
- データはカーネルバッファからユーザバッファにコピーされます
- カーネルバッファへのユーザからデータをコピーします
socket buffer
- カーネルデータ
socket buffer
ネットワークインタフェース(ハードウェア)バッファにコピー
ゼロコピーの概念
有意第二及び第三工程上記により、必要ではない(基礎となるオペレーティング・システムでサポートされているコースの、)上記2つの余分なコピーを回避する方法java
FileChannel.transferTo
- 通話
transferTo
、ファイルからデータをDMA
カーネルにコピーエンジンread buffer
- そして、
DMA
カーネルからread buffer
コピーしたデータのネットワークインタフェースへbuffer
2以上の操作は必要ありませんCPU
、私はゼロコピーに達したので、参加します。
Netty
ゼロコピーは主に3つの側面に反映されています。
bytebuffer
Netty
主にメッセージを送信および受信するために使用されbytebuffer
、bytebuffer
外部メモリ(使用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リリース!
詳細については、私のブログをクリックしてくださいムー陳