既存Javaプログラム向け 分散化支援システムの開発

既存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