Quitada ブログ HAX

Hatena Blog でも Quitada ブログ

Spring IO 基盤技術の一つの Reactor を弄ってみた

Spring IO Foundation の中でも、Core の一翼を担う Reactor。quitada はこれに興味津々なので弄ってみた。

Spring in Action: Covers Spring 3.0

Spring in Action: Covers Spring 3.0

★Reactor って何でしたっけ?

こちらの Spring のブログエントリーによると、JVM 上で非同期通信アプリを構築する基盤フレームワークとのこと。イベントを非同期で受信してそのフィルタリングとイベント駆動処理が可能なんで、簡単な CEP っぽいことが、簡単にできるようなものと理解。

相当軽量なイメージで、たとえば、ビッグデータ時代の昨今、大量にリアルタイムに流れてくるセンサーデータ等、取捨選択する一次窓口として使えそうだ。

ともあれ、リアクターに垣間見えるのは、最近のスプリングテクノロジーは、フレームワークに限らず、ランタイムとかライブラリーも充実しつつある、ってところですかね。

★Reactor のビルド

GitHub にアカウント作って、git をインストールして、以下の Reactor の GitHub サイトの手順にそって、git clone して Gradle でビルドすれば完了。

GitHub - reactor / reactor

Mac OS の場合は、App Store から Xcode インストールしたら git とかもインストールされるはずなので楽ですね。

ちなみに、git clone するには、こちらに従って事前に SSH Key の作成・登録が必要ですね(by GitHub 初心者)。

git の URL でうまくいかない場合は、GitHub のサイトの右ペインに "HTTPS clone URL" てのがあるのでそれコピーして以下のような感じで git clone すればいいんじゃね?

git clone https://github.com/reactor/reactor.git

#なんか、quitada の git clone 初体験メモになりつつある…

GitHub

GitHub

で、ビルドが完了すると、/[任意のパス]/reactor/reactor-core/build/libs 配下に、reactor-core-1.1.0.BUILD-SNAPSHOT.jar みたいな jar ができるので、Java IDE とかのビルドパスにこの jar を追加しよう。IDE は Spring に敬意を表して STS を使うか、イケメンさんに敬意を表して IntelliJ IDEA を使うか、NetBeans とか Eclipse とか、まー、何でも良いでしょう。

★その他必要なもの

disruptor というのも必要なようで、以下の GitHub のサイトからものをもってきて、Reactor と同じような要領でビルドします。

GitHub - LMAX-Exchange / disruptor

/[任意のパス]/disruptor/build/libs に disruptor-3.2.0.jar ができるので、これを Reactor と同様 IDE とかのビルドパスに追加します。

また、log4j のライブラリが必要なようです。ダウンロードしたものを ant でビルドとかして、jar ファイルをビルドパスに追加しましょう(log4j-1.2.17.jar とか)。

加えて、slf4j のライブラリも必須じゃないけど、ないと怒られて気持ち悪いので用意しましょう。こちらから slf4j-1.7.6.zip とかをダウンロードします。

ダウンロードしたものを展開して抽出されたファイルのうち、以下のような 2 つの jar を同じく IDE とかのビルドパスに追加します

  • slf4j-api-1.7.6.jar
  • slf4j-log4j12-1.7.6.jar

★サンプルコード

自分で 100 個のイベントを発生させて、それに自分自身で反応するだけのアプリケーションを作ってみました。本ブログエントリーに添付します(MyFirstReactor.java)。
MyFirstReactor.java 直

GitHub の Reactor WikiGetting Started にそってだらだらとコードを羅列しただけです。

ディスパッチャーに、Environment.THREAD_POOL を指定して、非同期ディスパッチするようにしてます。コンシューマーによるロジックの実行(100 回行う)が完了する前に、本 Java プロセスが終了する前に出力するメッセージ "Press Enter to finish listening..." がでてくる(つまり、100 回イベントを生成したらもう Java プロセス終了へ向かう)のと、イベントに付与した通し番号順にコンシューマーのロジックが実行されないところで、非同期処理っぽいところを体感できるかと思います。

★今後の個人的課題

  • Spring Data と Reactor の Spring サポートを組み合わせた、Spring のマナーに沿ったコーディング技術の確立& Reactor でフィルタリングしたデータの非同期永続化処理の実現
  • 分散構成とか、分散非同期キューとか HA 構成とかできるのかといった調査(TCP Client/Server 構成とかいうのがあるみたいだけど)
  • Spring XD との連携を試してみるとか