Tagbangers Blog

Reactive Spring - Rossen Stoyanchev氏のSpringブログ(日本語超訳)

少し古いのですがSpringブログでのROSSEN STOYANCHEV さんの記事(2016/2/9投稿)の日本語超訳をしたいと思います。
オリジナルはこちらを参照してください。

Reactive Spring

SpringOne2GX 2015 にてJuergenがSpring Framework 5 についての計画を発表しました。
これは主にReactiveアーキテクチャにフォーカスしたものになります。
それから着実に取り組みが進行中で、多くの成果が現れてきています。

そもそもReactiveプログラミングモデルはサービスとアプリケーションをノンブロッキングで書くことができるものです。
これは命令的なロジックから非同期で、並列(ノンブロッキング)で、関数型のコードで記述するよう、根本的な考え方の転向を迫られています。
外部のリソースと相互に作用する場合は特に、その傾向があります。

Reactive Webアプリケーション

多くのJavaのwebアプリケーションは、もともと同期的でブロッキングな実装で作られたServlet APIをベースに作られています。
何年もの時を経て、非同期リクエスト(Servlet 3.0)とノンブロッキングI/O(Servlet 3.1)が追加されました。
Spring MVCはといえば、選択的な非同期HTTPリクエストをハンドリングする機能を既存のアプリケーションに追加するのは不可能、
なおかつ、ノンブロッキングI/Oを既存のwebフレームワーク/アプリケーションのエコシステムの中に導入するのも困難ということがわかりました。
導入はかなり大変で、コアの構想をブロッキングから非同期な方針にほぼほぼ書き直す必要があったのです。

Spring MVCの人気が衰えないのは、柔軟なControllerメソッドシグネチャを基礎とした、直観的なアノテーションベースのプログラミングモデルだから、ということが理由の1つにあげられるでしょう。幸いなことに、これからも同じ基盤をReactive webアプリケーションに対して提供することができるようになります。
これはSpring Reactiveの方向性のおかげです。その努力はSpring MVC Controllerに似ているものの、Tomcat, Jetty, Undertow, Nettyに対するテストも踏まえつつ新しいReactiveエンジンで実行しているTestControllerを見てもわかっていただけるでしょう。

当プロジェクトはSpring Frameworkのmasterブランチに、5月の4.3リリースの後にすぐマージされる予定になっており、6月に5.0 M1のリリースを予定していることを付け加えておきます。

Reactiveの基盤

この取り組みの大事な要素として、Reactive Streams specというものがあります。目的は「非同期ストリーム処理をノンブロッキングなback pressureで行うことを標準とする」こと。この仕様は異なった非同期のコンポーネントプロバイダ(HTTPサーバからWebフレームワーク、DBドライバーなど)の相互運用を可能にします。こちらはJDK9にjava.util.concurrent.Flowとして取り入れられるでしょう。

これは小さい仕様ですが4つのインターフェースと規則、TCKが含まれています。
しかしAPIとして公開するには非同期ロジックを構成するためのインフラが必要となります。Spring ReactiveはReactor Coreを使っています。これはReactive Streamsを使いたいライブラリやフレームワークの基盤として提供する、小さくてそれ専門のライブラリです。
Project Reactorに詳しい人向けに…6-8ヶ月前からReactor Core 2.5 M1の今週(2016年2月)のリリースに向けて多くの成果が上がっています。Stephane Maldiniがfullアップデート版を近々で提供してくれるでしょう。

様々なSpringプロジェクトからのReactiveプログラミングに関するブログ記事について今後も目を離さぬよう。
美しいバルセロナで行われる今年のSpring I/Oカンファレンスでも、Reactiveのバズが起こることを期待しています!