リアクティブであることの基礎

リアクティブの世界の大きな問題のひとつであり、その理解しにくさは、リアクティブという言葉とその言葉の多様な解釈にある。講演を聞いたり、ブログを読んだりしてもリアクティブの意味が掴めなかったPeter Ledbrook氏は、リアクティブとは何かを調べ、その知識を共有しようと決めた。

リアクティブマニュフェストから始めた、Grailsの中心のコミッタのLedbrook氏は、リアクティブシステムの特徴を以下のようにまとめた。

  • レスポンシブ、つまり、システムは常に適切に応答を返し、遅延を少なくする。
  • 弾性、つまり、システムは一部分が障害を起こしたとしても、応答を返し、ダウンタイムを最小限にする。
  • しなやかさ、つまり、負荷の上昇にたいしてシステムは応答を維持するのに必要なスケールアップをし、負荷が下がれば、スケールダウンする。効率的なリソースの使用をする。
  • メッセージ駆動、異なるシステムの間でメッセージをやりとりする。Ledbrook氏はこれが、リアクティブシステムの規範的特徴だとしている。

そして、Ledbrook氏が次に取り上げるのがリアクティブストリームだ。氏はこれを、出力され続ける要素の流れと捉え、オブザーバーパターンを手がかりに理解できると考えている。オブザーバーパターンはイベントを出力するソースとイベントを監視するひとつ以上のオブザーバーで成り立つ。氏によれば、リアクティブとはオブザーバーパターンに、完了を検知し、エラーを伝播するイベントソースと、ソースとやり取りするリスナーを組み合わせたものだ。

リアクティブストリームは仕様であり、クロスプラットフォームの実装にはReactiveXがある。また、Ledbrook氏はProjectReactorAkkaの名前も挙げている。ReactiveストリームAPIの3つの重要な特徴は下記の通り。

  • 発行者はイベントを送る。イベントを購読する場合もある。
  • 購読者はイベントを購読する。
  • サブスクリプションは購読者と発行者を結びつける。購読者が発行者に知らせを送るのもサブスクリプションが実現する。

Ledbrook氏はリアクティブストリームの多くが同じコンセプトで実現されているが、ある種の複雑さが隠されている、と指摘する。I/Oが激しく、大量のデータを処理する必要がある場合がユースケースになるだろう。Java 8のストリームはリアクティブストリームと似ているが、リスナーからの通知がなく、リアクティブストリームのようにI/Oに適合して作られていない。