カスタム・アドバイザーの作成

カスタム・アドバイザーは、クラス・ファイルとして提供される小さな Java™ コードであり、サーバーのロードを 判定するために Load Balancer 基本コードによって呼び出されます。基本コードは、カスタム・アドバイザーのインスタンスの開始と停止、状況および報告書の提供、ヒストリー情報のログ・ファイルへの記録、さらにアドバイザー結果のマネージャー・コンポーネントへの報告など、必要なすべての管理サービスを提供します。

Load Balancer 基本コードがカスタム・アドバイザーを 呼び出すと、以下のステップが実行されます。

  1. Load Balancer 基本コードは、サーバー・マシンとの接続をオープンします。
  2. ソケットがオープンすると、基本コードは指定されたアドバイザーの GetLoad 関数を呼び出します。
  3. アドバイザーの GetLoad 関数は、ユーザーがサーバーの状況を評価するために定義した ステップ (サーバーからの応答を待つなど) を実行します。 この関数は、応答が受け取られると実行を終了します。
  4. Load Balancer 基本コードは、サーバーとのソケットをクローズし、ロード情報を マネージャーに報告します。カスタム・アドバイザーが通常モードで作動するか置換モードで作動するかによって、基本コードは GetLoad 関数の終了後に追加の計算を行う場合があります。

通常モードと置換モード

通常 モードまたは置換 モード で Load Balancer と対話するよう、カスタム・アドバイザーを設計できます。

操作モードの選択は、カスタム・アドバイザー・ファイルで、コンストラクター・メソッドのパラメーターとして指定されます。(各アドバイザーは設計に基づいて、上記のモードのいずれかでのみ稼働します。)

通常モードでは、カスタム・アドバイザーがサーバーとデータを交換し、基本アドバイザー・コードが交換の時間を測定して、ロード値を計算します。その後、基本コードがこのロード値をマネージャーに報告します。成功を示す場合は値ゼロが、 またはエラーを示す場合は -1 がカスタム・アドバイザーから戻されます。

通常モードを指定するには、コンストラクター内の replace フラグを false に設定してください。

置換モードでは、基本コードはいかなる時間測定も行いません。カスタム・アドバイザーはその固有の要件に基づいて、指定された操作をすべて実行し、その後、実際のロード値を戻します。基本コードはそのロード値を受け入れ、それをそのままマネージャーに報告します。最良の結果を得るには、高速サーバーを表す 10 と低速サーバーを表す 1000 によって、ロード値を 10 から 1000 の間で正規化してください。

置換モードを指定するには、コンストラクター内の replace フラグを true に設定してください。

アドバイザー命名規則

カスタム・アドバイザー・ファイル名は ADV_name.java という形式に従わなければなりません。 ここで name はアドバイザーのために選択する名前です。 完全な名前は大文字の接頭部 ADV_ で始まり、後続の文字がすべての小文字でなければなりません。ここで小文字を使用することにより、アドバイザーを実行するためのコマンドでの大/小文字の区別が不要になります。

Java の規則に従って、ファイル内で定義されるクラスの名前はファイルの 名前と一致しなければなりません。

コンパイル

カスタム・アドバイザーは Java 言語で書く必要があり、Load Balancer コードと同じレベルの Java コンパイラーでコンパイルしなければなりません。ご使用の システム上の Java のバージョンを確認するには、 install_path/java/bin ディレクトリーから次のコマンドを実行します。

java -fullversion

現行ディレクトリーがお客様のパスの一部ではない場合、正しいバージョン情報が確実に得られるようにするために、現行ディレクトリーから Java を実行するように指定する必要があります。 その場合、以下のコマンド を install_path/java/bin ディレクトリーから実行してください。

./java -fullversion

コンパイル時には、以下のファイルが参照されます。

コンパイル時には、クラスパス環境変数がカスタム・アドバイザー・ファイルと基本クラス・ファイルの 両方を指していなければなりません。 コンパイル・コマンドの形式は次の とおりです。UNIX Windows システムの場合、コンパイル・コマンドは 次の例のようになります。

 install_path/java/bin/javac -classpath /opt/ibm/edge/lb/servers/lib/ibmlb.jar ADV_name.java

ただし、

コンパイルの出力は ADV_name.class などのクラス・ファイルです。アドバイザーを開始する前に、 クラス・ファイルを install_path/servers/lib/CustomAdvisors/ ディレクトリーに コピーしてください。

注:
カスタム・アドバイザーは、コンパイルした時のオペレーティング・システムとは別のオペレーティング・システムで実行することができます。例えば、 Windows システムでアドバイザーをコンパイルし、その結果として得られるクラス・ファイルをバイナリー形式で Linux マシンにコピーし、そこでそのカスタム・アドバイザーを実行することができます。AIX、 HP-UX、Linux、および Solaris オペレーティング・システムの場合、構文は似ています。

カスタム・アドバイザーの実行

カスタム・アドバイザーを実行するには、最初にアドバイザーのクラス・ファイル を Load Balancer マシンの lib/CustomAdvisors/ サブディレクトリーにコピーする必要があります。 例えば、myping というカスタム・アドバイザーの場合、ファイル・パスは、install_path/servers/lib/CustomAdvisors/ADV_myping.class になります。

Load Balancer を構成し、マネージャー機能を開始した後、カスタム・アドバイザー を開始するコマンドを発行します。カスタム・アドバイザーは、次のように、その名前から ADV_ 接頭部とファイル拡張子を除いたものによって指定されます。

dscontrol advisor start myping port_number

コマンドに指定するポート番号は、アドバイザーがターゲット・サーバーとの接続をオープンするポートです。

必須なルーチン

すべてのアドバイザーと同様に、カスタム・アドバイザーは、ADV_Base と呼ばれるアドバイザー基本クラスの機能性を拡張 します。アドバイザー・ベース は、マネージャーの重みづけアルゴリズムで使用できるようにマネージャーに ロードを報告するなど、アドバイザーの大部分の機能を実行します。アドバイザー・ベースはまた、ソケット接続およびクローズ操作を実行し、アドバイザーが使用する送信および受信メソッドを提供します。アドバイザーは、調査中のサーバー用に指定されたポートでデータを送信および受信するためだけに使用されます。アドバイザー・ベース内の TCP メソッドは、ロードを計算するために時間測定されます。アドバイザー・ベースのコンストラクター内のフラグが、既存のロードをアドバイザーから戻された新しいロードで上書きするかどうかを示します。

注:
コンストラクターで設定された値に基づき、アドバイザー・ベースは指定された間隔でロードを重みアルゴリズムに提供します。アドバイザーが処理を完了せず、有効なロードを戻せない場合には、 アドバイザー・ベースは前に報告されたロードを使用します。

アドバイザーには、以下の基本クラス・メソッドがあります。

これらの必須ルーチンに関する詳細は、このセクションで後述します。

検索順序

カスタム・アドバイザーは、ネイティブ・アドバイザーまたは標準アドバイザーを検索した後に呼び出されます。 Load Balancer は、指定されたアドバイザーを標準アドバイザーのリスト中で見つけられない場合、 カスタム・アドバイザーのリストを調べます。アドバイザーの使用に関する追加情報 が「WebSphere® Application Server Load Balancer 管理ガイド 」に記載されています。

命名およびファイル・パス

カスタム・アドバイザーの名前およびパスについては、以下の要件を忘れないでください。

カスタム・アドバイザー・メソッドおよび関数呼び出し

コンストラクター (アドバイザー基本によって提供される)

public <advisor_name> (
        String sName;
        String sVersion;
        int iDefaultPort;
        int iInterval;
        String sDefaultLogFileName;
        boolean replace
)
sName
カスタム・アドバイザーの名前。
sVersion
カスタム・アドバイザーのバージョン。
iDefaultPort
サーバーへの接続を行うポート番号 (ポート番号が呼び出しに指定されていない場合)。
iInterval
アドバイザーがサーバーを照会する間隔。
sDefaultLogFileName
このパラメーターは必須ですが、使用されません。許容値はヌル・ストリングである "" です。
replace
このアドバイザーが置換 モードで機能するかどうかを示します。可能な値は、以下のとおりです。

ADV_AdvisorInitialize()

void  ADV_AdvisorInitialize()

このメソッドは、カスタム・アドバイザーに必要な初期化を実行するために提供されます。このメソッドが呼び出されるのはアドバイザー基本モジュールを開始した後です。

標準アドバイザーを含む多くの場合においてこのメソッドは使用されず、 そのコードを構成するのは return ステートメントだけです。 このメソッドは suppressBaseOpeningSocket メソッドを呼び出すために使用できます。 suppressBaseOpeningSocket メソッドが有効であるのは上記のメソッド内から呼び出された場合のみです。

getLoad()

int getLoad(
        int iConnectTime;
        ADV_Thread *caller
)
iConnectTime
接続の完了に要した時間 (ミリ秒)。このロード測定はアドバイザー基本コードによって実行されてカスタム・アドバイザー・コードに渡されます。ロード値を戻すときには、測定を使用することもまたは無視することもできます。接続が失敗すると、この値が -1 に設定されます。
caller
アドバイザー基本メソッドを提供するアドバイザー基本クラスのインスタンス。

カスタム・アドバイザーで使用可能な関数呼び出し

以下のセクションで説明するメソッドまたは関数は、カスタム・アドバイザーから呼び出せます。これらのメソッドはアドバイザー基本コードによってサポートされています。

一部の関数呼び出し (例えば function_name () など) は直接に作成できますが、その他は接頭部 caller を必要とします。caller は基本アドバイザー・インスタンスを示し、これは実行されるカスタム・アドバイザーをサポートします。

ADVLOG()

ADVLOG 関数により、カスタム・アドバイザーはテキスト・メッセージをアドバイザー基本ログ・ファイルに書き込むことができます。形式は次のとおりです。

void  ADVLOG  (int logLevel, String message)
logLevel
メッセージがログ・ファイルに書き込まれる状況レベル。 アドバイザー・ログ・ファイルはステージで編成されます。最も緊急のメッセージには状況レベル 0 を指定し、緊急の度合いがそれより低いメッセージには大きい数値を指定します。メッセージの最も詳細なタイプには状況レベル 5 が指定されます。 これらのレベルは、リアルタイムでユーザーが受け取るメッセージのタイプを制御するために 使用されます (詳細の度合いを設定するには dscontrol コマンドが 使用されます)。 致命的なエラーは常にレベル 0 で記録する必要があります。
message
ログ・ファイルに書き込むメッセージ。このパラメーター の値は、標準 Java ストリングです。

getAdvisorName()

getAdvisorName 関数は、カスタム・アドバイザーの名前の接尾部部分が入った Java ストリングを戻します。例えば、ADV_cdload.java という名前のアドバイザーでは、この関数は値 cdload を戻します。

この関数にはパラメーターを使用しません。

この値はアドバイザーのインスタンス化中に変更できないことに注意してください。

getAdviseOnPort()

getAdviseOnPort 関数は、呼び出しカスタム・アドバイザーを実行するポート番号を戻します。戻り値は Java 整数 (int) であり、この関数にはパラメーター はありません。

この値はアドバイザーのインスタンス化中に変更できないことに注意してください。

caller.getCurrentServerId()

getCurrentServerId 関数は、現行サーバーを一意的に表す Java ストリングを戻します。

アドバイザー基本コードがすべてのサーバー・マシンを連続して照会するため、通常はカスタム・アドバイザーを呼び出すたびにこの値が変更されます。

この関数にはパラメーターを使用しません。

caller.getCurrentClusterId()

getCurrentClusterId 関数呼び出しは、現行クラスターを一意的に表す Java ストリングを戻します。

アドバイザー基本コードがすべてのクラスターを連続して照会するため、通常はカスタム・アドバイザーを呼び出すたびにこの値が変更されます。

この関数にはパラメーターを使用しません。

caller.getSocket()

getSocket 関数呼び出しは、通信のために現行サーバーに対してオープンされているソケットを表す Java ソケットを戻します。

この関数にはパラメーターを使用しません。

getInterval()

getInterval 関数は、アドバイザー・サイクル間の秒数であるアドバイザー間隔を戻します。この値は、 dscontrol コマンドを使用して実行時に変更しない限り、 カスタム・アドバイザーのコンストラクターに設定されたデフォルト値と同じです。

戻り値は Java 整数 (int) です。この関数にはパラメーターを使用しません。

caller.getLatestLoad()

getLatestLoad 関数により、カスタム・アドバイザーは指定サーバー・オブジェクトの最新ロード値を獲得できます。 ロード値は、アドバイザー基本コードおよびマネージャー・デーモンによって内部テーブルで保守されています。

int caller.getLatestLoad (String clusterId, int port, String serverId)

3 つの引数は 1 つのサーバー・オブジェクトをともに定義します。

clusterId
現行ロード値を入手する対象となるサーバー・オブジェクトのクラスター ID。この引数は、Java ストリングでなければなりません。
port
現行ロード値を入手するサーバー・オブジェクトのポート番号。
serverId
現行ロード値を入手する対象となるサーバー・オブジェクトのサーバー ID。この引数は、Java ストリングでなければなりません。

戻り値は整数です。

この関数呼び出しは、あるプロトコルまたはポートの動作を別のものの動作に依存させる場合に役立ちます。例えば、同一マシン上の Telnet サーバーが使用不可である場合に、特定アプリケーション・サーバーを使用不可にするカスタム・アドバイザーでこの関数呼び出しを使用する場合などです。

caller.receive()

receive 関数は、ソケット接続から情報を入手します。

caller.receive(StringBuffer *response)

パラメーター response は、検索されたデータが置かれるストリング・バッファーです。さらに、この関数は以下の重要度のある整数値を戻します。

caller.send()

send 関数は、指定ポートを使用してデータのパケットをサーバーに送信するために確立したソケット接続を使用します。

caller.send(String command)

パラメーター command は、サーバーに送信するデータが入っているストリングです。この関数は、以下の重要度のある整数値を戻します。

suppressBaseOpeningSocket()

suppressBaseOpeningSocket 関数呼び出しにより、カスタム・アドバイザーの代わりに 基本アドバイザー・コードがサーバーへの TCP ソケットをオープンするかどうかを カスタム・アドバイザーが指定できます。 アドバイザーが状況を判別するためにサーバーとの直接通信を使用しない場合は、このソケットをオープンする必要はありません。

この関数呼び出しを出せるのは一度だけであり、ADV_AdvisorInitialize ルーチンから出さなければなりません。

この関数にはパラメーターを使用しません。