SE情報技術研究会’s blog

http://se-info-tech.connpass.com

2015-12-07 『Learning Reactive Programming with Java 8』 もくもく読書会(Chapter 1)の振り返り

Chapter1: An Introduction to reactive programming

サンプルファイルのダウンロード

  1. ホームページ > Code Filesのリンクをクリック
  2. 入力ページでメールアドレスと名前を入れて送信
  3. メールアドレスにダウンロードファイルのリンクが送信される

サンプルソースGitHubからも取得可能

サンプルのインポート

  1. サンプルファイルを解凍しておく
  2. Eclipse > ヘルプ > EclipseマーケットプレースからGradleのプラグイン(Gradle Integration for Eclipse 3.7.2.RELEASE)をインストール
  3. インポート > Gradle > Gradleプロジェクト
  4. ルートフォルダにサンプルのCode filesを指定
  5. モデルのビルド
  6. 問題なければ完了

Intoroduction

Reactive Programmingは最近のトレンドである

下記のような大きな企業もそのコンセプトをサポートし使っている

Javaで並行処理と単純なアプリケーションを標準(built-in tools)だけで行うのは大変
→ Reactive Programing を使うことで変えることができる

ReactiveProgrammingとは

  • 変化に対しての解決法のパラダイム
    → データが変わるとそれに関連するものも反応するプログラム
  • 例えるとExcelのセルに入れた式のようなもの
    → 式が参照しているセルの値が変わると、それに反応して式の結果も変わる

Reactiveにすべき理由

Reactive Manifest(http://reactivemanifest.org)の4つの原則

  • modular/dynamic: 全システムを止めずにモジュールをオフにもオンにもできる
    → システムをイベント駆動にすれば可能(通知によって反応(react)させる)
  • scalable: 大量のデータやユーザのリクエストに対応できる
    → データが増えれば新しいコンポーネントの追加や古いコンポーネントの削除をシステムを止めずにが可能
  • fault-tolerant: ユーザに対してシステムは安定している
    → 失敗やエラーを処理するコンポーネントに通知する
  • responsive: 反応が早くアクセス可能(available)である
    → ユーザの行動に反応(react)させる

イベント駆動のアプリケーション

Reactive Manifestの定義はReactive Programmingのことではないが、Manifestoを実現するのにReactive Programmingにするのが一番簡単

RxJava

Comparing the iterator pattern and the RxJava Observable

※ RxJavaのObservableはjava.util.Observableとは違う

Iteratorパターンの場合

  • 1つずつListの要素を取得し処理を行う
  • 要素ごとの処理に時間がかかるようだと全ての処理が終わるまでに時間がかかる

RxJava Observable の場合

  • ProducerがListの要素を同時にpushし、通知を受け取ったConsumerが処理をする
  • RxJava Observableは非同期のIteratorのようなもの

RxJava Observable について

  • すべての要素を使った際の処理を行いたい場合はOnCompletedを通知されるのを待つようにする
  • エラー発生時にObservableにエラーを処理するListenerをつけて対応させる
Observable<String> observable = Observable.from(list);
observable.subscribe(
  要素ごとのの処理をするListener,
  エラー処理のListener,
  全要素の対応が終わった際のListener
);

次回

Chapter 1 の Implementing the reactive sum から

感想

  • サンプルはダウンロードして実行できるようにしておいたほうがいい
  • IteratorとRxJava Observableの比較は要素ごとの処理がvoidなので効率性が納得できたが、集計処理とかだとどうなのだろう?
  • サンプルのソースコードが初っ端からかなり長いが、それはJavaだから?
  • RxJava Observableは単なる並行処理の例だと思うのだが、それは後々のReactive Programmingで必要な技術だから?