MicroProfileは、Reactive Streamのために一連のオペレータを定義した仕様のReactive Streams Operators 1.0 APIをリリースした。Reactive Streams Operators APIはjava.util.stream
パッケージに着想を得て、JDK 8で初めて導入された。Reactive StreamsイニシアティブをベースとしたこのAPIを使用することで、Reative Streamsの生成、ストリームを転送されるデータの処理、結果の蓄積が可能になる。
Reactive Streamsイニシアティブは2013年、Reactive Manifestoに基づいて,Lightbend、Netflix、Pivotal3社のコラボレーションとしてスタートした。2015年にリリースされた最初の仕様は、最終的にJDK 9でjava.util.concurrent.Flow
APIとして採用されている。
Reactive Streams Operators APIには,PublisherBuilder
、SubscriberBuilder
、ProcessorBuilder
といったインターフェースが含まれる。重要なのは、40から50の個別要件とTCKの約100件のテストを持つReactive Streams Operatorsインターフェースは、開発者によって直接実装されることを意図したものではない、ということだ。Webサイトの記載によると、
Reactive Streamsによって定義されるセマンティクスは極めて厳密で、特にスレッド安全の領域においては、正確に実装することは容易ではありません。一般的なアプリケーション開発者は、ストリームを操作および制御するために必要なツールを提供する、サードパーティ製ライブラリを使用することになるでしょう。Akka Streams、RxJava、Reactorなどがその例です。
Reactive Streamsの実装にはその他にも、Zero DependencyやSmallRyeなどがある。
Reactive Streams Operators APIの実装であるSmallRyeには、いくつかのサンプルが用意されている。次の簡単な例は、単語のストリームをフィルタするものだ。
import org.eclipse.microprofile.reactive.streams.operators.ReactiveStreams;
public class QuickStart {
public static void main(String[] args) {
// create a stream of words
ReactiveStreams.of("hello", "from", "smallrye", "reactive", "stream", "operators")
.map(String::toUpperCase) // transform the words
.filter(s -> s.length() > 4) // filter items
.forEach(word -> System.out.println(">> " + word)) // terminal operation
.run(); // run it (create the streams, subscribe to it, etc.)
}
}
LightbendでLagomマイクロサービスフレームワークの開発に携わったアーキテクトのJames Roper氏が、最新リリースについてInfoQに話してくれた。
InfoQ: MicroProfileでReactive Streams Operators APIを開発したきっかけは何でしたか?
James Roper: Reactive Streams Operatorsは、Reactive Streamsとユーザとのギャップを埋めるものです。Reactive Streamsは、さまざまな非同期ストリーミングライブラリを、それぞれに関する事前知識を必要とせずに、相互に統合する手段を提供します。例えば、データベースライブラリからHTTPサーバーライブラリにデータをストリーミングすることが可能になるのです。
このことは、MicroProfile仕様にリアクティブなストリーミングを採用する方法に多くの可能性を開くという意味において、MicroProfileに大きな可能性をもたらします。しかしながら、統合SPIであるReactive Streamsは、エンドユーザが直接使用したり実装したりするようには設計されていないため、実装が非常に困難である、という事実があります。
例えば、私の使っているデータベースライブラリが
Publisher
を返して、HTTPサーバライブラリがPublisher
を受け入れるとします。この2つをどうやって結び付ければよいのでしょう?MicroProfile Reactive Streams Operatorsが登場する前は、2つの選択肢がありました。ひとつは変換を自分自身で行うPublisherを実装するという方法です。先程説明したように、Reactive Streamsは一般使用を前提に設計されていないため、この方法は困難を伴います。もうひとつは、マップ関数を経由して、あるパブリッシャを別のタイプに変換するような、サードパーティ製ライブラリを導入するという方法です。実はこれも望ましい方法ではありません。ユーザはコア機能にサードパーティのライブラリを持ち込まなくても、MicroProfile実装を使用できるべきだからです。
そこで私たちは、MicroProfileの他の仕様がReactive Streamsを採用する前に、まず最初に、このギャップを埋めるためのMicroProfile Reactive Streams Operatorsを開発するべきだ、と考えたのです。
InfoQ: Reactive Streams Operators APIはMicroProfileの一部ですが、MicroProfile CQRS APIにも適用可能でしょうか。そのようなAPIを実装する上で、何か問題があるのでしょうか?
Roper: 技術的には、MicroProfile CQRS APIの開発にReactive Streams Operatorsは必要ありません。MicroProfile CQRS APIは、Reactive Streamsとは完全に独立して存在できるからです。そうではありますが、Reactive Streams、さらにはMicroProfile Reactive Streams Operators APIが、ストリーミングを提供するさまざまな既存の方法を統合する手段を提供するように、MicroProfile Reactive Streams Operatorsは、Reactive Streams実装を提供する他のライブラリと簡単に統合できるようにすることで、MicroProfile CQRS APIの有用性を大きく広げる可能性を提供するという事実はあります。
MicroProfile CQRS APIに関してさらに興味深いのは、間もなく登場するMicroProfile Reactive Messaging仕様です。これにより、さまざまなソースからさまざまなシンクへのメッセージのストリームを処理できるようになります。MicroProfile Reactive Messagingを活用したり、CQRSイベントストリームを使用したり、あるいはメッセージブローカにパブリッシュしたりすることで、CQRSイベントストリームをメッセージのソースのひとつにすることが簡単にできます。APIの使用に関して、ユーザが学ぶべきことがひとつ少なくなるのです。
InfoQ: 他のベンダもReactive Streams Operators APIを実装しているのでしょうか?
Roper: 現在はRedHatとLightbendがAPI実装を提供しています。また、IBMがOpenLibertyでサポートするためにRedHat実装を採用したか、あるいは採用を計画していると思います。
InfoQ: Reactive Streams Operatorsの今後の展望について教えてください。
Roper: 必要に応じた進化をすると思います。先程ギャップを埋めると言いましたが、実際にはそのようなギャップは存在しません。他のMicroProfile仕様で、Reactive Streamsをサポートするものがまだ多くないからです。MicroProfile Reactive OperatorsがMicroProfile仕様の一部になっていないのは、このためです。それ自体は、それほど面白いものではないのです。ですが、MicroProfile Reactive Messagingがそれに基づいた最初の仕様となることで、その実装と使用の経験から、MicroProfile Reactive Streams Operatorsの新たなユースケースや要件が明らかになるかも知れません。そうなれば、今後の発展にも弾みが付くでしょう。
MicroProfile Reactive Streams OperatorsをJDKに含める提案の妥当性についても検討しています。標準的なオペレータAPIの存在は、MicroProfileよりもはるかに広く役立つはずです。そのようになるか、見守ることも面白いでしょう。
リソース
- Reactive Streams 1.0.0 interview - Viktor Klang (2015/6/1)
- Going Reactive with Streams in Jakarta EE - James Roper (Jakarta Tech Talkウェビナ)