リアクティブシステムの簡単な概要

過去数年間、リアクティブシステムについて多くの話題がありました。話題に加えて、リアクティブストリーム、リアクティブ拡張、リアクティブプログラミング、関数型リアクティブプログラミングなど、関連するキーワードサラダのコレクションがあります。テクノロジー業界に長く携わっている場合は、流行語の周期的な浮き沈みを見てきました。と頭字語は時々。それで、そのすべてはもうすぐ日付が付けられる誇大宣伝ですか?

ソフトウェアエンジニアがリアクティブシステムを非同期イベントベースシステムのエイリアスに過ぎないと却下しているのを聞いたことがあります。これは、マイクロサービスをSOA(サービス指向アーキテクチャ)からESB(エンタープライズサービスバス)を差し引いたものとして却下する方法とよく似ています。意味が再発明されたテクノロジーの流行語が頻繁に出現しますが、リアクティブシステムには、その名前が単なる別のエイリアスではないと考えるのに十分な特徴があります。

リアクティブシステムとは何ですか?

リアクティブマニフェストは、リアクティブシステムの本質的な特性(応答性、回復力、弾力性、メッセージ駆動型)について説明しています。それは高レベルの画像を与え、少し一般的に聞こえます。特に、マニフェストに記載されている応答性、回復力、弾力性は、最近の多くの実際のアプリケーションのほぼ標準的な要件です。

おそらく、「メッセージ駆動型」は、リアクティブシステムを他のシステムから真に差別化する要件です。内部的には、リアクティブシステムは、個々のコンポーネント間の境界を確立する非同期メッセージパッシングを介した相互作用に依存しています。このような相互作用モデルは、並行性と分散性のそれぞれについて、時間的および場所的の両方で疎結合への道を開くのに役立ちます。さらに、データフローを調整するための非ブロッキングメカニズムをシステムに統合的に装備することができます(これについては以下で詳しく説明します)。

反応性ストリーム

リアクティブシステムの構築では、データ処理操作が適用可能な場合はいつでも、構成ストリームフローとして定式化される顕著なアプローチがあるようです。これはリアクティブマニフェストの要件の一部ではありませんが、このようなストリーム中心のモデリングアプローチを自然に支持するのは、リアクティブシステムに固有のメッセージ駆動型インタラクションモデルである可能性があります。

明らかに別のイニシアチブとして登場したリアクティブストリームは、ストリーム処理を中心とした特定のタイプのリアクティブシステムと見なすことができ、有向グラフとして構成ストリームを表現します。

背圧

前述の非ブロッキング規制メカニズムの1つは、背圧です。これは、リアクティブストリームを実装するシステムで最も求められている機能である可能性があります。これは、負荷調整のために上流コンポーネントに向かってストリームの反対方向に動作する非同期フィードバックメカニズムです。

ストリームフローをノンブロッキング方式で調整する組み込みの背圧により、システムは比較的安定したメモリ使用率で動作できます。このような機能は、ストリームフロー全体でカスタムビルドのデータバッファリングメカニズムによって通常対処する必要がある、潜在的に壊滅的なスタックオーバーフローの問題(たとえば、遅いデータシンクによって引き起こされる)を排除します。

リアクティブプログラミングはどうですか?

リアクティブシステムを構築するためのプログラミングパラダイムとして、リアクティブプログラミングは、非同期プログラミングロジックをデータストリームとして定式化し、システム内の相関変数の値への変更を自動的に伝播することに重点を置いています。このようなプログラミングパラダイムに使用される言語は、定式化されたストリームを操作するための適切な構成可能な関数を提供します。

設計上、リアクティブプログラミングは、構成可能な関数を使用して計算上の問題を表現および解決する関数型プログラミングスタイルを優先します。それにもかかわらず、関数型リアクティブプログラミングという用語の存在は、このリアクティブな「動き」よりも10年以上前から存在しています。FRPの焦点は大きく異なり、関数を使用して、単純な表示的意味論で連続時間にわたって動作を表現することに重点を置いています。それでも、関数型プログラミングに明確に重点を置いたリアクティブプログラミングと見なされることがよくあります。

コード付きのイラストの方がうまくいく場合は、RxJSを使用したJavaScriptでのリアクティブプログラミングの本質を説明するAndreStaltzのチュートリアル投稿を読むことをお勧めします。

ReactiveX

ReactiveX、別名Reactive Extensionsは、非同期イベントのストリームを処理するための構成操作の使用を可能にするAPIライブラリです。オブザーバブルから拡張して、オブザーバブルとオブザーバブル(オブザーバブルのサブスクライバー)は、フィルタリング、変換、集計などの構成可能な演算子のセットを備えたライブラリの主要な要素を構成します。RxJSとRxJavaは、の最も一般的な実装の2つです。それぞれJavaScriptとJavaのReactiveX。

アッカ俳優

Akkaは、JVM(Java仮想マシン)上でスケーラブルな並行および分散アプリケーションを構築することを目的としたアクターベースのライブラリです。その核となるのは、状態と動作を維持し、非同期メッセージパッシングを介して相互に通信するアクターと呼ばれる計算プリミティブです。

Scalaで書かれたAkkaの俳優は、本質的に軽量で疎結合です。これは、IoTなどのスケーラブルな分散システム向けのAkkaの堅牢なルーティング、シャーディング、およびpub-sub機能と相まって、リアクティブシステムを構築するための優れたプラットフォームになります。

アッカストリーム

リアクティブストリームイニシアチブのフロントランナー(および創設メンバー)は、AkkaStreamsです。これはAkkaアクターの上に構築されており、ストリームトポロジを構築し、高度に構成的な方法でストリームを処理するためのAPIの広範なセットを提供します。私の最近のブログ投稿は、Akkaストリームと、それを使用して基本的なテキストマイニングを実行する方法を中心にしています。

どうやら、リアクティブイニシアチブとしてのAkkaストリームは最近努力しています。Reactive RabbitやReactiveMongo for RabbitMQやMongoDBなどのAkka-Streamsベースのドライバーは、テクノロジー業界で勢いを増し始めています。さらに、Spray REST / HTTPツールキットの次世代であるAkkaHTTPも、基盤となるエンジンとしてAkkaストリームを使用してストリーム対応になるように構築されています。

すべてのストリーム指向—何らかの方法で

リアクティブシステムイニシアチブを採用する勢いが着実に高まっていることから、それは単なる誇大宣伝の段階を超えているようです。それは明らかに、非同期イベントベースのシステムの再発明された流行語以上のものです。技術的なメリットの観点から、それがより目立つようにならない理由はわかりません。それでも、オープンソースのテクノロジーイニシアチブでさえ、商用製品のようなものです。適切なタイミングは、初期段階ですぐに注目を集めることができ、適切なマーケティングは、より幅広いユーザーベースに普及するために必要な継続的な勢いを得るのに役立ちます。

タイミング的には、関数型プログラミングが増えているので、リアクティブシステムの構築にプログラミングスタイルが好意的に取り入れられているので、素晴らしいタイミングだと思います。マーケティングに関しては、イニシアチブのより直感的でわかりやすい命名は、テクノロジー業界によりよく売れると思います。 「リアクティブシステム」という言葉を初めて聞いたとき、意味のあることはほとんど理解できませんでした。 「リアクティブ」という用語は、そのようなシステムで採用されている変更の伝播のいくつかの側面に対応していますが、署名の特徴として聴衆に飛び出すことはありません。

リアクティブシステム、リアクティブストリーム、および主にストリームを中心としたリアクティブプログラミングでは、「ストリーム」という用語は「リアクティブ」よりもわかりやすいキーワードだと思います。一般性をシンプルさと直感で交換し、リアクティブシステムとリアクティブストリームを1つのイニシアチブとして組み合わせ、「リアクティブ」を「ストリーム」を中心としたものに置き換えます。