Reactiveプログラミング(一):Reactiveプログラミングの背景

4024 ワード

Reactiveプログラミングはとても面白くて、今もいろいろな議論があって、概念的には分かりにくいです.本文は具体的な形式で関連する概念を紹介する.Reactiveプログラミングはコンカレントと高性能と概念的にいくつか重なっているが,原理的には全く異なる.Reactiveプログラミングは関数プログラミングと非常に似ています.Reactiveプログラミングは新しい概念ではないと考えています日常業務でよく使われています(javascriptなど).マイクロソフトが作成した新しい発明(Reactiveという名前はC#)だと考えている人もいます.javaプログラミングでは最近似たような技術もあります(Reactive Streams initiativeを参照).Reactiveプログラミングをいつ、どこで使用するかという問題でエラーが発生しやすいです.
1.何ですか.
Reactiveプログラミングは,スマートルーティングとイベント消費を組み合わせて動作を変えるマイクロアーキテクチャスタイルである.この定義は抽象的で、ネット上で他の様々な定義に触れることができます.Reactiveプログラミングの概念は1970年以前にさかのぼることができるので、新鮮な概念ではありませんが、マイクロサービスやマルチコアプロセッサがあるため、現在の企業アプリケーションでは新しい使い方ができています.以下にいくつかの簡単明瞭な説明があります.
Reactive                            。                            。

および
                 ,             。               ,                  ,                。           。

関数プログラミングは、高性能、同時、非同期、非ブロックIOを表すことが多い.最初は関数式でプログラミングする必要がなく,Reactiveモデルはこれらの問題を自然に処理することができる.私たちが本当に関心を持っているのは、これらの問題を解決することです.効率的な関数式プログラミングフレームワークを同期と単一スレッドで実現することができますが、それは意味がありません.
2.Reactiveプログラミングの応用シーン
「何のメリットがあるの?」このような質問は初心者には答えにくい.一般的な適用シーンを説明する例はいくつかあります.
外部サービスコール
現在のバックエンドシステムの多くはRESTfulであり、下位プロトコルはブロックされ同期されている.サービス間では相互に呼び出され、次のリクエストを呼び出すには、最初のリクエスト呼び出しが完了するまで待たなければなりません.クライアントは、サービス側の処理が完了する前にリクエストを放棄する可能性があります.したがって,外部サービス呼び出し,特に複数のサービスを呼び出して処理を完了する必要がある場合は,最適化が必要なシーンである.
同時性の高い情報消費
高同時性のメッセージ処理はエンタープライズアプリケーションの一般的なシーンであり、Reactiveモードはメッセージの処理に非常に適しています(イベントは簡単にメッセージに変換できます).
表計算ドキュメント
これはエンタープライズアプリケーションシーンではありませんが、Reactiveモードはこのようなニーズを簡単に処理することができます.
非同期呼び出しを抽象化
Reactiveプログラミングは,呼び出しが同期的であるか非同期的であるかを気にする必要がなく,単純な非同期プログラミングは煩雑であり,Reactiveモードは非同期プログラミングを簡略化することができる.
3.比較
以下に、Reactiveプログラミングと同様の概念を持ついくつかの技術を示します.
Ruby Event-Machine
Event-Marchineは同時プログラミングの抽象です.Rubyは、高い同時要求を1つの単一スレッドで処理することができます.
Actor Model
オブジェクト向けプログラミングと同様に、Actor Modelはコンピュータ科学の重要な研究方向であり、70年代にすでに存在していた.Actorは計算の抽象であり,同時システムに用いることができる.Actor間ではメッセージが互いに送信されるため,ある意味では反応式である.ActorとReactiveは概念的に高い重合度を持っている.違いは往々にして実装レベルにある(例えばAkkaはプロセス間通信に用いることができ、このフレームワークの顕著な特徴である).
Deferred results (Futures)
Java 1.5はDoug Leaの「java.util.concurrent」を含む多くの新しい特性を導入し、deferred resultという概念があり、Futureにカプセル化されている.これは非同期プログラミングを抽象化する良い例であり,非同期形式で非同期プログラムを開発することができる.単純な同時タスクシーンではFutureは使いやすいが、これらのタスクが相互に依存すると「nested callback hell」に陥る.Reactiveはこのような状況を避けることができます.
Map-reduce and fork-join
並列処理を抽象化することは有意義であり,このような例が多い.Javaプログラミングには最近Map-reduceとfork-joinがあります.Map-reduceはHadoopに用いられ、fork-joinはjdk 1である.7以降のバージョンに付属する機能.この2つの技術はDeferred resultsと類似しており,複雑な組合せ呼び出しシーンには対応できない.
Coroutines
coroutineは互いに制御権を伝達することができ,呼び出し者が統一的に協調することなく,同時プログラミングを簡素化することができる.Reactiveプログラミングはcoroutineで実現できます.FibersとGeneratorsはcoroutineテクノロジーに属しています.
Reactive Programming in Java
JAvaは「reactive」の言語ではなく、Coroutineをオリジナルでサポートすることはできません.JVM上の他の言語(ScalaとClojure)はCoroutineをよくサポートし、javaはjdk 9までサポートしています.しかし、多くの技術はすでにjvm上でReactiveのサポートを実現しています.
Reactive Streams
PublisherとSubscriberインタフェースを提供する非常に下位層の約束です.jdk 9のjavaに統合する.util.concurrent.Flowパッケージにあります.
RxJava
Netflixオープンソースの技術は、内部でReactiveプログラミングを使用して長い間行われています.David KarnokのGenerations of Reactiveの分類によると、RxJavaは第2世代Reactive技術である.
Reactor
Springチームのオープンソース技術.
David KarnokのGenerations of Reactiveの分類によると、RxJavaは第4世代Reactive技術である.
Spring Framework 5.0
Reactiveの機能が内蔵されており、HTTPサービスとクライアントを構築するツールが含まれています.SpringはReactorテクノロジーの上に構築されていますが、ユーザーは最下位がReactorを使用するかRxJavaを使用するかを自由に選択できます.サーバはomcat、Jetty、Netty、Undertowをサポートします.
Ratpack
高性能Webアプリケーションを構築するツールのセットで、Spring Bootはこのフレームワークを直接使用することができます.
Akka
Actorモデルを実現する開発フレームワークで、ScalaやJavaで使用できる、第3世代のReactiveテクノロジーです.
[原句]どうして今?
Reactiveテクノロジーの熱が高まっているのは、サーバリソースを節約し、少量のスレッドでより高い負荷をサポートできるためです.Reactive、非ブロック、非同期は、問題を解決するための良い方法を提供します.しかし、天下には無料の昼食はなく、どの技術にも適用シーンがある.Reactiveは私たちの問題を直接解決することはできませんが、問題を解決する際に選択肢が増えました.
5.まとめ
この文書では、Reactiveプログラミングについて概念的に説明します.次のセクションでは、具体的なコードの例を見てみましょう.最も重要なのは、Reactiveテクノロジーをいつ選択するか、既存のテクノロジーをいつ選択するかを教えてあげます.