とあるIT屋の独白

ITや経営について主に書きます

リアクティブプログラミングについて調べてみた

ITの技術関係の記事をながめると、ちょくちょく「リアクティブプログラミング」というのを見かけます。今回はこのリアクティブプログラミングについて、少し調べてみましたので取り上げてみます。
リアクティブプログラミングって何?、と思って調べる時にまぁまぁの数の記事が出てくると思います。ただ、けっこう概念的な話が多く、前提となる知識がないとイメージがしづらいかなと感じました。
個人的にですが、イメージがつきやすい記事は以下かなと感じました。考え方としてbehaviorとeventがあり、「behaviorは時間を通じて変化する値であり、eventはある時間においてbehaviorに働きかけるもの、と考えること」と述べられています。

【リアクティブプログラミングの概観と、各言語での実装について】
https://www.altus5.co.jp/blog/reactive-programming/2016/11/17/reactive-programming/

これを使うと何が嬉しいのかというと、behaviorどうしが独立してるので、前後の処理に影響を受けにくかったり、処理の分散がしやすいという点。下記はScalaでの実装を解説したものですが、上記の記事にある計算式を関数で置き換えた場合、各関数で意識すべきはインとアウトだけでよく、コールバックなども実装する必要もないです。結果として各処理を非同期かつ分散して行うというメリットが生まれてきます。

【なぜリアクティブは重要か】
https://www.slideshare.net/mobile/okapies/scalamatsuri-58141520

リアクティブプログラミングを使用されたライブラリの一つとして、Reactive Streamsが挙げられます。Reactive Streamsの特徴は大量に入力されるストリームデータを想定しています。役割として、PublisherとSubscriberが登場人物として出てきて、データの受け渡しを行います、詳細は下記の記事で解説されています。

【RxJava 2.xで導入されたReactive Streams】
https://codezine.jp/article/detail/9699

このReactive Streamsの思想を元に作られたライブラリが「Akka Streams」で、JavaScalaで使えます。Akka Streamsではデータの変換処理などを「Flow」と呼ばれる部品単位で構築できます。これを使ってチャットサーバなんかも作ることができて、下記にコード例があります。

【WebSocket のチャットサーバを Akka Streams の MergeHub と BroadcastHub で実装する】
https://dev.classmethod.jp/server-side/chatserver-play-websocket-akka-stream/