リアクティブはじめに

1.コンセプト

反応は、低遅延、高スループットのワークロードに最適です。

反応プロセスは、開発者は、非ブロッキング非同期アプリケーションを構築することを可能にするパラダイム(仕様)であり、背圧を処理することができるアプリケーション(フロー制御)

反応ストリームは、非同期フローブロッキング背圧のための標準的な処理を提供します。

反応器は、 JVMをノンブロッキングにアプリケーションを構築するための応答反応ストリーム明細書で第四世代のデータベースに基づいています。

プロジェクトの原子炉は、 背中のサポートが含まれ、完全にノンブロッキングの基礎です。これは、春の生態系応答スタックの基礎であり、そのような春WebFlux、春データ春クラウドゲートウェイなどの項目でその存在感を示しています。プロジェクトの原子炉は、効率的な応答システムを使用することができます。反応ストリームは、ちょうどそのプロジェクト炉が達成され、規範であると述べました。

2.反応プログラミング

リアクティブプログラミングは、非同期プログラミングスタイルであり、それは、拡散データストリームの変化を懸念しています。

プログラミング・データ・ストリームと伝搬宣言型プログラミングパラダイムに関連する変化に応答して。この例を使用して、簡単にスタティックを表すことができる(例えば、アレイ)または動的(例えば、イベント・エミッタ)データストリーム、またその自動データフローを変更するのに役立つ推論依存性に関連したモデルの実装スプレッド。 

反応プログラミング(反応性プログラミング)

命令型プログラミング(プログラミングコマンド)

命令型プログラミングでは、:= B + C、B + C手段結果は、BまたはCに割り当てられ、その後、値の変化がの値に影響を与えないこと。プログラミングに応答して、自動的に更新BまたはCの値が変化し、再実行する必要はありません:= B + Cが現在割り当てられているの値を決定します。(PS:それは、angularjsようでないこのMVVMフレームワークをvuejs、結合モデルを表示する、モデルが変更され、ビューが自動的に追従するように変更されます)

例えば、モデル・ビュー・コントローラ(MVC)アーキテクチャ、反応プログラミングは、基礎となるモデルの変化に寄与することができ、その変更は自動的に関連付けられたビューに反映されています。

一般的に使用応答オブザーバープログラミングとオブジェクト指向プログラミングモデルは、多くの類似点を持っています。

観点からのプッシュとプルが、その後、反応性プログラミングは「プッシュ」であるならば、それは、その加入者にプッシュ変更するためのイニシアチブをとるだろう。出版社、加入者は、2つの非常に重要な概念です。

ソースからのデータストリームを想像し、それはノードのプロセスを通過し、最終的に目的地に到達します。完了した処理の流れは次のノード、次に行う再放射に出て送信する後に、オペレータノードに相当します。

私はいつもこのプロセスは非常にApacheの嵐のアプローチのように、非常に精通していると感じています。1つのトポロジでは、データがどこかで最終的に一緒にいくつかのボルトをあしらった、スパウトから送られた流れ。

理解があり、私はそれが非常に良いと思い、彼は反応性のプログラミングは、非同期トランザクションとデータフローを通じて、ビルド関係のプログラミングモデルであると述べました。物事は、プロセスに一度、実装プロセスに一度のプロセスを理解することがあります。リアクティブプログラミングは関係、トランザクション、およびトランザクション間の関係を構築することです。データストリームは、ストリームは、次のトランザクション1つのトランザクションから流れ、ブリッジのようです。

想像長江は東シナ海に続いイーピン、瀘州、重慶、フーリン、Wanzhou、宜昌、荊州、武漢、黄石、鄂州、九江、安慶、銅陵、蕪湖、南京、上海を通って流れ、そして。

今後CompleteFutureのように同じ振り付けも。

基本的に、反応性のプログラミングは、データストリームに対する応答があるか、いくつかの変更が行われますが、この変化は、不明であるとき、彼は、問題に対処する上での非同期コールバック方法を基づいていますので、

3. NIO

NIO(非ブロッキングI / O)

BIO(I / Oブロック)

スレッドの古典的モデルでは、socket.accept()、socket.read()、socket.write()関数は、主に3つの同期ブロック接続I / Oを処理する場合と、システムがブロックされていますあなたはシングルスレッドを使用している場合は、それがブロックされますが、CPUがブロックされていないマルチスレッドの場合、あなたはCPUがより多くの物事を処理するためにさせることができます。実際には、これはすべての使用複数のスレッドの本質は次のとおりです。システムをブロックI / Oが、CPUがアイドル状態のときに、彼らはマルチスレッドCPUリソースを活用することができます。しかし、スレッドの作成は、破壊は、スイッチングコストが非常に高いです。

実際には、すべてのシステムのI / Oは、2つの段階に分かれています:待って、動作可能。例えば、読み出し機能、および真の読み取りのためのシステムが待機に読み込まれ、同様に、書き込み機能と実際の書き込みのためにカードを待機に書き込むことができます。

このブロックは、CPUの使用率を待つ準備ができていないことに留意すべきである、「無駄に待っていた」され、そして真のブロッキング読み取りおよび書き込み操作は、CPU、実際の使用することです「仕事を。」

例としてsocket.read()で:

データが受信されるまではデータ、機能ブロックが存在しないTCP RecvBuffer場合socket.read内部の伝統的なBIO()は、戻り値は、データを読み取ります。

NIOの場合は、TCP RecvBufferデータならば、データがメモリカードから読み出され、ユーザーに返さ入れ、それ以外の場合は、直接バック0に、ブロックされたことはありません。 

BIOモデルでは、最後に書き込み、読み取ることができない、唯一のことはできないことを知ってする方法はありません「Shadengが。」NIOモデルでは、接続を読み取ることができない場合()socket.read(0又はsocket.write()戻り0を返す)、我々は、典型的には、セレクタ内の記録モードフラグレジスタに、それを降ろすことができ、その後、読み取りおよび書き込みを継続する他の準備接続(チャネル)に切り替えます。

読書の準備、執筆の準備、新しい接続の到着があります:いくつかの主要なイベントNIOがあります。まあ、それはに対応するいくつかのイベントを来るとき、最初にすべての必要性のプロセッサを登録するには、その後、適切なタイミングでイベントセレクタを言う:私はサイクルに死んで準備して、このイベントに最後のイベントを興味を持っています。選択あなたが安全にしばらく(真)でCPUのアイドルを恐れることなく、この関数の内部を呼び出すことができるように、ブロックされています。

要約:すべての利害登録されたイベントハンドラは、シングルスレッドのポーリングは、イベントプロセッサを準備するイベントを選択してください。

我们大概可以总结出NIO是怎么解决掉线程的瓶颈并处理海量连接的:

NIO由原来的阻塞读写(占用线程)变成了单线程轮询事件,找到可以进行读写的网络描述符进行读写。除了事件的轮询是阻塞的(没有可干的事情必须要阻塞),剩余的I/O操作都是纯CPU操作,没有必要开启多线程。

NIO由原来的阻塞读写(占用线程)变成了单线程轮询事件,找到可以进行读写的网络描述符进行读写。除了事件的轮询是阻塞的(没有可干的事情必须要阻塞),剩余的I/O操作都是纯CPU操作,没有必要开启多线程。并且由于线程的节约,连接数大的时候因为线程切换带来的问题也随之解决,进而为处理海量连接提供了可能。单线程处理I/O的效率确实非常高,没有线程切换,只是拼命的读、写、选择事件。但现在的服务器,一般都是多核处理器,如果能够利用多核心进行I/O,无疑对效率会有更大的提高。

 

Buffer(缓冲区)

在NIO中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的;在写入数据时,它也是写入到缓冲区中的。 

Channel(通道)

通道是一个对象,通过它可以读取和写入数据,当然了所有数据都通过Buffer对象来处理。我们永远不会将字节直接写入通道中,相反是将数据写入包含一个或者多个字节的缓冲区。同样不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。

Selector(选择器)

Selector类是NIO的核心类,Selector(选择器)选择器提供了选择已经就绪的任务的能力。Selector会不断的轮询注册在上面的所有channel,如果某个channel为读写等事件做好准备,那么就处于就绪状态,通过Selector可以不断轮询发现出就绪的channel,进行后续的IO操作。一个Selector能够同时轮询多个channel。这样,一个单独的线程就可以管理多个channel,从而管理多个网络连接。这样就不用为每一个连接都创建一个线程,同时也避免了多线程之间上下文切换导致的开销。

 

 

参考:

https://spring.io/reactive

https://www.jianshu.com/p/d47835316016

https://www.cnblogs.com/haimishasha/p/10756448.html

https://tech.meituan.com/2016/11/04/nio.html 

おすすめ

転載: www.cnblogs.com/cjsblog/p/12568502.html