ポータル開発ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容

最適なパフォーマンスを得るためのポータルの設計

可能な最大のパフォーマンスを得るためにポートレットを最適化するプロセスは、開発のすべての段階にまたがります。パフォーマンスを継続的にモニタし、適切な調整を行う必要があります。

この章では、ポートレットの開発時に組み込むことのできるパフォーマンスの最適化について説明します。

この章の内容は以下のとおりです。

 


コントロール ツリーの設計

ポータルのパフォーマンスに影響を与える最も重要な変数の 1 つは、ポータル フレームワーク コントロールです。ポータル フレームワークのコントロール (ページ、ポートレット、ボタンなど) が多くなると、コントロール ツリーが大きくなります。

コントロール ツリーの仕組み

ポータルがインスタンス化されるときに、分類、すなわちポータル リソース (デスクトップ、ブック、ページ、ポートレットなど) の階層が生成されます。各リソースは、図 11-1 のようにコントロール ツリーのノードとして表されます。

図 11-1 単純なポータル図の例

単純なポータル図の例

この例では、1 つのポータルに 1 つのメイン ブックがあり、その中に 6 つのサブブックが含まれています。各サブブックにはそれぞれ 2 つのページがあり、各ページはそれぞれ 2 つのポートレットを含みます。これだけでも、このポータルのコントロールは少なくとも 42 になります。ボタン、ウィンドウ、メニュー、およびレイアウトを含めると、ポータルのコントロール数は大幅に増加します。

注意 : この例は、極めて単純化したものです。エンタープライズ ポータルに含まれるコントロールは数千に及ぶことがあります。

コントロール ツリーのパフォーマンスへの影響

コントロール ツリーが構築され、すべてのインスタンス変数がコントロールに設定されたら、ポータル全体を表示する前に、ツリーが各コントロールのライフサイクルを実行する必要があります。ライフサイクル メソッドは、深さ優先順で呼び出されます。つまり、各コントロールの init() メソッドがすべて呼び出されてから、各コントロールの loadState() メソッドが呼び出されるというように続きます。順序は、ポータルの分類における各コントロールの位置によって決まります。たとえば、図 11-2 のコントロール ツリーに示される分類は、ブック (B1)、ブックに含まれる 2 つのページ (P1 および P2)、各ページに含まれる 2 つのポートレット (p1 - p4) で構成される単純なポータルです (p2 にはさらにサブブック、ページ、ポートレットの階層も含まれています)。

図 11-2 コントロール ツリーとライフサイクル メソッド

コントロール ツリーとライフサイクル メソッド

このポータルが表示されるとき、init() メソッド (_nfpb=true の場合は handlePostBackData() も) が各コントロールで最初に呼び出されます。順序は、B1、P1、p1、p2、B2、P3、p5、p6、P2、p3、p4 です。次に、loadState() メソッドが同じ順序で呼び出されます。同様に、saveState() まですべてのライフサイクル メソッドが呼び出されます。

注意 : コントロールのライフサイクル メソッド preRender()render()、および dispose() は、表示されるコントロールのみで呼び出されます。

ライフサイクルを通して各コントロールを実行するには、オーバーヘッドの処理時間が必要になります。コントロールが数千に及ぶポータルであれば、処理時間も比例して長くなります。このように、ポータルのコントロール ツリーが大きくなると、パフォーマンスへの影響も増大することがわかります。

 


複数のデスクトップの使用

ポータルの柔軟性を損なわずにコントロール ツリーのサイズを制限する最も単純な方法は、ポータルを複数のデスクトップに分割することです。ポータルの分類では、デスクトップは、別のポータルに埋め込まれたポータルとして扱われます。デスクトップは、ポータルに備わっているすべての機能を活用することができ、その中に別のデスクトップを含むことができます。

複数のデスクトップを使用する理由

複雑なポータルを複数のデスクトップに分割すると、コントロールがそれぞれのデスクトップに分散されます。コントロール ツリーは個々のポータルに相当し、デスクトップはポータルと同様の動作をします。このため、各デスクトップが独自のツリーを持ち、そのツリーのコントロールはそのデスクトップが開かれたときにのみ構築されます。このように、大きなコントロール ツリーを持つ複雑なポータルを複数のデスクトップに分割することで、ツリーのコントロール数が、アクティブなデスクトップで必要な数にまで削減されます。つまり、ポータルを 1 つのデスクトップとして表示するために必要な時間が短縮し、ポータルのパフォーマンスが向上します。

ポータルが表示されるとき、処理時間の 15% はコントロール ツリーの構築に使用されます。ライフサイクル メソッドの実行には 70%、ガベージ コレクション (ヒープから不要なオブジェクトを消去して、新しいオブジェクトのために領域を解放するプロセス) には 15% が使用されます。構築とガベージ コレクションは常に実行されますが、ライフサイクル メソッドの実行は表示されるコントロール (デスクトップ上に見えているコントロール) についてのみです。したがって、複数のデスクトップの使用は、オーバーヘッドを大幅に節約し、システムのパフォーマンスの向上につながります。

たとえば、図 11-1 に示すコントロール ツリーの例は、42 のコントロールを含む 1 つのポータルを表します。このポータルを図 11-3 のように複数のデスクトップに分割した場合、ポータル全体でのコントロール ツリー数は増加しますが、各ツリーの大きさは約 3 分の 2 に縮小し、処理時間もおよそ 3 分の 2 になり、ポータルの表示に必要な時間が大幅に短縮されます。

図 11-3 複数のデスクトップに分割された単純なポータル

複数のデスクトップに分割された単純なポータル

図 11-4 は、図 11-3 の例を開いたときにどのように表示されるかを示します。

図 11-4 複数のデスクトップによるコントロール ツリー サイズの縮小

複数のデスクトップによるコントロール ツリー サイズの縮小

複数のデスクトップを使用する際の設計上の決定

これらの例が示すように、複雑なポータルを複数のデスクトップに分割すると、パフォーマンスの向上の面では非常に効果的です。ただし、複数のデスクトップに分割する追加作業を考慮した場合、必ずしもすべてのポータルで有効な手段であるとは言えません。複数のデスクトップを使用してポータルを実装する前に、設計上の重要な決定事項について考慮する必要があります。次に例を示す。

デスクトップの作成の詳細については、「デスクトップ」を参照してください。

 


コントロール ツリーの最適化

ツリー最適化の意味は、名前が示すとおりです。コントロール ツリーを表示するときに、システムのオーバーヘッドを最小限に抑えながらも、ユーザがポータル インスタンスを正常に使用するために必要なすべてのポータル コントロールを提供するようにします。

注意 : ポートレットの非同期表示は、コントロール ツリーの最適化と共に使用できます。ポートレットの非同期表示の詳細については、『ポートレット開発ガイド』を参照してください。

コントロール ツリー最適化の有効化

コントロール ツリーの最適化を有効にするには、コード リスト 11-1 に示すように、.portal ファイルの treeOptimizationEnabled フラグを true に設定します。

コード リスト 11-1 .portal でツリー最適化を有効にする
<desktop> element:
<netuix:desktop definitionLabel="defaultDesktopLabel"
markupName="desktop" treeOptimizationEnabled="true"
markupType="Desktop" title="SimplePortal"><netuix:lookAndFeel
definitionLabel="defaultLookAndFeel">
<netuix:desktop/>
注意: .portal ファイルに treeOptimizationEnabled= が含まれない場合、ポータルはデフォルトで treeOptimizationEnabled=false になります。

このフラグを true に設定すると、ポータル フレームワークによってコントロール ツリーの全体ではなく一部が生成されます。この部分的なツリーは、表示されてアクティブになるコントロールだけで構成されます。このように、表示する必要があるコントロールが減るため、処理時間とコストを大幅に削減できます。

ポータルについて、このフラグを有効にするには、図 11-5 のように Workshop for WebLogic のプロパティ ビューで [ツリー最適化] を true に設定します。

図 11-5 Workshop for WebLogic でツリー最適化を有効にする

Workshop for WebLogic でツリー最適化を有効にする

注意 : 新しいデスクトップのデフォルト値は treeOptimizationEnabled="true" です。

現在のページの設定

フラグが実際に機能するためには、コード リスト 11-2 のように、ファイル beehive-url-template-config.xml (Portal_Web_Project/webAppName/WEB-INF にある) で <url-template> 要素に {url:currentPage} が設定されていることが必要です。

注意 : Workshop for WebLogic で新しいプロジェクトを作成すると、currentPage が自動的に追加されます。ただし、以前のバージョンの WebLogic Portal から移行している場合は、beehive-url-template-config.xml を手動で更新する必要があります。
コード リスト 11-2 beehive-url-template-config.xml の URL テンプレート コンポーネント
<!-- URL templates -->
<url-template name="default">
{url:scheme}://{url:domain}:{url:port}/{url:path}?{url:queryString}
{url:currentPage}
</url-template>
<url-template name="proxyurl">
{url:scheme}://{url:domain}:{url:port}/{url:prefix}/{url:path}?
{url:queryString}{url:currentPage}
</url-template>
<url-template name="finurl">
https://fin.domain.com:7004/{url:prefix}/{url:path}?{url:queryString}
{url:currentPage}&amp;dept=finance
</url-template>
<url-template name="default-complete">
{url:scheme}://{url:domain}:{url:port}/{url:prefix}/{url:path}?
{url:queryString}{url:currentPage}
</url-template>
<url-template name="jpf-default">
http://{url:domain}:{url:port}/{url:path}?{url:queryString}
{url:currentPage}
</url-template>
<url-template name="jpf-action">
http://{url:domain}:{url:port}/{url:path}?{url:queryString}
{url:currentPage}
</url-template>

ツリー最適化の仕組み

ポータル サーブレットはリクエスト (マウスのクリック) を受け取ると、キャッシュを読み込んで、コントロール ツリー ファクトリが存在するかどうかを判断します。存在しない場合は、controlTreeFactoryBuilder を呼び出し、.portal ファイルから XML を渡します。このクラスがコントロール ツリー ファクトリをサーブレットに返し、サーブレットがリクエストを CreateUIControlTree クラスに渡します。

_pageLabeltreeOptimizationEnabled="true" が設定されている場合、CreateUIControlTreeFactoryPartialUIControlTreeCreator() メソッドを呼び出し、このメソッドは、指定のページ ラベルおよびアクティブなページとブックのラベルのセットで識別されるコントロールのみで構成されるコントロール ツリーを返します。これが、部分的なコントロール ツリーです。

たとえば、図 11-4 のポータルでツリー最適化が有効になっている場合、リクエストを発行する (マウスをクリックする) と、図 11-7 のようにアクティブなコントロールのみが表示されます。

図 11-7 ツリー最適化によるコントロール ツリー サイズの縮小

ツリー最適化によるコントロール ツリー サイズの縮小

saveState() ライフサイクル メソッドの実行時に、このセッションでアクティブなページとブックのラベルのセットが格納されて、構築するコントロールが PartialUIControlTreeCreator() に通知されます。これらのコントロールのみが構築され、ポータルのそれ以外のコントロールは無視されます。結果として、コントロール ツリーを最適化すると、構築する必要のあるコントロールが減少するため、処理オーバーヘッドが大幅に削減され、パフォーマンスが大いに向上します。

複数レベル メニューとコントロール ツリーの最適化

大規模なポータルの場合、単一レベル メニューを使用すると、複数レベル メニューを使用する場合よりも大幅にパフォーマンスを向上できます。環境によって条件は異なりますが、40 のブックで構成される大規模なポータルで、各ブックに 10 ページ、各ページに 10 のポートレットがあり (合計 4000 ポートレット) 、通常のユーザ負荷が 2000 同時ユーザになる場合を考えます。

この例の場合、単一レベル メニューを有効にすると、複数レベル メニューを使用するポータルよりも、システムの応答時間は少なくとも 2 倍速くなります。これは、コントロール ツリーの最適化がオンになっているかどうかに関係なく、複数レベル メニューではコントロール ツリーを走査してメニューの構築が可能である必要があるためです。複数レベル メニューを使用してコントロール ツリーを最適化する方法にも利点はありますが、この場合、システムのパフォーマンスが主な目的ではありません。

ツリー最適化を使用する際の制約

大量のコントロールを必要とする複雑なポータルを作成する場合に最適なポータル パフォーマンスを実現する最も簡単な方法は、ツリーを最適化することです。現在のポータル インスタンスでアクティブでないコントロールは構築されないので、時間とオーバーヘッドが大幅に減少します。ただし、ツリー最適化によってポータルの動作が少し変化することや、ポータルの実装によってはツリー最適化を使用することが有効であるとは限らないことに注意してください。以下に例を示します。

これらの条件に十分に注意し、必ず事前にポータルで完全なリグレッション テストを実行してから、treeOptimizationEnabledtrue に設定してください。上記のいずれかの問題が発生した場合は、ポータルの設計を再考するか、ツリー最適化を完全に無効にする必要があります。

ツリー最適化の無効化

これまで説明したように、コントロール ツリーの最適化はほとんどのポータルに効果的ですが、場合によっては動作の制約があるために無効にする必要があります。最適化を無効にすると、リクエストのたびにポータルによってコントロール ツリー全体が作成されます。このとき大規模なポータルではパフォーマンスに大きな影響が出ることに注意してください。予期されるパフォーマンスの低下が、機能の向上で埋め合わせられるかを判断する必要があります。

ツリー最適化を無効にするには、以下のいずれかを実行します。

1 インスタンスのみでツリー最適化を無効にする場合は、リクエストのパラメータに nfto="false" を含めます。URL はフレームワーク クラス GenericURL および PostbackURL を使用して生成されるため、パラメータを URL にプログラムによって追加する必要があります。これらのクラスの詳細については、WebLogic Portal「Javadoc」を参照してください。

次に示すコードは、このパラメータを追加する方法の一例です。

PostbackURL url = PostbackURL.createPostbackURL(request, response);
url.addParameter(GenericURL.TRE_OPTIMIZATION_PARAM, "false");

 


パフォーマンスを向上させるその他の方法

WebLogic Portal では、コントロール ツリーを効果的に使用してポータルの分類を管理する他にも、パフォーマンスを向上させる方法があります。これらのソリューションはすべて、複数のデスクトップやコントロール ツリーの最適化と組み合わせて使用でき、ポータルの優れたパフォーマンスを実現します。この節では、WebLogic Portal で提供される最も効果の高いパフォーマンス向上ソリューションについて説明します。

資格の慎重な使用

資格によって、ポータル アプリケーション内のリソースにどのユーザがアクセスできるか、そのリソースに対してユーザが何をできるかが決定されます。このアクセスはアプリケーションの訪問者に割り当てられているロールに基づいており、これによって柔軟なリソース管理が可能になります。たとえば、「従業員レビュー」というポートレットがある場合、「マネージャ」という訪問者の資格ロールを作成してポートレットに割り当てると、ログインしたユーザのうち、そのロールに属するユーザのみがポートレットを表示できます。

アプリケーションを訪問するユーザには、ユーザ名、ユーザが属するグループ、日時、またはユーザのプロファイルの特徴などを含む条件式に基づいて、ロールが割り当てられます。たとえば、マイレージ サービスの参加者で前年に 50,000 マイル以上搭乗したユーザに「ゴールド メンバー」ロールを割り当てることなどができます。このロールは、ユーザがサイトにログインしたときに動的に割り当てられます。

パフォーマンスへの資格の影響

ポータルの最適なパフォーマンスを実現するために、資格は慎重に使用してください。資格が多すぎると、パフォーマンスに大きく影響します。資格エンジンは、処理の表示段階で呼び出され、システムのオーバーヘッドとルールをチェックする必要があるためです。このチェックによってさらにシステムのオーバーヘッドが増加するため、ポータルでチェックが頻繁に必要になると、パフォーマンスが低下します。また、資格エンジンは管理タスクの管理も行うため、これによってもオーバーヘッドが増加し、パフォーマンスが低下します。

デフォルトで、資格は LDAP ではなくデータベースに格納されます。その場合でも、資格が多すぎるとパフォーマンスの低下につながる可能性があることに常に注意する必要があります。

資格を使用する際の推奨事項

資格を慎重に使用するための、簡単な推奨事項を以下に示します。

ユーザによるカスタマイズの制限

ポータル訪問者が変更できる対象を 1 ページまたは数ページのセットだけに制限し、残りのページは管理者が管理することをお勧めします。

ユーザがページをカスタマイズすると、ユーザはそのページのユーザ独自のインスタンスを取得します。カスタマイズされていない他のすべてのページは、元のライブラリ インスタンスを指します。管理者がページに変更を加えた場合、そのページをカスタマイズした各ユーザに対してその変更を繰り返し処理する必要があります。多くのユーザがそのページを変更した場合は、データベース処理が必要であるため、変更を伝播するのに時間がかかります。

ページ フロー セッションの占有量の最適化

レプリケートされたクラスタ環境では、ポータルでページ フロー ポートレットを使用すると、パフォーマンスの問題が発生することがあります。これらのポートレットに追加するリクエスト属性が、ページ フロー ポートレットの状態のコンポーネントとしてセッションに永続化されることがあるためです。追加するリクエスト属性が増えると、セッションのサイズが大きくなり、パフォーマンスが厳しく制約される可能性があります。

ページ フロー ポートレットは、ポータル フレームワーク内で、スコープ サーブレット環境によってホストされます。この環境は、サーブレット コンテナとして効果的に機能しますが、その動作のために、ページ フロー状態を永続化するコンテナ クラス内で、リクエスト属性のスコープがセッションに設定されます。これが特に望ましくないのは、大容量のデータ (このようなページ フロー ポートレットのリクエスト属性を含む) がクラスタ上でレプリケートされる場合です。

WebLogic Portal には、ページ フロー ポートレットにリクエスト属性の永続性 (requestAttrPersistence) プロパティが用意されています。このプロパティは .portlet ファイルに含まれており、Workshop for WebLogic のプロパティ ビューで設定できます。

リクエスト属性の永続性プロパティには、次の値が含まれます。

ページ フロー ポートレットについてリクエスト属性の永続性の属性を設定するには、図 11-8 のように、プロパティ ビューで [ページ フロー コンテンツ] グループの下の [リクエスト属性の永続性] ドロップダウンを開き、必要な値を選択します。

図 11-8 リクエスト属性の永続性の属性の選択

リクエスト属性の永続性の属性の選択

単純なアプリケーションでのファイルベース ポータルの使用

ポータルには、ファイルベースとストリーミングの 2 種類があります。ファイルベースのポータル (「ライト ポータル」とも呼ばれる) は、名前のとおりユーザのファイル システムからすべてのリソースを取得します。これに対して、ストリーミング ポータルは、リソースを 1 つ以上のデータベースから導出します。

ファイルベース ポータルとストリーミング ポータルの主な相違点は、複数のポートレット インスタンスの作成および管理に使用するメソッドです。ストリーミング ポータル (WebLogic Portal Administration Console を使って管理) を使用すると、ポートレットの単一のインスタンスを管理して、それをさまざまな場所で再利用できます。また、大量のポートレット インスタンスを容易に作成して、各インスタンスに異なるコンフィギュレーションを行うこともできます。ファイルベース ポータルを使用する場合、.portal ファイル内に個別のソース ポートレットを作成する必要があります。

ストリーミング ポータルでは、Administration Console の管理機能を利用することもできます。たとえば、ポートレットを無効にする場合には、Administration Console から簡単に操作することができます。Administration Console を使用しない場合には、プロダクション サーバに直接アクセスして .portal ファイルを変更する必要があります。また、Administration Console を使うと、ブックやページ コンテンツの管理、およびリソースの各種インスタンスに対する訪問者の資格や委託管理の機能を利用することもできます。

ファイルベース ポータルを使用する理由

単純な静的ポータルでは、ファイル システムからリソースを導出するため、パフォーマンスが向上し、次の利点が得られます。

ファイルベース ポータルを使用する際の制約

ファイルベース ポータルは、ストリーミング ポータルと比較してパフォーマンスが向上しますが、機能は限られます。たとえば、データベースを使用しないため、ユーザ カスタマイズや資格などの機能は利用できません。この他にファイルベース ポータルにない機能を以下に示します。

さらに、ほとんどのケースにおいて、ファイルベース ポータルの使用によるパフォーマンスの向上は、これらの制限の埋め合わせになるとは言えません。

開発時のプロダクション ドメインの作成

この方法は実行時のパフォーマンス向上に直接はつながりませんが、アプリケーションをプロダクション環境に伝播する前にアプリケーションの実行の様子を確認することができます。開発時にプロダクション ドメインを作成することで、プロダクション環境でのポータルのパフォーマンスをシミュレートおよび評価できます。その後、必要な調整を行ってから、実際にポータルをデプロイすることができます。問題が発生する場合、またはパフォーマンスが最適ではない場合は、エンド ユーザに届く前にそのような状況を修正できます。

プロダクション ドメインを作成するには、起動スクリプトを更新します。WLS_PRODUCTION_MODE= フラグを true に設定し、次のフラグを false に設定します。

また、threadcount と JDBCConnectionPool のサイズにはデフォルト値を設定する必要があります。ポートレットをスレッド化 (forkable=true を使用) する場合、config.xml ファイルで portalRenderQueueportalPreRenderQueue をコンフィグレーションし、フォークされたポートレットが WebLogic スレッド プールではなく独自のスレッド プールを使用するようにします。次のコード例は、スレッド数を適切に設定する方法を示します。

<ExecuteQueue Name="default" ThreadCount="15"/>
<ExecuteQueue Name="portalRenderQueue" ThreadCount="5"/>

ポートレットのパフォーマンスの最適化

ポータルでポートレットのパフォーマンスを最適化するには、以下のような方法を使用します。

上記の方法の詳細については、『ポートレット開発ガイド』を参照してください。


  ページの先頭       前  次