Reactiveもくもく会に参加して、はじめて「リアクティブプログラミング」を知ったので自分用にまとめてみた。
リアクティブ宣言読み直さなくても思い出すための文章になればいいかな。
まずはざっくり Reactive Programming
リアクティブ宣言によるシステム開発におけるアーキテクチャのアプローチの一つだそうだ。
- より柔軟に
- 疎結合で
- スケーラビリティがあり
- 開発が容易になる
- 変更を受け入れやすくし
- 障害耐性を持ち、障害が起きても素早く対処できる
このようなことを実現ために、
システムアーキテクチャで以下を備えたものをリアクティブシステム(Reactive Systems)と呼ぶ。
- 即応性
- 耐障害性
- 弾力性
- メッセージ駆動
即応性 (Responsive)
- 迅速な応答時間を提供
- 一貫した品質
- 問題が素早く検出され対処しやすい
耐障害性 (Resilient)
- コンポーネントをお互いに隔離し故障が全体に影響しない
- 各々のコンポーネントの回復処理は(外部の)他のコンポーネントに委譲される
- 必要に応じてレプリケーション
弾力性 (Elastic)
- システムの中に競合する場所や中心的なボトルネックが存在しないように設計する
- シャーディングやレプリケーションしたコンポーネントで入力を分散化
メッセージ駆動 (Message Driven)
- 非同期なメッセージをコンポーネント間でやり取りする
- 疎結合性
- 隔離性
- 位置透過性
- 必要に応じてバック・プレッシャーを適用
- 特定のコンポーネントが高負荷なので負荷を下げるように管理
- ノンブロッキング通信
- 受信側のコンポーネントはアクティブ時のみリソースを消費
実現するための技術
RxPyのHello Worldやってみた
RxPy インストール
> pip install --pre rx
Collecting rx
Downloading https://files.pythonhosted.org/packages/0b/f2/15d136bfe8314ce9c6829a6658f82a0c1a1661824ca2d8d060a695a4aa61/Rx-3.0.0b4-py3-none-any.whl (187kB)
|████████████████████████████████| 194kB 344kB/s
Installing collected packages: rx
Successfully installed rx-3.0.0b4
RxPyのHello World実行
以下にあったものそのまま貼って動かしてみた。
https://github.com/ReactiveX/RxPY
test.py
import rx
from rx import operators as ops
source = rx.of("Alpha", "Beta", "Gamma", "Delta", "Epsilon")
composed = source.pipe(
ops.map(lambda s: len(s)),
ops.filter(lambda i: i >= 5)
)
composed.subscribe(lambda value: print("Received {0}".format(value)))
実行結果
$ python test.py
Received 5
Received 5
Received 5
Received 7
用語
- FRP = 関数型リアクティブプログラミング
大雑把な理解
マイクロサービスを実現するためのアプローチかな。大規模なシステムを作るとき有効になりそう。
各コンポーネント間でメッセージやり取りすることで疎結合にしスケーラビリティを高くする仕組み。
Reactivexなどでよく出てくるObservableはアーキテクトが憧れるObserverパターンをもとにしている模様。
まだ仕組みの動きについては理解が届いていないので、もうちょっと凝ったものを作ってみて理解を深める必要がありそう。