2012年4月2日月曜日

CQRS, EDA

3月19日(月)に要求開発アライアンスのセッション『Object-Functional Analysis and Design: 次世代モデリングパラダイムへの道標』を行いましたが、説明を端折ったところを中心にスライドの回顧をしています。

セッションでは、オブジェクト関数型言語が中心的な実装言語となった時のOOADの進化の方向性、という観点でストーリ展開してきました。ここでは、クラウド・プラットフォームは、このストーリを考える上での文脈の一つとして捉えています。

今回は逆に、クラウド・アプリケーション・アーキテクチャを軸にしてセッションの情報を再構成してみたいと思います。

クラウド・アプリケーションのイメージ

今回のセッションでは説明しなかったのですが、従来のアプリケーションとクラウド・アプリケーションはそれぞれこのようにイメージしています。

基本となるのは画面とデータベース間のOLTPの枠組みでの転記で、帳票としての印刷も重要なモジュールです。外部連携や通信は特別扱いの連携モジュールを用いて行います。OLTPで賄えない部分は、夜間などの定刻に起動するバッチ処理で行います。ここが非同期的に動作する部分です。

このあたりの基本構造はメインフレームからオフコン、クラサバを経てWebアプリケーションまで変わっていません。基本的には、画面からのリクエストでジョブがキックされてトランザクション配下で同期型に転記処理が遂行されます。プログラムの作り方はずいぶん変わりましたが、アーキテクチャの根幹のところは案外共通しているわけです。

一方、クラウド・アプリケーションの場合、クラウド内で生起する様々な事象がシグナルとしてクラウド・アプリケーションに上がってくるようになります。このシグナルを自アプリケーションにとって意味のあるイベントであると認識するフィルタ処理から始まってイベント駆動でアプリケーションが動作します。イベントの発生は、クラウド上に遍在する複数のイベント発生源上で同時に起きるので、非同期、並行で処理を遂行していく必要があります。

EDA

実際のところ、エンタープライズアプリケーションも前述のレガシーアプリケーションのままでは時代のニーズに合わないので、地道に進化してきており、SOAの傘の下でさまざまな技術が発展しています。しかしSOAというと、合併した企業間のシステム統合や、業務改革と連動した巨大エンタープライズ・アプリケーションの再構築といった、雲の上の話であることが多く、そういった案件以外での認知度は今ひとつです。

しかし、この中で蓄積されてきた技術は、クラウド・アプリケーションの基盤技術として有効であるというのがボクの認識です。ただし、実装技術は古いので、新しい革袋の中で再構築していく必要があるでしょう。その新しい革袋はRESTであったり、関数型であったり、DSLであったりするはずです。

そういった、イベント駆動のアプリケーション向けのアプリケーション・アーキテクチャとしてEDA(Event-Driven Architecture)が知られています。イベント駆動アプリケーションと関数型による実現は「EDAとオブジェクトと関数」や「DCI (Data Context Interaction)」で考察しました。

EIP

EIP(Enterprise Integration Patterns)もクラウド・アプリケーションに転用できる重要な技術です。

EDAを実現する基盤メカニズムとして、ESB(Enterprise Service Bus)やMOM(Message-Oriented Middleware)があり、これを使用するアプリケーション構築パターンとしてEIPが整備されています。

今回は、Apache CamelによるScala DSLとして右の図を用意しました。この図はデータフローに対する関数型&DSLの記述力の例として用意しましたが、クラウド・アプリケーション・アーキテクチャ上に対する重要なアプローチと考えられるEIPの紹介という意味もあります。

EIPは元々企業アプリケーション・アーキテクチャをインテグレーションするためのパターンで、対象の粒度が企業アプリケーションですから、相当大きなものになります。しかし、このパターンはコンポーネントといった、もっと小さな粒度にも適用できると思われます。Apache CamelによるScala DSLもこういった路線が狙いと思います。

今回のセッションでは関数型&DSLを用いてデータフローを記述するアプローチで、関数型とクラウド・アプリケーションの連携を考えています。EIPも従来型のESBのXML定義ファイルベースではなく、関数型&DSLの枠組みでクラウド・アプリケーションに組み込まれていくことになるでしょう。

モデリング

アプリケーション・アーキテクチャが、EDAベースになっていくとすると、モデリングの軸となるモデル要素としてイベントが非常に重要になってきます。

元々、オブジェクト・モデリングではイベントが重要なモデル要素だったので、この点を素直に伸ばしていけば、クラウド・アプリケーションにも適用できるはずです。

この点を盛り込んだ「メタモデル」をセッションで紹介しました。

また、「EDAとオブジェクトと関数」ではイベントをEDA上で実現するメカニズムについても考えました。

CQRSとEDA

CQRS(Command Query Responsibility Segregation)はクラウド・アプリケーション向けに注目されているアプリケーション・アーキテクチャです。

この記事の先頭に挙げたスライド「CQRS, EDA」はCQRSでのCommandで、イベントを発生させ、イベントを起点にEDA的なメカニズムで処理を実行していく事を説明する目的のものです。セッションでは時間の関係で省略しました。

コマンドの発行をイベントの発行と連動させ、EDA上で実現するとEDAの非同期的な実行がCQRSの意図する振舞いとぴったりはまります。CQRS&EDAの組合せが全体のバランスがよいのではないかという提案が、このスライドの意図です。

イベントは、モデリング上で抽出された"ビジネス・イベント"を中心に考え、実装の必要に応じてシステム・イベントを併用する形になるでしょう。このようにすることで、前述のメタモデルをベースとしたオブジェクト・モデリングともつながってきます。

今回のセッションでの考察では、このアーキテクチャの中で、関数型はイベント発生に対応するイベントコンシュマーの実現で用いられることになります。短いものは関数型言語で直接記述して同期実行、大きなものはSparkのようなDSLで記述して非同期実行という使い分けになるでしょう。

追記
イベントコンシュマーをイベントプロデューサに誤記していたので訂正しました。

諸元

当日使用したスライドは以下のものです。(PDF出力ツールの関係で、当日は非表示にしたスライドも表示されています)

このスライド作成の様子は以下の記事になります。

まとめは以下の記事です。

回顧は以下の記事になります。

0 件のコメント:

コメントを投稿