« Ajaxの"A"で気づく技術論 | メイン | 田坂広志氏の志 »

SCAをDIコンテナから考える

 都内某所にてIBM様(こういうときだけ様をつける)によるSOA関連セミナーを受けました。その中でSCA(Service Componenet Architecture)に関する説明があり興味深かったです。

SCA記事(Google先生選):
 BEA/IBM/Oracle/SAP/ZendなどSOAサービス統合簡素化技術SCA & SDO
 主要ベンダーがSOAプログラミング・モデルの新仕様「SCA」を共同発表
 SOA導入を簡単にする「SIerの知恵」、IBM、オラクルなど協力
 日本IBM、日本オラクルなど8社が共同でSOAの仕様策定

関連資料(IBMより):
 次世代SOAアプリケーションのためのオープン仕様
 Service Component Architecture(v0.9の仕様書など)

 SCAをどう理解するのか、ということですが一般的なSOA視点というのは資料が増えてくると思うので、SCAをDIコンテナの発展系として考えてみようと思います。
 ある程度は予想どおりだったのですが、SOA対応の商用版DIコンテナという説明でも大丈夫ではないでしょうか。僕の中で勝手に第3世代DIコンテナと呼んでいるものに相当すると思います。


DIコンテナとSOAの共通点
 DIコンテナというのはオブジェクトの組み上げによりアプリケーション構築するために使われるものです。しかも、オブジェクト相互の依存性を排除できるため、旧来の手法にくらべて自由に分割・統合、そして単体テストが行えるのが特徴となります。
 なお組み上げる単位はクラスが基本となります。ようはクラスを組み上げてアプリケーションを構築するわけですね。

 一方、SOAというのはサービスを組み上げてアプリケーションを構築するというものです。ばっくり定義すればサービスというのは「ビジネス上意味のある粒度」というものです。

 ですから、粒度の差はあれどDIコンテナもSOAも"ある単位のモノを組み上げてアプリケーションを構築する"という点では同じようなものです。では、DIコンテナがSOAで使われるためには何が足りないのでしょうか?それは次の3つです。


スコープ管理によるモジュール単位のデプロイ
 これはEclipseを考えた方がわかりやすいです。Eclipseは多くのプラグインによって構成されているわけですが、それを可能にしているのがスコープ管理されたプラグイン機構です。例えば2つのプラグインがバージョンが違う同じJARファイルに依存しているとします。この場合、それぞれのプラグインが、それぞれに持っているJARファイルをロードしなくてはいけません。お互いのプラグインがもっているJARファイルに相互にアクセスされては困るのです。
 こうした問題が起きないようにEclipseのプラグイン機構では、プラグインのスコープの中でクラスローダが機能するようになっています。

 SOAのように、ある程度の大きな粒度を持ったコンポーネントを組み合わせようとすると、そのコンポーネントの中でスコープが限定されて機能した上で、それらを組み合わせるようにしないといけません。簡単に言えばサブシステム単位でJARファイルを管理したいと。SCAでは、この単位をモジュールと呼んでいます。

 ちょっとひねって考えるとDIコンテナの階層化ともいえます。DIコンテナの1つのコンポーネントが、じつはDIコンテナで組み上げられたアプリケーションで…という感じです。組み上げられた単位でインターフェースが定義されていれば十分に機能します。これはBPELやESBでも実現されている考え方ですね。

 ちなみにApache Geronimo(僕の第3世代DIコンテナ認定済)では、モジュール単位でデプロイをする仕組みが用意されています。また、次世代のSpringでも、こうした機能が開発される予定だと聞いています。


構成定義情報による実装への非依存
 さて、ここからはSCAの目指す理想である"実装技術への非依存"の話になります。どうするのか、というと話自体は難しくありません。DIコンテナの設定ファイルをじっと見ていると、

<bean id="hoge" class="foo.bar.Hoge" />

なんて記述があります。これ属性classがありますけど、これをこんな感じにしたイメージです(あくまで、イメージですからね!)。

<bean id="hoge" implement="java://foo.bar.Hoge" />
<bean id="hoge" implement="c++://foo.bar.Hoge" />
<bean id="hoge" implement="php://foo.bar.Hoge" />
<bean id="hoge" implement="webservice://foo.com/bar/hoge" />

 ようはDIコンテナだとクラスをロードしてくるだけなんですが、この対象がJavaなのか、C++なのか、PHPなのか(SCAにはZendも参加しています)、WebServiceなのか、どーでもいいと。
 実はSCAの仕様が策定しているのは、こうした設定ファイル(構成定義情報)の書き方だけなんです。ですから実装言語や環境に応じてSCA用のコンテナ(ModuleContext)を実装するという形になります。こうすることで実装技術に非依存にアプリケーションの構成定義を行うのです。
 そして、各コンポーネント同士をワイヤリングして組み上げていきます。これはDIコンテナのアイデアまんま。その結果、各コンポーネントは明確なインターフェースによって通信(メソッド呼び出し)されます。定義はWSDLでもいいですしJavaでも大丈夫です。ようは、これまでのプログラミング・テクニックと同じでOK。


バインドによるプロトコルの隠蔽
 さて、これでモジュールが「スコープ管理された状態で、実装非依存に複数のオブジェクト組み合わせたもの」だということが分かっていただけた方と思います。
 次に、このモジュールを組み合わせてアプリケーションを構築しなくてはいけません。モジュールの内と外をつなぐのがバインドの考え方です。外から内がEntryPoint、内から外がExternal Serviceと呼びます。このアイデアはESBのパクリですね(JBIで言うBinding Component)。
 つまり外のプロトコルから内のプロトコル、内のプロトコルから外のプロトコルに変換する役割を負った人がいるのです。例えばWebServiceのプロトコルとMapオブジェクトにするとか、その逆とか。
 ま、これは、そんなものを間に挟みこむことで、複数の既存プロトコルに対応するというぐらいに考えてください。


SCAへの期待と不安
 だいぶ長くなってきたので終わりにしますが、SCAをDIコンテナから考えていくと、「スコープ管理によるモジュール単位のデプロイ」「構成定義情報による実装への非依存」「バインドによるプロトコルの隠蔽」という3つのパーツを追加したものと考えてよいのではないでしょうか(って、言い切っていいのかは不安。間違っている場合は、各位でツッコミ願います)。

 期待は大いにあって、これは今後のDIコンテナの発展の方向と間違いなくあっています。どのDIコンテナも"コンポーネントのスコープ管理"と"依存性の解決手段を増やす"というのは間違いないでしょう。SCAはDIコンテナの流れから考えると非常に自然で現実的な拡張です(実装に非依存にするという挑戦そのものが無謀であるという点を除いてw)。

 ちなみにServiceMixはJBIのメッセージング仕様によって"依存性の解決手段を増やす"というトライを行っていると解釈できます。これが正解かは不明ですが。

 不安は構成定義情報が、ものすごく複雑になる点です。オーサリングツールの発達という期待感もあるのですが、なかなか開発コミュニティには受け入れられないでしょう。

 あと、どーでもいいのですがアノテーションは微妙ですね。アノテーションの最大の問題点は、せっかく外部の追い出した設定情報を、わざわざオブジェクトの中に戻すところで、これが設定情報を複数個所に分散させることで混乱を招く気がします。ま、これも今後の使い方次第かもしれませんが。


 というわけで、今日、1時間だけ話を聞いた範囲で感じたことをまとめてみました。当たらずとも遠からずだとは思うのですがいかがでしょうか。

 なおSCAについて3/17の第5回テーマ 丸山先生レクチャーでも取り上げられます。まだ申し込み可能ですので興味がある方はお早めに。

トラックバック

このエントリーのトラックバックURL:
http://www.arclamp.jp/mt33/mt-tracback.cgi/1549

この一覧は、次のエントリーを参照しています: SCAをDIコンテナから考える:

» [開発]アークランプより「SCAをDIコンテナから考える」 送信元 SEの行き着くところ…
アークランプは俺が一番最初にチェックし始めたブログ。 [http://www.arclamp.jp/blog/archives/000790.html:title] ServiceMixを始め、様々な情報を仕入れさせてもろてます。 この話題はまたじっくり読むとして、本人がどーでもいいと書いている事に ひっかかってしもた... [詳しくはこちら]

コメント (7)

河村:

DIの発展系という感触でしたね。

ちょっと気になったのが、実装をコンポーネント単位で指定できることですね。JavaオブジェクトにC++オブジェクトをDIできるように見えるのですが、実際、そんなこと可能なのでしょうか?

それと、今日の話ではAOP関連の話は出てきませんでしたが、AOPってDI(xAOP)コンテナのおいしいところですよね。トランザクションやセキュリティの話が出てたから、もう少し仕様がクリアになれば何かしら見えてくるのかな?

hiro:


昨日はお疲れ様でした。

>外から内がEntryPoint、内から外がExternal Serviceと呼びます。このアイデアはESBのパクリですね(JBIで言うBinding Component)。

ご存知の通り、ESBは下位の通信プロトコル実装をアダプタやプロトコル・バインディングといったもので抽象化した上で、上位のレイヤに提供します。
JBIにおけるBinding Componentはアダプタやプロトコル・バインディングに相当すると思います。
一方、SCAベンダによる実装に依存する話ではありますが、特定の技術に対しての非依存性や拡張性を保つためには、SCA自身が通信プロトコル実装を提供するべきではありません。
SCAは下位に位置するソフトウェアが提供する通信サービスを利用すれば良いのです。
例えばSCAは、ESBが提供するアダプタやプロトコル・バインディング(JBIにおけるBinding Component)を利用して他のサービスとインタラクションするわけです。
この時、SCAのEntry PointやExternal Serviceは、ESBが提供するアダプタやプロトコル・バインディング(JBIにおけるBinding Component)への参照としてのみ機能します。
SCAのEntry PointやExternal Serviceが、通信サービスの実装を提供するべきではないのです。
あくまでSCAベンダによる実装に依存する話ではありますが、SCAの基本コンセプトは以上の通りだと考えています。
これがSCAはWebサービスやESBと「競合する」のではなく「協業する」技術だと言う所以です。

>あと、どーでもいいのですがアノテーションは微妙ですね。

これについては全く同感です。
私は今のところアノテーションのメリットを実感出来ていません。

hiroさん、ご指摘ありがとうございます。
そうですよね、何度も言われていたのに申し訳ないです。どうもbindingと聞くとメッセージ・ルーティングしている気になってしまいます(w。
External Serviceもスタブを取得して実行するだけでしょうし、なんていうか電車の車両を連結するみたいな感じにも思えてきました。
なんか、やっぱり面白いですね、SCAのアイデアは。あとは実際のプログラミングがどうなっていくかが楽しみです。

byechu:

一度、BEAWorkshopを試されてみてはいかがでしょうか。というのも、SCAってBeehiveのJavaControl(これもDIの一種なんですが)に発想が似てるなぁと思いましたし、アノテーションはXDocletですよね?なんとなくこれらの技術が目指しているところが理解できるように思いますし、オーサリングツールの発展を見るという意味でも、いい素材です。※別にBEAの回し者ではありませんw。

開発者側からみると、SCAは、JBIよりはBPELと補完しあう技術のように思っていました。BPEL単体で事が済むプロジェクトなんてないですから(だから独自拡張が増えるんですね)。かといって、JBIのルーティングが使いやすいとは思えない!BPEL for SCAができればいいなぁと思います。

議論が面白いので、もう一点だけ。
アノテーションが美しくないという議論もわかるのですが、Railsとか触ってると、その方向に進むのもわかる気がするんですよね。結局は設定するのもコード書くのもプログラマーじゃねーかと。まあ、体制などにもよるのですが「選択できる」ということは、いいことなのではないでしょうか。

丸山:

丸山です。

僕がSCAをみて面白いと思ったのは、それが、DI+コンポーネントの発展の方向について、その一般的な傾向について、示唆的だと思うところがあったからです。

べたの実装に対してDIという抽象化は、具体的なレベルでは、実装のコンフィグの可能性を提供するのですが、SCAのコンポーネントを、DIコンフィグの自立化、そのコンポーネントへの実体化と考えることが出来ると思います。

同語反復的ですが、こうしたコンポーネントは、実装に対して、コンフィグ可能な能力を持ちます。それが、空虚な同語反復に見えるのは、僕らが、まだ、実装を中心に考えていて、それとは区別される、しかしながらその上位にあるコンフィグ可能な能力を、まだ、独立の実体として、しかも重要な対象として把握するのに慣れていないからです。

こうした動きは、SCAだけではなく、萌芽的にはSpringの設定ファイルもそうですし、xbean、それからGeronimoのGBeanでも、共通におきていることのように僕には思えます。

実装とは相対的に区別される、萌芽的には諸コンフィグの、より本質的には、そうしたコンフィグによって表現される諸能力のバンドルとして、新しいコンポーネント像を組み立てることが出来ると思います。

多様で可変な能力の背後に一つの実体を想定することで、僕らの認識は、多分、一歩は進みます。

byechuさん。コメント遅れました。ごめんなさい。

Beehiveはちらっとしか見ていないのですが、なるほど、今度はじっくり見てみます。

感覚論ですがコンテナアプローチという点ではSCAとJBIは良く似ていますし、設定ファイルによる固めの組み上げという点ではSCAとJBIは良く似ています。
なんか、いろいろなアイデアの断片を組み合わせたのがSCAという感じですかね。

> アノテーションが美しくないという議論もわかるのですが、Railsとか触ってると、その方向に進むのもわかる気がするんですよね。

美しくないというか、特定の用途ではすごい有用な感じはするのですが、それをもってDI機能だとか言うのはどうかと思っています(w。これ以上、設定ファイルの仕様を議論したくないもの分かるのですが、設定ファイルは不滅でしょう。

もちろん選択できることは重要ですからね。たぶん適材適所だという議論になると思います。

丸山先生。コメントありがとうございます。

>僕らが、まだ、実装を中心に考えていて、それとは区別される、しかしながらその上位にあるコンフィグ可能な能力を、まだ、独立の実体として、しかも重要な対象として把握するのに慣れていないからです。

なるほど分かる気がします。

最近、実装で試しているのはJavaコンポーネントをXML/スクリプト言語(JavaScript for Java)によって組み上げるという考え方です。この前提に立つと、いかにコンフィグの上にコンポーネントを配置するのか?あるいはコンポーネントをいかにして組み上げるのか?という考え方をすることができます。

ある機能がどういった構造をもち、それをコンフィグとしてどのように分離可能かを考えるのは楽しい作業ですね。

特にDIコンテナの使い方にはいろいろな工夫が凝らせます。その際にはServiceMix的なアプローチは非常に有用です。Springの記述方式が文脈レスなのに、xbeanによって対象コンポーネントが持つ文脈が浮かび上がってきます。

またスクリプト言語もコンフィグの一種かなーという想定でいろいろ試しています。XMLだけでは表現できない微妙なものは、無理せずスクリプトで記述するとすっきりします(デバックとかの問題は早晩解決されるでしょうし)。

ただコンフィグの実体というところには至っていない気がします。ま、それほど遠くない未来の話だとも思っていますが。

また、いろいろお話させてください。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2006年03月06日 23:20に投稿されたエントリーのページです。

ひとつ前の投稿は「Ajaxの"A"で気づく技術論」です。

次の投稿は「田坂広志氏の志」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Creative Commons License
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.
Powered by
Movable Type