クライアントに指定するエンドポイント(ホスト名とポートの組み合わせ)には、Enterprise JavaBeansが運用されているサーバーインスタンスを指定します。JNDIサービスにアクセスしたタイミング(JNDIのAPIを実行したタイミング)でクライアントに指定したエンドポイントのリストから最初に指定したエンドポイントにアクセスします。
リストの最初のエンドポイントの要求が接続エラーとなった場合、リストの2番目のエンドポイントにアクセスし、同様にその他エンドポイントにフェイルオーバーされます。接続先のサーバーが起動されていない場合、フェイルオーバーに時間がかかります。
条件 | タイミング | |
---|---|---|
Home/Remoteインタフェースを利用する場合 | Enterprise JavaBeansをlookupした時 | |
EJB3.0以降のリモートビジネスインタフェースを利用する場合 | JNDIを利用する場合 | Enterprise JavaBeansをlookupした時 |
アノテーションを利用する場合 | @EJBアノテーションにEnterprise JavaBeansオブジェクトが注入された時 |
上記のタイミングでJNDIサービスから取得したオブジェクトリファレンスに対して処理を実行すると、アクセスしたJNDIサービスと同一のサーバーインスタンスに対して処理が要求されます。
クライアントに指定するエンドポイント(ホスト名とポートの組み合わせ)には、EJBディスパッチャが運用されているサーバーインスタンスを指定します。JNDIサービスにアクセスしたタイミング(JNDIのAPIを実行したタイミング)でクライアントに指定したエンドポイントのリストから最初に指定したエンドポイントにアクセスします。
リストの最初のエンドポイントの要求が接続エラーとなった場合、リストの2番目のエンドポイントにアクセスし、同様にその他エンドポイントにフェイルオーバーされます。
接続先のサーバーが起動されていない場合、フェイルオーバーに時間がかかります。
EJBディスパッチャは以下の振り分けタイミングで振り分け対象に処理を振り分けます。Enterprise JavaBeans以外のサービス(JNDIサービスやGMS)に対するIIOP通信については振り分け対象となりません。
条件 | 振り分けタイミング | |
---|---|---|
Home/Remoteインタフェースを利用する場合 | クライアント側のJVMオプションに以下を追加した場合 | Homeインタフェースのcreateメソッドを実行した時 |
上記設定なし、またはtrueを設定した場合 | Homeインタフェースの初回のcreateメソッドを実行した時 | |
EJB3.0以降のリモートビジネスインタフェースを利用する場合 | JNDIを利用する場合 | Enterprise JavaBeansをlookupした時 (注1) |
アノテーションを利用する場合 | - |
注1) オブジェクトリファレンスをキャッシュするとlookupメソッドが再実行されません。振り分けが必要な場合は、クライアント側のJVMオプションに以下を設定してください。
-Dcom.sun.corba.ee.transport.IORReplace=false
注意
ロードバランス機能利用時にアノテーションの利用を推奨しない理由
EJB3.0以降のリモートビジネスインタフェースでアノテーションを利用する場合、@EJBアノテーションにEnterprise JavaBeansオブジェクトが注入された時に振り分け先が決定します。しかし、@EJBアノテーションにEnterprise JavaBeansオブジェクトを再注入する方法がないため、一度オブジェクトが注入されたアプリケーションで振り分け先を変更する方法がありません。このため、ロードバランス機能を使用する場合にはアノテーションは利用しないでください。
上記の振り分けタイミングで取得したオブジェクトリファレンスに対して処理を要求すると、振り分けタイミングで呼び出されたサーバーインスタンスに対して処理が要求されます。
処理を要求するサーバーインスタンスを変更したい場合には、上記の振り分けタイミングの処理から再実行してください。
以下にHome/Remoteインタフェースを利用した場合の動作について説明します。なお、EJB3.0規約のビジネスインタフェースを利用した場合には、「(2)lookupの実行」で内部的に「(3)Homeインタフェースのcreateメソッドの実行」まで行われるため、そのように読み替えてください。
また、図中の用語は、以下を表しています。
図中の用語 | 意味 |
---|---|
EJB Home | EJBアプリケーションのHomeインタフェースのオブジェクト |
EJB Remote | EJBアプリケーションのRemoteインタフェースのオブジェクト |
Home OR | EJBアプリケーションのHomeインタフェースのオブジェクトリファレンス |
Remote OR | EJBアプリケーションのRemoteインタフェースのオブジェクトリファレンス |
オブジェクトはIIOP通信要求をサーバーで処理する実体であり、オブジェクトリファレンスは分散して配置されたオブジェクトを特定するための情報です。
JNDIのlookupメソッドやHomeインタフェースのcreateメソッドで返却されるオブジェクトリファレンスには、オブジェクトリファレンスを生成/返却したサーバーインスタンスのホスト名とIIOPリスナーポート番号の情報が設定されます。このオブジェクトリファレンスに対する要求は、設定されているホスト名とIIOPリスナーポート番号に対して送信されます。
上記の各種処理において、どのようにIIOP通信されるかを以下に説明します。
EJBディスパッチ機能を利用した場合にはサーバーへの要求は行われません。
lookupメソッド処理では、サーバー上のJNDIサービスにIIOP通信し、JNDIサービスからHomeインタフェースのオブジェクトリファレンスを取得します。このIIOP通信処理では、クライアントに指定したエンドポイント(ホスト名とIIOPリスナーポート番号)に要求が送信されます。
要求を受けたEJBディスパッチャは、その要求がEnterprise JavaBeansに対する要求ではなく、JNDIサービスに対する要求であるため、ディスパッチ処理は行わず、EJBディスパッチャが動作するサーバーインスタンス上のJNDIサービスが、Homeインタフェースのオブジェクトリファレンスを返却します。
注意
EJBディスパッチャを運用するサーバーインスタンスに、振り分け対象とするEnterprise JavaBeansを展開することでHomeインタフェースのオブジェクトリファレンスが登録されます。
Enterprise JavaBeans(アプリケーション)の展開方法については、「4.6.9 アプリケーションの展開」を参照してください。
上記の(2)で返却されたオブジェクトリファレンスには、EJBディスパッチャが動作するサーバーインスタンスの情報が設定されているため、Homeインタフェースのcreateメソッドの要求は、EJBディスパッチャが動作するサーバーインスタンスに送信されます。要求を受けたEJBディスパッチャは、Enterprise JavaBeansに対する要求であるため、振り分け対象のサーバーインスタンスのオブジェクトリファレンスに対して再送要求を返信します。再送要求を受け付けた呼び出し元は、自動的に振り分け対象のサーバーインスタンスに要求が再送されて、振り分けられたサーバーインスタンス上でRemoteインタフェースのオブジェクトリファレンスを生成して返却します。このため、オブジェクトリファレンスには、振り分け先のサーバーインスタンスのホスト名とIIOPリスナーポート番号が設定されます。
注意
JVMオプションに-Dcom.sun.corba.ee.transport.IORReplace=falseを追加していない場合、lookupメソッドで取得したHomeインタフェースのオブジェクトリファレンスの情報は、初回のcreateメソッドで返却された振り分け対象のオブジェクトリファレンスの情報で上書きされます。その後、lookupメソッドを再実行せずにcreateメソッドだけを再実行する場合、同一のサーバーインスタンスに振り分けられます。振り分け先を変更する場合には、lookupメソッドから再実行する必要があります。
上記の(3)で返却されたRemoteインタフェースのオブジェクトリファレンスには、振り分け先のサーバーインスタンスの情報が設定されているため、ビジネスメソッドの要求は直接Enterprise JavaBeansが動作するサーバーインスタンスに送信されます。
上記と同様にRemoteインタフェースのremoveメソッドの要求は直接Enterprise JavaBeansが動作するサーバーインスタンスに送信されます。
上記の各処理では、以下のロードバランスまたはフェイルオーバーが動作します。
処理 | ロードバランスまたはフェイルオーバーの動作 |
---|---|
Home/Remoteインタフェースを利用する場合 | Homeインタフェースのcreateメソッドを実行した時 |
(1)InitialContextの生成 | なし(サーバーへの要求は行われません) |
(2)lookupメソッドの実行 | クライアントに指定したエンドポイントのリストにおいて最初に指定したエンドポイントから順番にアクセスするフェイルオーバー |
(3)Homeインタフェースのcreateメソッドの実行 | ■クライアントからEJBディスパッチャ間
■クライアントから振り分け対象のサーバーインスタンス間
|
(4)ビジネスメソッドの実行 | Remoteインタフェースに対するオブジェクトリファレンスのフェイルオーバー(注1)(注3) |
注1)オブジェクトリファレンスのフェイルオーバー設定については「オブジェクトリファレンスのフェイルオーバー設定」を参照してください。
注2)EJBディスパッチャを運用するサーバーインスタンスの「オブジェクトリファレンスのフェイルオーバー設定」で有効となります。
注3)EJBディスパッチャのディスパッチ対象となるサーバーインスタンスの「オブジェクトリファレンスのフェイルオーバー設定」で有効となります。
ディスパッチするサーバーインスタンスの決定方法
EJBディスパッチャは振り分け対象とするサーバーインスタンスのリストを作成します。EJBアプリケーションに対する要求を受け付けると、このリストの先頭から順番にラウンドロビンで振り分けるサーバーインスタンスで決定します。
クライアントに指定するエンドポイント(ホスト名とポートの組み合わせ)には、Enterprise JavaBeansが運用されているサーバーインスタンスを指定します。RMI-IIOPクライアントがInitialContextオブジェクトを作成すると、そのクライアントで指定したエンドポイントのリストから最初に指定したエンドポイントのグループ管理サービス(GMS)にアクセスし、アクセスしたサーバーインスタンスのIJServerクラスタ内で有効なサーバーインスタンスのリストを取得します。この取得する情報には、IIOP通信するのに必要な以下の情報が含まれています。
取得情報 | 値 |
---|---|
ホスト名 | IIOPサービスの定義項目のIIOPリスナーの定義「ネットワークアドレス」に設定された値が返却されます。 |
ポート番号 | IIOPサービスの定義項目のIIOPリスナーの定義「リスナーポート」に設定された値が返却されます。 |
取得したサーバーインスタンスのリストからランダムなサーバーインスタンスのリストを作成します。サーバーインスタンスのリストの取得はプロセスで一度行われます。
作成したInitialContextオブジェクトに対して、API(lookupメソッドなど)を実行すると、ランダムなサーバーインスタンスのリストから、最初のサーバーインスタンスに処理を要求します。InitialContextオブジェクトを作成するたびにサーバーインスタンスのリストをローテーションしてランダムなサーバーインスタンスのリストが再作成されます。
lookupメソッドで取得したオブジェクトに対する処理は、lookupメソッドでアクセスしたサーバーインスタンスに対して要求します。ロードバランスしたい場合には、InitialContextの作成から再実行してください。
リストの最初の接続先(エンドポイントまたはサーバーインスタンス)の要求で通信エラーが発生して利用できない場合、リストの2番目の接続先が使用されて、同様にその他接続先にフェイルオーバーされます。接続先のホスト名(またはIPアドレス)のサーバが起動されていない場合、フェイルオーバーに時間がかかります。
ハートビートによる監視
GMSはハートビート信号により定期的にサーバーインスタンスが正常に稼動しているかを確認します。このため、GMSが返却するサーバーインスタンスの一覧情報は、ハートビートの設定により以下のように異なります。
ハートビート | サーバーインスタンスの一覧情報 |
---|---|
無効 | サーバーインスタンスの状態に関わらず、クラスタに属するサーバーインスタンスの一覧情報です。 |
有効 | 正常にハートビート信号が送信されており、正常に稼動しているとグループ管理サービスが認識しているサーバーインスタンスの一覧情報です。 |
ランダムなサーバーインスタンスのリスト作成方法
IJServerクラスタの各サーバーインスタンスはバランスするために重み付けされており、100に設定されます。各サーバーインスタンスの重み付けをすべて累積した値を算出します。サーバーインスタンス数が4の場合には400となります。
1~400の数字を以下のように各サーバーインスタンスに割り当て、その数字の中から乱数で値を選択してサーバーインスタンスを選択します。以下はサーバーインスタンスがMyInstance-1、MyInstance-2、MyInstance-3、MyInstance-4の場合の例です。
乱数の選択についてはjava.util.RandomクラスのnextInt(int n)メソッドを使用します。詳細は、java.util.RandomクラスのJavadocを参照してください。
選択された値 | サーバーインスタンス |
---|---|
1~100 | MyInstance-1 |
101~200 | MyInstance-2 |
201~300 | MyInstance-3 |
301~400 | MyInstance-4 |
選択されたサーバーインスタンス以降のリストを新しいリストの先頭に追加し、選択されたサーバーインスタンスまでのリストをその後に追加してランダムなリストを作成します。
上記の例の場合、乱数で188が選択されると、188に対応するMyInstance-2以降が先頭に追加された、以下のような新しいリストが作成されます。
新しいリスト |
---|
MyInstance-2 |
MyInstance-3 |
MyInstance-4 |
MyInstance-1 |
以下に概要図を記載します。
(1)でクライアントに指定されたエンドポイントにアクセスして、グループ管理サービスからサーバーインスタンスのリストを取得します。
エンドポイントを複数指定した場合、指定されたエンドポイントの先頭からアクセスし、アクセスに失敗した場合には(2)で次に指定されたエンドポイントにアクセスしてグループ管理サービスからサーバーインスタンスのリストを取得します。取得したサーバーインスタンスのリストから、クライアントでランダムなリストを生成します。
(3)で生成されたランダムなリストの先頭から実際の処理を要求します。
サーバーインスタンスが複数存在し、(3)のアクセスに失敗した場合には、(4)で次のサーバーインスタンスに処理を要求します。