Angularのサービスの説明をする前にリアクティブプログラミングについて説明します。
リアクティブプログラミングとは
リアクティブプログラミングは、データの流れ(ストリーム)に着目し、データを受け取るたびに処理を処理するプログラミングパラダイムです。
リアクティブプログラミングは、用語が独特で概念の通常のプログラミングとは少し異なっているため、理解しづらい場合があります。また、実装系によっても違いがあります。今回は一般的なリアクティブプログラミングについて説明し、次回RxJSについて説明します。
リアクティブプログラミングの用語
リアクティブプログラミングには多くの用語があり、異なるライブラリやフレームワークによって少し異なる言い回しがされることもあります。しかし、以下はリアクティブプログラミングのコンセプトを理解する上で基本となる用語のリストです。これらの用語は、多くのリアクティブプログラミングの文脈で一般的に使用されています。
発行者(Publisher)
生産者(Producer)やオブザーバブル(Observable)とも呼ばれます。データやイベントを生み出し、それをストリームとして発行するエンティティです。発行者は、一つまたは複数の購読者にデータを非同期的に供給する役割を果たします。
購読者(Subscriber)
消費者(Consumer)やオブザーバー(Observer)とも呼ばれます。発行者からのデータやイベントを受け取り、それを処理するエンティティです。購読者は、発行者からデータを受け取ることを購読する(subscribe)と言われ、この購読関係を通じてデータが非同期的に供給されます。
操作(Operators)
購読者が購読しているデータストリームからデータを受け取る際に適用する操作です。フィルタ(filter)やマップ(map)など様々な操作があります。
バックプレッシャー(Back pressure)
データの発行速度と購読速度の不均衡を管理する概念。発行側が高速で、購読側がそれに追いつけない場合に対処するための機構を提供します。
ColdとHot
- Cold:購読が開始されるまでデータを発行しない
- Hot:購読の有無に関係なくデータを発行する
リアクティブプログラミングの概念
リアクティブプログラミングの概念について説明します。
発行者はデータを発行し、データストリームを形成します。データの発行は一般に非同期で行われますが、同期で行われることもあります。
購読者は発行者を購読し、データを待ち受けます。データを受け取るたびに処理を実行します。ただし、すべてのデータを処理するわけではなく、Operatorsによって受け取るかどうかをフィルタすることもできます。
購読者が処理できる量には限界があります。発行者がデータを発行するペースよりも購読者が処理できるペースの方が遅い場合、発行済み未処理のデータをどうするかという問題がでてきます。購読者の処理能力を発行者の発行能力が上回る状態に対する対処を行う機構をバックプレッシャーと言います。具体的な対処方法としては、
- 購読者が購読可能なデータ量を発行者に伝え、発行者はそれに合わせてデータを発行する
- 発行者の発行しているデータをバッファリングする
- 受け取れないデータは捨てる
などがあります。どの戦略が適しているかはデータの性格(失われると困るのか、多少失われても問題ないのか)やデータ発行の処理(購読者の要求に応じて発行できるのか、とりあえず生成し続けるしかないのか)によって変わります。
リアクティブプログラミングのユースケース
リアクティブプログラミングを適用できるユースケースをいくつか挙げます。
- リアルタイムデータのストリーミング:フィンテック、株価のストリーミングや、ライブスポーツのスコア更新など
- リアルタイムのダッシュボード:ユーザーアクティビティ、システムメトリクス、eコマースの販売統計など、リアルタイムで更新する必要があるダッシュボード
- チャットアプリケーション:ユーザー間でリアルタイムにメッセージを交換するアプリ
- オンラインゲーム:特にマルチプレイヤーオンラインゲームで、プレイヤー間のリアルタイムのインタラクションが必要
- イベント駆動のマイクロサービスアーキテクチャ:サービスが非同期的にデータを交換する
- 非同期なバッチ処理:大量のデータを効率的に処理する必要がある場面で、特にデータの供給速度が不均一な場合
- リアルタイムの通知システム:ユーザーにリアルタイムで通知やアラートを提供するシステム
- センサーデータの処理:IoTデバイスからのリアルタイムデータを効率的に収集、分析、反応する
- 動的なネットワーク応答:ユーザーのリクエストに応じて、非同期的にコンテンツを動的に生成・配信するウェブサービス
- リソース制限のある環境:例えばモバイルデバイスや組み込みシステムなど、リソースが制限されている環境での非同期処理やリアルタイム処理
最近ではWebアプリケーションで使用することが多いため、サーバーが発行者、クライアントが購読者という組み合わせや画面のコンポーネント間での使用をイメージしやすいですが、サービス間でのやりとりや非同期バッチなどに使用することもあります。
まとめ
サービスを作成しようとするとRxJSを使うことになるため、先にリアクティブプログラミングについて説明しました。次回はRxJSについて説明します。