読者です 読者をやめる 読者になる 読者になる

Reactive Streamsとは?

Scala

Reactive Streamsというのはノンブロッキングなback pressure可能な非同期ストリーム処理の標準的な仕様を提供しようというもので、実装としてはAkka Streams、RxJava、Reactor Composable、Ratpackなどがあります。

Reactive StreamsについてはAkkaのコミッタであるKonrad Malawskiさんの以下のスライドがとてもわかりやすいです。

ストリーム処理(というか非同期メッセージング全般に言えることですが)では受信側の処理能力を超えるデータを送信し続けるといずれキャパシティを超えてオーバーフローが発生してしまうため、送信側に比べて受信側の処理能力が低い場合は送信側が手加減してデータを送信する必要があります。なるべくシステムを疎結合にすることで自律性の高いシステムを構築するという観点から考えるとこのような状況は好ましいものではありません。

こういった状況を回避するために送信側が手加減をするのではなく、受信側が自分が処理できる量だけのデータを送信側に対して要求すればオーバーフローが発生することはありません。そうやって自律的に流量の調整を行うストリームというのがReactive Streamsの基本的な考え方です(受信側が送信側に対してそのような通知を行うことをback pressureと表現しているようです)。

Malawskiさんのスライドを見るとReactive Streamsは単純にストリーム処理の基盤としてだけではなくAkkaやRxJava、Spray、Vert.xといった異なるミドルウェア間でのメッセージングを接続するプロトコルとして利用することも想定されているようです。

Akka StreamsはこのReactive Streamsの実装のひとつではあるのですが、まだ1.0のマイルストーンビルドがリリースされているという状況ですのですぐに使うのは時期尚早といえます。また、ストリーミング・オンメモリバッチ業界(こういう括りで一括りにしてしまっていいのかわかりませんが)はSparkに注目が集中していますし、Reactive Streams自体Typesafe社の政治的な思惑を感じざるを得ない面もあり、果たしてReactive Streamsが普及するのかどうかはやや微妙な気がしています。