活用の場が広がるリアクティブ関連機能
Rossen Stoyanchevさんのセッション「Guide to "Reactive" for Spring MVC Developers」では、従来のSpring MVCを使っている開発者向けにリアクティブ対応APIの活用方法を紹介していました。このセッションは立ち見が出るほどの人気を博しており、Spring Framework 5.0で追加されたリアクティブ関連機能の活用シーンに多くの開発者が興味を抱いていることが分かります。
同セッションでは、アプリケーションの一部だけでもリアクティブ化することで効果が発揮される例として、ブロッキングなクライアントであるRestTempleteによる実装をノンブロッキングなWebClientで置き換えるデモが披露されています。WebClientを用いることで複数のリクエストがそれぞれ非同期に処理され、全体としての処理時間が短縮される様子が確認できました。RossenさんはRestTempleteについて「直ちに廃止することはない」と強調しながらも、WebClientを「少し学習して適切だと思う場所で使ってみてほしい」と緩やかな適応を促していました。
また、サーバーサイドの実装に関してはSpring MVCとWebFluxの公式のドキュメントを対比し、個別の機能に対応する実装がそれぞれにある(すなわちSpring MVCからWebFluxへの書き換えが可能である)ことをアピールしていました。
局所的な利用ではなく、アプリケーションをフルスタックでリアクティブ対応させる場合には、データベースアクセスまで含めて考える必要があります。Ben Haleさんのセッション「Reactive Relational Database Connectivity」ではリレーショナルデータベースのアクセスに使われるJDBCがブロッキングであるという問題に対し、実験的なプロジェクトである"R2DBC"というリアクティブなAPIの紹介がありました。
同一目的のAPIとしてはOracleが次期標準として提案している"ADBA"がありますが、Benさんは「ADBAのCompletableFutureを使った実装はReactive Streamsのバックプレッシャーに対応できず、非同期ではあるがリアクティブではない」と問題点を指摘し、「R2DBCプロジェクトの目的はADBAの設計に影響を与えることだ」と語っていました。
その他、PivotalでReactorのプロジェクトリーダーを務めるStephane MaldiniさんとFacebookの開発者であるSteve Guryさんからは、リアクティブアプリケーションと親和性の高い新たなレイヤー7のネットワークプロトコルであるRSocketが紹介されました。
現状、マイクロサービス内での通信など、さまざまなところでHTTPが広く用いられています。しかし、近年ではモバイルでサーバーからプッシュ通知を受けたり、スマートウォッチで運動中の統計情報をバックエンドサーバーとリアルタイムにやり取りしたりと、より高度なインタラクションが求められており、このような通信にはリクエスト・レスポンスが1対1となるシンプルなインタラクションを基本としたHTTPは本来向いていません。
一方、RSocketでは4つのリッチなインタラクションモデルを持っており、さまざまなインタラクションをうまく扱うことができます。
-
fire and forget
レスポンスなしのリクエスト -
request / response
HTTPと同様、1つのリクエスト対して1つのレスポンスを返す -
request / stream
1つのリクエストに対して複数のレスポンスをストリームとして返す -
channel
複数のリクエスト、複数のレスポンスをやり取りする双方向ストリーム
また、RSocketは1つのコネクションで双方向の通信や多重化が可能となっており、HTTPよりも少ないオーバーヘッドで効率的に通信を行うことができます。
さらに、フロー制御もサポートしており、Reactive Streamsのバックプレッシャーのような形で送信元に受け入れ可能なデータ量を伝えることで流量制御を実現することもできます。
Steveさんからは、FacebookのLive Query(クエリ結果の変更をリアルタイムでクライアントに通知する機能)の処理を行うサーバーでRSocketを適用したところ、従来のポーリングモデルでの実装と比べてランニングコストを大幅に削減することができたという報告もありました。
今後、リアクティブアプリケーションの開発でRSocketがどのように広がりを見せていくのか、注目しておきたいところです。
