既存Javaプログラム向け 分散化支援システムの開発 東京工業大学大学院 情報理工学研究科 数理計算科学専攻 千葉研究室所属 03M37200 須永 豊 修士論文発表会
既存ソフトウェアの分散化 現実的なソフトウェアを分散化出来るか? ターゲットとするのは機能分散 非分散な既存ソフトウェア 分散用に開発しなおすのはコストがかかる 再利用したいモジュール 分散アプリケーション開発用のモジュールは不向き EJB,Servlet,ORB・・・ フレームワークに応じた大幅なプログラムの変更 煩雑な修正作業を自動化するツール Addistant,J-Orchestra etc 現実的なソフトウェアを分散化出来るか?
このプログラムをサーバ・クライアント型のアプリケーションに変えて欲しい! 実例の紹介(ARMSoftware) ARMSoftware[Arita,M. ‘03] 化学物質の構造式・反応式・パスウェイを辿るためのJavaプログラム 2003年度未踏ソフトウェア事業 2万行強の中規模サイズアプリケーション スタンドアロンなプログラム 利用者はホームページからダウンロードし、自分のマシン上で利用 このプログラムをサーバ・クライアント型のアプリケーションに変えて欲しい! 修士論文発表会
ARMSoftwareの分散化 開発者からの要求 手動で分散化を行い、約3人月 プログラムの変更 特定の機能のみをサーバで動かしたい DBからパスウェイを探索する機能 DBから構造式の画像を取得する機能 etc プログラムの変更 サーバ側で動かすために特定クラスをリモート化 JavaRMIの仕様に合わせてリモートクラス化 呼び出し元の変更 リモート化によって生じる アプリケーションセマンティクスの変更 アプリケーション毎に異なる処理 手動で分散化を行い、約3人月 典型的な 分散化のための リファクタリング 従来ツールで サポートが可能 修士論文発表会
アプリケーションセマンティクスの変更(メソッド単位での遠隔配置) あるクラスの特定メソッドのみ遠隔配置 分散化に適していないモジュール分割 従来システムではサポートされていない class Doc extends…{ public short urlIndex; public Vector urlList; public Object[] search (…){ /*サーバ側で処理させたい。 フィールド等にアクセスし、 outputData()の処理内容に影響 する*/ } public void output(…) { //クライアント側で処理 ….. urlList urlIndex output() search() ……… Docオブジェクト Docオブジェクト Docオブジェクト urlList urlIndex 同期処理 Client Server
アプリケーションセマンティクスの変更 (マルチユーザ化) 複数ユーザで利用可能に クライアント毎にセッションを用意 セッションの実装方法は様々 リストを使ったり、デザインパターンを用いたり 用意したいセッション処理も異なる Server スタンドアロンな プログラム Client C Client Client B 修士論文発表会
従来の自動分散化システムでは困難な点 アプリケーションセマンティクスの変更を伴う 分散化 分散化に適さないモジュール分割のプログラム アプリケーションセマンティクスの変更を伴う 分散化 分散化に適さないモジュール分割のプログラム 遠隔配置以外の処理も必要 機能拡張等のプログラムの構造を変える処理 遠隔配置を施す以外のプログラム変換は行わない セッション処理の付加等 しかし、現実的なソフトウェアには必要 典型的な自動化では対応できない箇所を サポートできるツールが必要 修士論文発表会
分散化支援ツールJacrossの提案 分散に関する記述力を強化した分散支援ツール XMLによる、より詳細な分散配置の指定 Aspect指向技術を応用し、プログラムの構造を変化 ソースコードに変更は加えない 分散処理用Aspectとしてモジュール化 遠隔参照の実現等の典型的な分散化処理は自動化 バイトコード変換により実現 分散 処理用 Aspect 分散 ポリシー 元プログラム ・スタンドアロン ・シングルユーザ用 生成プログラム ・サーバクライアント ・マルチユーザ用 Jacrossで分散化 修士論文発表会
典型的な自動分散化処理 対象クラスのタイプに応じた配置指定 プロキシマスタ方式に基づき、クラスを遠隔参照出来る用に変換 Replace 対象クラスのコードが可変である場合に適用可能 元クラスを中身がプロキシ化されたもので置換 Rename 参照側クラスのコードが可変である場合に適用可能 <クラス名>+_Proxyでプロキシクラスを生成 参照側クラス内の対象クラスへの参照をプロキシに変更 Subclass 対象クラスを遠隔とローカルの2箇所で利用したい場合 対象クラスのサブクラスとしてプロキシを実装 指定クラス内からの参照のみをサブクラス化されたプロキシへと変更 修士論文発表会
permethod メソッド単位で分散化処理 ローカルと遠隔でそれぞれ1つずつオブジェクトを生成 メソッドを指定し、対象メソッドのみを遠隔配置 各方針と併用 ローカルと遠隔でそれぞれ1つずつオブジェクトを生成 遠隔メソッド呼び出し時のみ遠隔オブジェクトを利用 遠隔とローカルのオブジェクトの反映が必要 自動化すべきではない箇所(実装は様々) Doc d = new Doc(); Object ret = d.search(); d.output(); Client Doc output() index 同 期 化 等 の 処 理 が 必 要 R M I Doc search() index Server 修士論文発表会
分散処理用Aspect ソースコードに変更は加えない Inter-type Declaration インタセプタ XMLを利用したバインド 元プログラムにフィールドとメソッドを追加する。 インタセプタ 元プログラムの制御フローを変える 利用者の指定した箇所で割り込み処理を行う。 XMLを利用したバインド Inter-type Declarationとインタセプタをバインドする為の記述は分散ポリシー内で行う 修士論文発表会
Inter-type Declaration フィールドやメソッドを追加する Javaで定義 追加されたメソッドもリモート化の対象に 追加先を予測して指示 Inter-type Declaration public class DocInterType { public Vector indexlist; public Vector getList() { …… } 生成クラス public class Doc…{ public Vector indexlist; public Vector getList() { …… } public Object foo(..) { 元クラス class Doc…{ …… public Object foo(..) { } 修士論文発表会
インタセプタ 元プログラム インタセプタ 制御フローを変える為のプログラム JacrossInterceptor Invocation プログラムの指定した箇所で割り込み処理を行う インタセプタはJavaで定義 JacrossInterceptor インタセプタは、このクラスを継承し、全てのメソッドはObject型の戻り値とInvocation型の引数を持つ → 制約 proceed() : 割り込み元の操作を実行するメソッド Invocation getThis(), getTarget() 等: 割り込み元のコンテクストを取得するメソッドを提供 元プログラム Doc d = new Doc(..); …… d.setIndex(..); …. 割り込み箇所 (pointcut) イ ン タ セ プ で 処 理 class DocInterceptor…{ ……. Object setLog(Invocation i) { System.out.println(“before”); Object ret = proceed(i); System.out.println(“after”); return ret; } …… インタセプタ 修士論文発表会
ポリシー記述 XMLで記述 配置方針を選択 分散処理用Aspectのバインド 遠隔配置の方針を指定 <import>タグ Inter-type Declarationの指定と追加先<inter-type>タグ pointcutの指定とインタセプタの指定<inteceptor>タグetc 利用できるpointcut指定子は5つ <policy> <import proxy=“replace-permethod” host=“server1”> armview.util.Doc.search(..)@armview.util.BasicDoc armview.util.Doc.remotesetIndex(..) </import> <import proxy=“replace” host = “server2”> …… <inter-type name=“DocInterType” bind-to=“armview.util.*Doc” /> <interceptor classname=“DocInterceptor”> <intercept name=“setIndex” expression=“execution(armview.util.*.setIndex(..))”/> <intercept name=…/> <binding intercept-name=“synchroIndex” to=“setIndex”/> <binding …/> </interceptor> </policy> call メソッドの呼び出し execution メソッドの実行 set/get フィールドの読み出し/書き出し new インスタンス生成 修士論文発表会
ARMSoftwareの例 メソッド単位での分散化処理 Inter-type Declaration Doc d = new Doc(..); …… d.setIndex(..); Objec ret = d.search(..) d.output(); 元プログラム public class DocInterType { int index; public void remotesetIndex(int index) { this.index = index; } …… 遠 隔 参 照 の 自 動 化 pointcut 要素 の 追 加 class Doc…{ public int index; …… public Object search(..) { } public void setIndex(..){ public void output(..) { class DocInterceptor…{ ……. Object synchIndex(Invocation i) { Object ret = proceed(i); Doc d = (Doc) i.getTarget(); d.remotesetIndex(d.index); return; } …… 修士論文発表会 インタセプタ 対象クラス
ARMSoftwareの例 機能拡張(セッション処理) Doc d = new Doc(..); …… Objec ret = d.search(..) d.output(); クライアント側 元プログラム Inter-type Declaration public class DocInterType { public static Vector namelist; public static void setUName (int id,String name) { indexlist.set(id,name); } public static String getUName(int id) { …… 遠 隔 参 照 の 自 動 化 pointcut class DocInterceptor…{ ……. Object setSession(Invocation i) { Doc.name = getUName(id); Object ret = proceed(i); Doc.setUName(id,Doc.name); } Object sendCurrentID(Invocation i) { …… class Doc…{ public static String name; …… public Object search(..) { } public void output(..) { 要素 の 追 加 pointcut サーバ側元クラス インタセプタ
コード数の比較 ARMSoftwareの変換を通じた比較 オリジナルとの差分(変更が必要なコード数、クラス数の比較) 変更が必要なクラス数 オリジナル=元プログラム 手動=手動による分散化処理 Jacross=Jacrossによる分散化処理 分散ポリシーも含む 変更が必要なクラス数 変更に必要な行数 オリジナル⇔手動 33 951 オリジナル⇔Jacross 5 349 割合(Jacross/手動) 15% 36% 修士論文発表会
関連研究 自動分散化システム アスペクト指向言語 Addistant[Tatsubori’01] J-Orchestra[Tilevich’02] アスペクト指向言語 AspectJ[Kiczales’01] AspectWerkz JBossAOP 修士論文発表会
まとめ 分散化処理は定型的な作業ではない 典型的ではない分散化を支援するシステムJacrossの提案 課題 アプリケーションに依存した処理が必要 典型的ではない分散化を支援するシステムJacrossの提案 アプリケーションセマンティクスの変更を伴う分散化 より現実的なアプリケーションに対応 利用者のニーズに応じた分散化処理の実現 分散処理に伴う機能拡張が容易に 典型的な作業→自動化 アプリケーションに依存→アスペクトでサポート 課題 分散処理用Aspectの工夫 pointcut指定子の増加 統合したシステム 修士論文発表会