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