5 Things to Know About Reactive Programming

By Clement Escoffier June 30, 2017August 6, 2020

Reactive、なんとオーバーロードな言葉であることでしょうか。 最近は魔法のようにReactiveになるものが多い。 この投稿では、リアクティブ プログラミング、つまり、非同期データ ストリームを中心に構造化された開発モデルについて説明します。

最初のリアクティブ アプリケーションを書きたいという気持ちはわかりますが、それを行う前に知っておくべきことがいくつかあります。 リアクティブ プログラミングを使用すると、コードの設計と記述の方法が変わります。

この投稿では、リアクティブ プログラミングについて 5 つのことを説明し、リアクティブ プログラミングによって何が変わるかを見ていきたいと思います。 イベント、メッセージ、呼び出し、および障害でさえも、データ ストリームによって伝達されます。 クリック イベント、HTTP リクエスト、取り込まれたメッセージ、アベイラビリティ通知、変数の変更、キャッシュ イベント、センサーからの測定値など、文字通り変更または発生する可能性のあるあらゆるもののデータ ストリームをコード内に作成することになります。 これは、アプリケーションに興味深い副作用をもたらします。

Reactive eXtension (http://reactivex.io, 別名 RX) は、「観測可能なシーケンスを使用して非同期およびイベントベースのプログラムを構成する」反応プログラミング原理の実装です。 RXでは、コードがObservableというデータストリームを作成し、購読する。 リアクティブ・プログラミングは概念に関するものですが、RXは素晴らしいツールボックスを提供します。 オブザーバとイテレータのパターンと関数型イディオムを組み合わせることで、RXは超強力な力を与えてくれます。 データストリームを結合し,マージし,フィルタリングし,変換し,作成するための関数が豊富に用意されているのだ. 次の図は、Java での RX の使用法を示しています (https://github.com/ReactiveX/RxJava を使用)。

RX は反応プログラミング原則の唯一の実装ではありませんが (たとえば、BaconJS – http://baconjs.github.io を引用できます)、今日最もよく使用されているものです。 この記事の残りの部分では、Rx Java を使用します。

2. Observables can be cold or hot – and it matters.

この時点で、プログラムで扱う異なるストリーム(または observable)が何かを確認しようとしていることでしょう。 しかし、ストリームには、ホットとコールドの2つのクラスがあります。 その違いを理解することが、リアクティブ・プログラミングをうまく使うための鍵です。

コールド観測器は怠慢です。 誰かがそれを観察し始める(RXで購読する)までは、何も行いません。 消費されたときだけ実行を開始します。 コールドストリームは、例えば、誰かが結果に興味を持つまで実行されないというような、非同期アクションを表現するために使用されます。 他の例としては、ファイルのダウンロードがある。 誰もそのデータで何かをしようとしなければ、バイトの取り出しは開始されない。 コールド ストリームによって生成されたデータは、購読者間で共有されず、購読するとすべてのアイテムを入手できます。

ホット ストリームは、株式ティッカー、またはセンサーやユーザーによって送信されたデータのように、購読前にアクティブになっています。 データは個々のサブスクライバーから独立しています。 オブザーバーがホットなオブザーバブルを購読すると、購読後に発行されたストリーム内のすべての値を取得します。 この値は、すべてのサブスクライバー間で共有されます。 例えば、誰も温度計を購読していなくても、温度計は現在の温度を測定し、公開します。 サブスクライバーがストリームに登録すると、自動的に次の測定値を受け取ります。

なぜ、ストリームがホットかコールドかを理解することがそれほど重要なのでしょうか。 それは、コードが伝達されたアイテムを消費する方法が変わるからです。 ホットな observable にサブスクライブしていない場合、データを受け取ることができず、このデータは失われます。

Develop using Red Hat’s most valuable products

メンバーシップでは、エンタープライズ クラウド アプリケーション開発に関する Red Hat 製品や技術トレーニングのロック解除が可能です。

JOIN RED HAT DEVELOPER

Misused asynchrony bites

リアクティブプログラミングの定義には、非同期という重要な単語が一つあります。 データがストリームに非同期的に、つまり、メイン プログラム フローとは無関係に出力されると、その旨が通知されます。 データストリームを中心にプログラムを構成すると、非同期コードを書くことになります。つまり、ストリームが新しいアイテムを発行したときに呼び出されるコードを書くことになります。 スレッド、ブロックコード、副作用は、この文脈では非常に重要な事柄です。 副作用のない関数は、引数と戻り値を通してのみプログラムの残りの部分と相互作用します。 副作用は非常に便利で、多くの場合、避けられないものです。 しかし、副作用には落とし穴もあります。 リアクティブ・プログラミングを使うときは、不要な副作用を避け、使うときは明確な意図を持つ必要があります。 つまり、不変性、そして副作用のない関数を受け入れることです。 正当化される場合もありますが、副作用を乱用すると、スレッドセーフという雷雨になります。 ストリームを観察し、何か面白いことが起こったときに通知されるのは良いことですが、誰があなたを呼んでいるのか、より正確にはあなたの関数がどのスレッドで実行されるのかを忘れてはいけません。 プログラムの中であまり多くのスレッドを使用しないことを強くお勧めします。 複数のスレッドに依存する非同期プログラムは、困難な同期のパズルとなり、しばしばデッドロックの狩りになってしまいます。 自分を呼び出しているスレッドは自分のものではないので、決してブロックしないようにしなければならない。 もしブロックしてしまうと、他のアイテムが放出されるのを避けることができ、それらはバッファがいっぱいになるまでバッファリングされます (この場合、バックプレッシャーが働くことがありますが、これはこの投稿のトピックではありません)。 RXと非同期IOを組み合わせることで、ノンブロッキングコードを書くのに必要なものがすべて揃います。さらに必要なら、反応性と非同期性を促進する反応型ツールキット、Eclipse Vert.xを見てください。 たとえば、次のコードは Vert.x Web Client と RX API を使用してサーバーから JSON ドキュメントを取得し、名前エントリを表示するものです。 これは、処理段階のいずれかが例外をスローしたときに呼び出される 2 番目のメソッドを取ります。 例外は必ずキャッチしてください。

4. 物事をシンプルに保つ

ご存知のように、「大きな力には大きな責任が伴う」のです。 RX は非常にクールな機能をたくさん提供しており、ダークサイドに傾くのは簡単です。 flapmap、retry、debound、zip を連鎖させると、忍者のような気分になります…しかし、良いコードは他の誰かに読まれる必要があることを決して忘れてはいけません。 これは、いくつかの非同期操作 (flatmap) を連結し、別の操作のセット (zip) を結合しています。 反応型プログラミングのコードでは、まずマインドシフトが必要です。 あなたは、非同期イベントを通知されます。 それから、APIを把握するのは難しいかもしれません(演算子のリストを見てください)。 悪用しないように、コメントを書いたり、説明したり、図を描いたりしましょう(あなたはきっとアスキーアートアーティストです)。 RX は強力です。それを乱用したり、説明しなかったりすると、同僚が不機嫌になります。

5. Reactive programming !=Reactive system

おそらく最も混乱する部分です。 リアクティブ・プログラミングを使用しても、リアクティブ・システムは構築されません。 リアクティブ マニフェストで定義されているように、リアクティブ システムは、応答性の高い分散システムを構築するためのアーキテクチャ スタイルです。 リアクティブ・システムは、正しく行われた分散システムと見なすことができます。

  • Responsive: リアクティブシステムは合理的な時間(合理的の定義はお任せします)で要求を処理する必要があります。
  • Resilient: リアクティブシステムは障害(衝突、タイムアウト、500エラーなど)に直面して応答性を維持しなければならず、障害に対して設計し適切に対処しなければなりません。
  • Message driven: リアクティブ システムのコンポーネントは、非同期のメッセージ パッシングを使用して相互作用する。 通常、各ノードは非同期ノンブロッキング開発モデル、タスクベースの並行処理モデル、およびノンブロッキング I/O を使用する必要があります。

    Reactive Programming and Reactive eXtension は、非同期の獣を飼い慣らすための開発モデルを提供します。 これを賢く使用することにより、コードは読みやすく、理解しやすいものになります。 しかし、リアクティブプログラミングを使用しても、システムをリアクティブシステムに変換することはできません。 1396>

    Conclusion

    ようやくこの記事の最後に到達しました。 もしあなたがもっと先に進みたいなら、そしてリアクティブに興味があるなら、Eclipse Vert.x – a toolkit to build reactive and distributed systems (http://vertx.io) や、Reactive Microservices in Java minibook (https://developers.redhat.com/books/building-reactive-microservices-java) に目を通すことをお薦めします。 Vert.xとReactive eXtensionを組み合わせることで、リアクティブな超能力を発揮することができます。 反応型プログラミングを使用するだけでなく、反応型システムを構築し、スリリングで成長するエコシステムにアクセスすることができます。

    Happy coding!

    Eclipse Vert.x cheat sheet をダウンロードします。

コメントを残す

メールアドレスが公開されることはありません。