目次 前 次 PDF


CORBAサーバー・アプリケーションのスケーリング

CORBAサーバー・アプリケーションのスケーリング
このトピックには次の項が含まれます:
このトピックではProductionサンプル・アプリケーションを例として使用し、CORBA C++アプリケーションをスケーリングして処理能力を高める方法を示します。事前に、必ず次の個所をお読みください。
Oracle Tuxedo CORBAアプリケーションのチューニングとスケーリングに関する包括的な説明については、第1章「Oracle Tuxedo CORBAアプリケーションのスケーリング」
Oracle Tuxedoオンライン・ドキュメントの「Productionサンプル・アプリケーション」
Productionサンプル・アプリケーションのスケーリングについて
Productionサンプル・アプリケーションには、Wrapperサンプル・アプリケーションと同じエンド・ユーザー向けの機能が用意されています。Productionサンプル・アプリケーションでは、Oracle Tuxedoソフトウェアの機能を使用して既存のOracle Tuxedoアプリケーションをスケーリングする方法が示されます。
この項には次のトピックが含まれます:
設計上の目標
Productionサンプル・アプリケーションの設計上の主な目標は、次の処理により、対応できるクライアント・アプリケーションの数を大幅に増やすことです。
並列的に、および1つのマシン上で、同じインタフェースを実装する複数のオブジェクトに対するクライアント・リクエストを処理します。
1つのマシンへある特定の学生ために、および別のマシンへ別の学生のために、リクエストを転送します。
マシンをさらに追加して、処理負荷を分担します。
アプリケーションのスケーリング方法
これらの設計上の目標に対応するため、Productionサンプル・アプリケーションは次のようにしてスケーリングされています。
ステートレス・オブジェクト・モデルを実装して、サーバー・プロセスが同時に管理できるクライアント・リクエストの数を増やします。
University、BillingおよびOracle Tuxedo Tellerアプリケーションのサーバー・プロセスを、それらの構成が行われているグループ内でレプリケートします。該当するグループは、UBBCONFIGファイルで定義されているORA_GRPサーバー・グループおよびAPP_GRPサーバー・グループです。
ORA_GRPサーバー・グループおよびAPP_GRPサーバー・グループを追加のサーバー・マシンであるProductionマシン2上でレプリケートし、データベースの分割も行います。
次のオブジェクトにユニークなオブジェクトID (OID)を割り当て、それらがそれぞれのグループにおいて同時に複数回インスタンス化されるようにします。
RegistrarFactory
Registrar
TellerFactory
Teller
これにより、これらのオブジェクトはプロセスではなくクライアント・アプリケーションごとに利用可能となるので、並列処理機能に対応できるようになります。
ファクトリ・ベース・ルーティングを実装して、1つのマシンへは一部の学生のために、別のマシンへはほかの学生のために、クライアント・リクエストを転送します。
注意:
Productionサンプル・アプリケーションの使用を簡単にするには、1つのデータベースを使い、1つのマシン上で実行されるように、アプリケーションをOracle Tuxedoソフトウェア・キット上で構成します。ただし、この章で示した例では、アプリケーションは2つのデータベースを使って2つのマシン上で動作しています。
Productionサンプル・アプリケーションは、数台のマシン上で動作し、複数のデータベースを使用すべく構成できるよう設計されています。構成を複数のマシンとデータベース用に変更するには、UBBCONFIGファイルを修正して、データベースをパーティション化する必要があります。この手順は、2-21ページの「アプリケーションをさらにスケーリングする方法」で説明しています。
次の項では、Productionサンプル・アプリケーションがレプリケートされたサーバー・プロセスとサーバー・グループ、オブジェクト状態管理、およびファクトリ・ベース・ルーティングをどのように使用して、スケーラビリティの目標を達成するかを説明します。
OMG IDLの変更
Productionサンプル・アプリケーションでのOMG IDLの変更は、RegistrarFactoryオブジェクトのfind_registrar()オペレーション、およびTellerFactoryオブジェクトのfind_teller()オペレーションに限定されています。2つのオペレーションは、それぞれ学生IDと口座番号を要求するように修正する必要があります。これらは、ファクトリ・ベース・ルーティングの実装に必要なものです。Productionサンプル・アプリケーションでのファクトリ・ベース・ルーティングの実装と使用については、2-10ページの「ファクトリ・ベース・ルーティングによるスケーリング」を参照してください。
ステートレス・オブジェクト・モデルの使用方法
ここでは、Productionサンプル・アプリケーションにおいて、スケーラビリティを増大させるために、オブジェクト状態管理をどのようにRegistrarオブジェクトおよびTellerオブジェクトで使用するかを説明します。オブジェクト状態管理の概要は、1-3ページの「オブジェクト状態管理の使用」を参照してください。
スケーラビリティを増大させるには、Productionサーバー・アプリケーションで、RegistrarおよびTellerオブジェクトにmethodアクティブ化ポリシーを構成します。これら2つのオブジェクトにmethodアクティブ化ポリシーを割り当てた結果、動作に次の変化がみられます。
これらのオブジェクトが呼び出されるときは常に、適切なサーバー・グループ内のOracle Tuxedoドメインによってインスタンス化されます。
呼出しが完了すると、Oracle Tuxedoドメインによりこれらのオブジェクトは非アクティブ化されます。
BasicからWrapperまでの各種サンプル・アプリケーションでは、Registrarオブジェクトはプロセス・バウンド・オブジェクト(processアクティブ化ポリシー)となっていました。Registrarオブジェクトに対するクライアント・リクエストはすべて、常にサーバー・マシンのメモリー内の同じオブジェクト・インスタンスに送られました。Basicサンプル・アプリケーションの設計は、小規模なデプロイメントに適しています。しかし、クライアント・アプリケーションのリクエストが増すにつれて、Registrarオブジェクト上のクライアント・リクエストはキューに入れられるようになるため、レスポンス時間が遅くなります。
ただし、RegistrarおよびTellerオブジェクトがステートレス・オブジェクト(methodアクティブ化ポリシー)であり、これらのオブジェクトを管理するサーバー・プロセスがレプリケートされている場合、RegistrarおよびTellerの各オブジェクトは並行して複数のクライアント・リクエストを処理できます。これらのオブジェクトで処理できる同時のクライアント・リクエストの数で制約があるのは、RegistrarおよびTellerのオブジェクトをインスタンス化できる、利用可能なサーバー・プロセスの数のみです。したがって、これらのステートレス・オブジェクトはマシン・リソースのより効率的な使用と、クライアント・レスポンス時間の短縮を実現します。
最も重要なのは、Oracle Tuxedo CORBAで、RegistrarおよびTellerオブジェクトのコピーを各レプリケートサーバー・プロセス内でインスタンス化できるように、オブジェクトの各コピーがユニークでなければならないことです。これらのオブジェクトの各インスタンスをユニークにするために、オブジェクトのファクトリではユニークなオブジェクトIDをオブジェクトに割り当てる必要があります。
Oracle Tuxedoアプリケーションがレプリケートサーバー・アプリケーション・プロセスのそれぞれでRegistrarおよびTellerオブジェクトのコピーをインスタンス化するには、オブジェクトの各コピーが一意のオブジェクトID (OID)を備えていなければなりません。ユニークなOIDは、これらのオブジェクトを作成するファクトリで割り当てられます。ユニークなオブジェクトIDの生成の詳細は、『CORBAサーバー・アプリケーションの作成』を参照してください。その他の設計上の考慮事項については、2-16ページの「設計上の追加考慮事項」を参照してください。
サーバー・プロセスおよびサーバー・グループのレプリケートによるスケーリング
このトピックには次の項が含まれます:
このトピックでは、サーバー・プロセスおよびサーバー・グループをレプリケートすることによる、Productionサンプル・アプリケーションのスケーリング方法を説明します。概要については、1-7ページの「サーバー・プロセスおよびサーバー・グループのレプリケート」を参照してください。
Productionアプリケーションでのサーバー・プロセスのレプリケート
この項では、Productionサンプル・アプリケーションによるサーバー・アプリケーションのレプリケート方法を説明します。この機能の概要については、1-8ページの「サーバー・プロセスのレプリケート」を参照してください。
図2-1では、単一のマシン上で実行される、レプリケートされたORA_GRPおよびAPP_GRPグループを示します。
Universityサーバー・アプリケーション、Oracle Tuxedo Tellerアプリケーション、およびOracle7 TMSサーバー・プロセスは、ORA_GRPグループ内でレプリケートされます。
Billingサーバー・プロセスは、APP_GRPグループ内でレプリケートされます。
図2-1 Productionサンプルのレプリケートされたサーバー・グループ
 
これらのグループの1つにリクエストが到達したとき、Oracle Tuxedoドメインにはこのリクエストを処理できるサーバー・プロセスがいくつかあります。Oracle Tuxedoドメインは、最も負荷の軽いサーバー・プロセスを選択することができます。
図2-1では、次の点に留意してください。
常に、特定のサーバー・プロセス内で、RegistrarFactoryRegistrarTellerFactory、またはTellerオブジェクトのインスタンスが複数存在することはできません。
CourseSynopsisEnumeratorオブジェクトは、どのUniversityサーバー・プロセスでも、任意の数だけ存在することができます。
Productionアプリケーションでのサーバー・グループのレプリケート
この項では、Productionサンプル・アプリケーションによるサーバー・グループのレプリケート方法を説明します。この機能の概要については、1-9ページの「サーバー・グループのレプリケート」を参照してください。
図2-2は、別のマシンにレプリケートされたProductionサンプル・アプリケーションのグループを示しており、このアプリケーションのUBBCONFIGファイルに指定されているとおり、ORA_GRP2APP_GRP2があります。
図2-2 複数のマシンにわたるサーバー・グループのレプリケート
図2-2では、Productionマシン1と2のグループの内容で異なるのはデータベースのみです。
Productionマシン1のデータベースには、100001から100005までの間のIDを持つ学生の、学生情報および口座情報が格納されています。
Productionマシン2のデータベースには、100006から100010までの間のIDを持つ学生の、学生情報および口座情報が格納されています。
注意:
双方のデータベースのコース情報表は同じものです。
所定のデータベース内の学生情報は、同じデータベース内の口座情報とはまったく関係がない場合があります。
Productionサンプル・アプリケーションがファクトリ・ベース・ルーティングを使用して、複数のマシン間にアプリケーションの処理負荷を分散する方法の詳細は、2-10ページの「ファクトリ・ベース・ルーティングによるスケーリング」を参照してください。
Productionアプリケーションのレプリケートサーバー・プロセスおよびグループの構成
リスト2-1は、Productionサンプル・アプリケーションのUBBCONFIGファイルのGROUPSセクションおよびSERVERSセクションからの抜粋です。
リスト2-1 UBBCONFIGファイルのGROUPSおよびSERVERSセクション
*GROUPS
    APP_GRP1
        LMID = SITE1
        GRPNO = 2
        TMSNAME = TMS
    APP_GRP2
        LMID = SITE1
        GRPNO = 3
        TMSNAME = TMS
    ORA_GRP1
        LMID = SITE1
        GRPNO = 4
        OPENINFO = "ORACLE_XA:Oracle_XA+Acc=P/scott/..."
        CLOSEINFO = ""
        TMSNAME = "TMS_ORA"
    ORA_GRP2
        LMID = SITE1
        GRPNO = 5
        OPENINFO = "ORACLE_XA:Oracle_XA+Acc=P/scott/..."
        CLOSEINFO = ""
        TMSNAME = "TMS_ORA"
                
*SERVERS
    # By default, activate 2 instances of each server
    # and allow the administrator to activate up to 5
    # instances of each server
    DEFAULT:
        MIN = 2
        MAX = 5
    tellp_server
        SRVGRP = ORA_GRP1
        SRVID = 10
        RESTART = N
    tellp_server
        SRVGRP = ORA_GRP2
        SRVID = 10
        RESTART = N
    billp_server
        SRVGRP = APP_GRP1
        SRVID = 10
        RESTART = N
    billp_server
        SRVGRP = APP_GRP2
        SRVID = 10
        RESTART = N
    univp_server
        SRVGRP = ORA_GRP1
        SRVID = 20
        RESTART = N
    univp_server
        SRVGRP = ORA_GRP2
        SRVID = 20
        RESTART = N
 
ファクトリ・ベース・ルーティングによるスケーリング
このトピックには次の項が含まれます:
このトピックでは、ファクトリ・ベース・ルーティングを使用してProductionサンプル・アプリケーションをスケーリングする方法について説明します。ファクトリ・ベース・ルーティングの概要については、1-11ページの「ファクトリ・ベース・ルーティングの使用(CORBAサーバーのみ)」を参照してください。
Productionアプリケーションでのファクトリ・ベース・ルーティングについて
この項では、Productionサンプル・アプリケーションがどのようにファクトリ・ベース・ルーティングを使用するかを説明します。この機能の概要については、1-11ページの「ファクトリ・ベース・ルーティングの使用(CORBAサーバーのみ)」を参照してください。
ファクトリ・ベース・ルーティングを使用すると、Oracle Tuxedo CORBAのロード・バランシング機能およびスケーラビリティ機能を拡張できます。Productionサンプル・アプリケーションでは、ファクトリ・ベース・ルーティングを使用して、1つのマシンに1つの学生のサブセットを登録するリクエストを、別のマシンに別の学生のサブセットを登録するリクエストを送信できます。アプリケーションの処理機能を向上させると、アプリケーション内でのファクトリ・ベース・ルーティングを簡単に変更して、マシンをさらに追加できます。
Productionサンプル・アプリケーションでのファクトリ・ベース・ルーティングの実装に関する設計上の主な考慮事項は、ルーティングの基準となる値の選択です。Productionサンプル・アプリケーションは、次のようにファクトリ・ベース・ルーティングを使用します。
クライアント・アプリケーションからRegistrarオブジェクトへのリクエストは、学生IDに基づいてルーティングされます。IDが100001 - 100005の学生からのリクエストは、Productionマシン1にルーティングされます。IDが100006 - 100010の学生からのリクエストは、Productionマシン2にルーティングされます。
RegistrarオブジェクトからTellerオブジェクトへのリクエストは、口座番号に基づいてルーティングされます。200010から200014までの口座番号への支払いリクエストは、Productionマシン1にルーティングされます。200015から200019までの口座番号への支払いリクエストは、Productionマシン2にルーティングされます。
UBBCONFIGファイルでのファクトリ・ベース・ルーティングの構成
University Productionサンプル・アプリケーションでは、ファクトリ・ベース・ルーティングの実装方法が例示されます。ubb_b.nt構成ファイルからのINTERFACESROUTING、およびGROUPSセクションでは、Oracle Tuxedo CORBAアプリケーションでファクトリ・ベース・ルーティングを実装する方法が示されます。このサンプルのubb_p.ntまたはubb_p.mk UBBCONFIGファイルは、Oracle Tuxedoソフトウェアをインストールしたディレクトリで見つけることができます(\samples\corba\university\productionサブディレクトリを参照)。
UBBCONFIGファイルでは、グループおよびマシンの識別方法に加えて、INTERFACESおよびROUTINGセクションにおいて、次のデータを指定する必要があります。
1.
INTERFACESセクションには、ファクトリ・ベース・ルーティングを有効にするインタフェースの名前がリストされています。各インタフェースについて、このセクションではインタフェースがルーティングを行う基準の種類を指定します。このセクションでは、リスト2-2に示すように、FACTORYROUTINGという識別子を使用してルーティング基準を指定します。
リスト2-2 UBBCONFIGファイルのINTERFACESセクション
INTERFACES
    "IDL:beasys.com/UniversityP/Registrar:1.0"
FACTORYROUTING = STU_ID
    "IDL:beasys.com/BillingP/Teller:1.0"
        FACTORYROUTING = ACT_NUM
 
リスト2-2は、ファクトリ・ベース・ルーティングが使用されているProductionサンプルの2つのインタフェースの完全修飾インタフェース名を示します。また、FACTORYROUTING識別子によって、ルーティング値の名前がそれぞれSTU_IDACT_NUMに指定されています。
2.
ROUTINGセクションは、各ルーティング値について、表2-1に記載のパラメータを指定します。
 
表2-1 ROUTINGセクションで指定されるパラメータ
パラメータ
説明
TYPE
ルーティングのタイプを指定します。Productionサンプルでは、ルーティングのタイプはファクトリ・ベース・ルーティングです。したがって、このパラメータはFACTORYと定義されます。
FIELD
ファクトリがルーティング値に挿入する変数名を指定します。Productionサンプルでは、このフィールド・パラメータがそれぞれstudent_idaccount_numberに設定されています。
FIELDTYPE
ルーティング値のデータ型を指定します。Productionサンプルでは、student_idおよびaccount_numberのフィールド型はlongです。
RANGES
各グループにルーティングされる値を指定します。
リスト2-3に、Productionサンプル・アプリケーションで使用されるUBBCONFIGファイルのROUTINGセクションを示します。
リスト2-3 UBBCONFIGファイルのROUTINGセクション
ROUTING
    STU_ID
        FIELD = "student_id"
        TYPE = FACTORY
        FIELDTYPE = LONG
        RANGES = "100001-100005:ORA_GRP1,100006-100010:ORA_GRP2"
    ACT_NUM
        FIELD = "account_number"
        TYPE = FACTORY
        FIELDTYPE = LONG
        RANGES = "200010-200014:APP_GRP1,200015-200019:APP_GRP2"
 
リスト2-3は、ある1つの範囲のIDを持つ学生に対するRegistrarオブジェクト参照が、ある1つのサーバー・グループにルーティングされ、別の範囲のIDを持つ学生に対するRegistrarオブジェクト参照が、別のグループにルーティングされることを示します。同様に、ある1つの範囲の口座に対するTellerオブジェクト参照は、ある1つのサーバー・グループにルーティングされ、別の範囲の口座に対するTellerオブジェクト参照は、別のグループにルーティングされます。
3.
UBBCONFIGファイルのROUTINGセクションでRANGES識別子によって指定されたグループを、識別して構成する必要があります。たとえば、ProductionサンプルはAPP_GRP1APP_GRP2ORA_GRP1、およびORA_GRP2という4つのグループを指定します。これらのグループを構成し、グループが実行されるマシンを識別する必要があります。
リスト2-4は、ProductionサンプルのUBBCONFIGファイルにおける、GROUPSセクションを示し、ここでORA_GRP1およびORA_GRP2の各グループが構成されます。GROUPSセクション内の名前と、ROUTINGセクションのRANGESパラメータで指定されたグループ名がどのように一致しているかに注目してください。これは、ファクトリ・ベース・ルーティングが正しく機能するために重要です。また、アプリケーションでグループを構成する際にグループ名を変更した場合は、ROUTINGセクションにも反映する必要があります。(Oracle TuxedoソフトウェアとともにパッケージされているProductionサンプルは1台のマシンでのみ実行できるように構成されている点に注意してください。ただし、このアプリケーションを複数のマシンで実行できるように構成することは簡単です。)
リスト2-4 UBBCONFIGファイルのGROUPSセクション
*GROUPS
    APP_GRP1
        LMID = SITE1
        GRPNO = 2
        TMSNAME = TMS
    APP_GRP2
        LMID = SITE1
        GRPNO = 3
        TMSNAME = TMS
    ORA_GRP1
        LMID = SITE1
        GRPNO = 4
        OPENINFO = "ORACLE_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=100+LogDir=.+MaxCur=5"
        CLOSEINFO = ""
        TMSNAME = "TMS_ORA"
    ORA_GRP2
        LMID = SITE1
        GRPNO = 5
OPENINFO = "ORACLE_XA:Oracle_XA+Acc=P/scott/tiger+SesTm=100+LogDir=.+MaxCur=5"
        CLOSEINFO = ""
        TMSNAME = "TMS_ORA"
 
ファクトリでのファクトリ・ベース・ルーティングの実装
ファクトリでは、TP::create_object_reference()オペレーションに対する呼出しの実装と同様の方式でファクトリ・ベース・ルーティングが行われます。このオペレーションには、リスト2-5のC++バインドがあります。
リスト2-5 create_object_referenceのC++バインド
CORBA::Object_ptr TP::create_object_reference (
                       const char* interfaceName,
                       const PortableServer::oid &stroid,
                        CORBA::NVlist_ptr criteria);
 
この操作に対する3番目のパラメータであるcriteriaは、ファクトリ・ベース・ルーティングに使用される、名前の付いた値を指定します。ファクトリ内でファクトリ・ベース・ルーティングを実装するには、NVlistをビルドする必要があります。ファクトリ・ベース・ルーティングの使用はオプションであり、この引数に依存します。ファクトリ・ベース・ルーティングを使用するかわりに、この引数に0(ゼロ)の値を渡すこともできます。
前述のように、Productionサンプル・アプリケーションのRegistrarFactoryオブジェクトは、値STU_IDを指定します。この値は、UBBCONFIGファイルの次の項目と正確に一致する必要があります。
INTERFACESセクションのFACTORYROUTING識別子で指定される、ルーティング名、タイプ、および使用できる値
ROUTINGセクションで指定される、ルーティング基準名、フィールド、およびフィールド型
RegistrarFactoryオブジェクトは、リスト2-6に記載のコードを使用して、学生IDをNVlistに挿入します。
リスト2-6 RegistrarFactoryオブジェクトのNVlist
// put the student id (which is the routing criteria)
// into a CORBA NVList:
CORBA::NVList_var v_criteria;
TP::orb()->create_list(1, v_criteria.out());
CORBA::Any any;
any <<= (CORBA::Long)student;
v_criteria->add_value("student_id", any, 0);
 
RegistrarFactoryオブジェクトには、リスト2-7に示すTP::create_object_reference()オペレーションに対する呼出しが含まれます。これにより、リスト2-6で作成されたNVlistが渡されます。
リスト2-7 RegistrarFactoryオブジェクトでのcreate_object_referenceの呼出し
// create the registrar object reference using
// the routing criteria :
CORBA::Object_var v_reg_oref =
    TP::create_object_reference(
        UniversityP::_tc_Registrar->id(),
        object_id,
        v_criteria.in()
    );
 
Productionサンプル・アプリケーションはまた、TellerFactoryオブジェクトでもファクトリ・ベース・ルーティングを使用し、口座番号に基づいてTellerオブジェクトがインスタンス化されるべきグループを決定します。
実行時の処理
ファクトリでファクトリ・ベース・ルーティングを実装するとき、Oracle Tuxedo CORBAによってオブジェクト参照が生成されます。次の例は、ファクトリ・ベース・ルーティングが実装されているときにクライアント・アプリケーションがRegistrarオブジェクトへのオブジェクト参照を取得する方法を示します。
1.
クライアント・アプリケーションが、RegistrarFactoryオブジェクトを呼び出し、Registrarオブジェクトへのリファレンスをリクエストします。リクエストには、学生IDが含まれています。
2.
RegistrarFactoryは、NVlistに学生IDを挿入します。これは、ルーティング基準として使用されます。
3.
RegistrarFactoryは、TP::create_object_reference()オペレーションを呼び出し、Registrarインタフェース名、ユニークなOID、およびNVlistを渡します。
4.
Oracle Tuxedo CORBAは、ルーティング表の内容をNVlistの値と比較して、グループIDを判別します。
5.
Oracle Tuxedo CORBAは、グループに関する情報を、オブジェクト参照に挿入します。
クライアント・アプリケーションがその後、オブジェクト参照を使用してオブジェクトを呼び出すと、Oracle Tuxedo CORBAはオブジェクト参照で指定されたグループにリクエストをルーティングします。
注意:
Process-Entityデザイン・パターンを使用する場合は、ファクトリ・ベース・ルーティングの実装は慎重に行う必要があります。オブジェクトが処理できるのは、グループのデータベースに格納されているエンティティのみです。
その他の設計の考慮事項
このトピックには次の項が含まれます:
設計上の追加考慮事項について
RegistrarオブジェクトおよびTellerオブジェクトを設計する際には、次のことを確認してください。
RegistrarオブジェクトおよびTellerオブジェクトが、Productionデプロイメント環境、つまり、複数のレプリケートサーバー・プロセスおよび複数のグループにわたって、適正に機能していること。UniversityおよびBillingの各サーバー・プロセスがレプリケートされている場合の設計では、これら2つのオブジェクトをどのようにインスタンス化するかを考慮する必要があります。
Production Oracle Tuxedoドメインの2つのサーバー・グループが各々、別のデータベースを扱う場合には、所定の学生への登録および課金のオペレーションに対するクライアント・リクエストが、正しいサーバー・グループに送られること。
オブジェクトはユニークなオブジェクトID (OID)を持ち、メソッド・バウンドである必要があります。つまり、これらのオブジェクトには、methodアクティブ化ポリシーが割り当てられている必要があります。
RegistrarオブジェクトおよびTellerオブジェクトのインスタンス化
Productionサンプル・アプリケーションほど高度でないUniversityサーバー・アプリケーションでは、RegistrarオブジェクトとTellerオブジェクトの実行時の振る舞いは、より単純でした。
各オブジェクトは、プロセス・バウンドでした。つまり、最初に呼び出されたときにアクティブ化され、そのオブジェクトが実行されているサーバー・プロセスが停止されるまで、メモリー内に残っていました。
Oracle Tuxedoドメインで実行されるサーバー・グループは1つしかなく、グループ内ではUniversityおよびBillingのサーバー・プロセスは1つしかなかったため、すべてのクライアント・リクエストは、同じオブジェクトに転送されました。複数のクライアント・リクエストがOracle Tuxedoドメインに到達する一方で、これらの各オブジェクトが処理するクライアントは一度に1つずつでした。
各オブジェクトのインスタンスは、それらが実行されているサーバー・プロセスに1つしかなかったため、どちらのオブジェクトにもユニークなOIDは不要でした。各オブジェクトのOIDが指定するのは、インタフェース・リポジトリIDのみでした。
しかし今では、UniversityおよびBillingサーバー・プロセスはレプリケートされているため、Oracle Tuxedo CORBAはRegistrarオブジェクトとTellerオブジェクトの複数インスタンスを区別できる必要があります。たとえば、グループ内で2つのUniversityサーバー・プロセスが実行されている場合、Oracle Tuxedo CORBAには、1つ目のUniversityサーバー・プロセスで実行されているRegistrarオブジェクトと、2つ目のUniversityサーバー・プロセスで実行されているRegistrarオブジェクトを区別する手段が必要です。これらのオブジェクトの複数のインスタンスを区別するには、各オブジェクト・インスタンスが一意であることが必要です。
RegistrarおよびTellerオブジェクトをユニークなものにするには、これらのオブジェクトのファクトリで、これらに対するオブジェクト参照を作成する方法を変更しなければなりません。たとえばBasicサンプル・オブジェクトでは、RegistrarFactoryオブジェクトがRegistrarオブジェクトへのオブジェクト参照を作成すると、TP::create_object_reference()オペレーションが、文字列registrarのみからなるOIDを指定していました。しかし、Productionサンプル・アプリケーションでは、同じTP::create_object_reference()オペレーションが、生成されたユニークなOIDを使用します。
RegistrarおよびTellerオブジェクトにユニークなOIDを付与した結果、Oracle Tuxedoドメインではこれらのオブジェクトの複数のインスタンスが、同時に実行可能です。この特性は、ステートレス・オブジェクト・モデルでは一般的なものであり、Oracle Tuxedoドメインが、高い性能を提供しつつ、高度にスケーラブルであり得ることの一例です。
最後に、一意のRegistrarおよびTellerオブジェクトは、それらに対するクライアント・リクエストがあるたびにメモリーにロードする必要があるため、呼出しが完了したときにはこれらのオブジェクトを非アクティブ化し、関連するオブジェクト状態がアイドル状態のままメモリーに残存しないようにすることが重要です。Productionサーバー・アプリケーションは、実装構成ファイル(ICF)内のこれら2つのオブジェクトに、methodアクティブ化ポリシーを割り当てることによって、この問題に対処します。
学生の登録が確実に正しいサーバー・グループ内で行われるようにする方法
レプリケートサーバー・グループを使用する、主なスケーラビリティ上の利点は、複数台のマシンに処理を分散できることです。しかし、Universityサンプル・アプリケーションの場合のように、アプリケーションがデータベースと対話する場合は、これら複数のサーバー・グループがデータベースとの対話に与える影響を考慮することが重要です。
多くの場合、デプロイされているマシンに、データベースは1つずつ関連付けられています。サーバー・アプリケーションが複数台のマシンに分散されている場合は、データベースをどのようにセットアップするかを検討する必要があります。
この章で説明しているように、Productionサンプル・アプリケーションでは、2つのデータベースを使用します。しかし、このアプリケーションは、簡単にそれ以上のデータベースに対応できるよう構成できます。使用するデータベースの数は、システム管理者が決定できます。
Productionサンプル・アプリケーションでは、学生および口座の情報は、2つのデータベース間に分割されますが、コース情報は同一です。コース情報は、コース登録用途では読取り専用となっているため、両方のデータベースのコース情報が同一であることは問題にはなりません。一方で、学生情報および口座情報については読書きが行われます。複数のデータベースが学生および口座についても同一のデータを格納するとしたら(つまり、データベースが分割されていない場合)、アプリケーションでは、学生情報または口座情報が変更されるたびにデータベース全体にわたって学生および口座の情報の更新を同期する処理のオーバーヘッドに対処する必要が生じるでしょう。
Productionサンプル・アプリケーションは、ファクトリ・ベース・ルーティングによって、1台のマシンにリクエストの1セットを、別のマシンにリクエストの別の1セットを送信します。RegistrarFactoryオブジェクトでファクトリ・ベース・ルーティングがどのように実装されるかは、Registrarオブジェクトへの参照がどのように作成されるかによって変わります。
たとえば、クライアント・アプリケーションがRegistrarFactoryオブジェクトにリクエストを送信して、Registrarオブジェクトのオブジェクト参照を取得した場合、クライアント・アプリケーションはそのリクエストに学生IDを含めます。ファクトリによって返されたオブジェクト参照はグループ固有のものであるため、クライアント・アプリケーションは、RegistrarFactoryオブジェクトが返すオブジェクト参照を使用して、その後のRegistrarオブジェクトへのすべての呼出しを、特定の学生のために行う必要があります。したがって、たとえばクライアント・アプリケーションがその後、Registrarオブジェクトに対してget_student_details()操作を呼び出すと、クライアント・アプリケーションでは、Registrarオブジェクトが、その学生のデータを格納しているデータベースと関連付けられたサーバー・グループにおいて、確実にアクティブ化されます。
この機能を示すために、Productionサンプル・アプリケーションに実装されている次の実行シナリオを検討してみます。
1.
クライアント・アプリケーションは、RegistrarFactoryオブジェクトのfind_registrar()操作を呼び出します。この呼出しには学生ID 1000003が含まれます。
2.
Oracle Tuxedo CORBAは、クライアント・リクエストを任意のRegistrarFactoryオブジェクトにルーティングします。
3.
RegistrarFactoryオブジェクトは、学生IDを使用し、UBBCONFIGファイルのルーティング情報に基づいて、ORA_GRP1内のRegistrarオブジェクトへのオブジェクト参照を作成し、そのオブジェクト参照をクライアント・アプリケーションに返します。
4.
クライアント・アプリケーションは、Registrarオブジェクトのregister_for_courses()オペレーションを呼び出します。
5.
Oracle Tuxedo CORBAはクライアント・リクエストを受け取り、それをオブジェクト参照で指定されたサーバー・グループにルーティングします。この場合、クライアント・リクエストは、Productionマシン1のORA_GRP1内のUniversityサーバー・プロセスに送られます。
6.
Universityサーバー・プロセスは、Registrarオブジェクトをインスタンス化し、それにクライアント呼出しを送信します。
前述の説明のRegistrarFactoryオブジェクトは、クライアント・アプリケーションに、Productionマシン1上で実行され、100001から100005までのIDを持つ学生の学生データを格納したデータベースが含まれる、ORA_GRP1内でのみインスタンス化が可能なRegistrarオブジェクトへの一意の参照を返します。したがって、クライアント・アプリケーションが所定の学生のために、その後のリクエストをこのRegistrarオブジェクトに送信すると、Registrarオブジェクトは適正なデータベースと対話を行います。
Tellerオブジェクトが適切なサーバー・グループでインスタンス化されるようにする方法
RegistrarオブジェクトはTellerオブジェクトが必要になると、Universityサーバー・オブジェクトにキャッシュされていたTellerFactoryオブジェクト参照を使用して、TellerFactoryオブジェクトを呼び出します。
ただし、TellerFactoryオブジェクトではファクトリ・ベース・ルーティングが使用されているため、RegistrarオブジェクトがTellerオブジェクトへの参照をリクエストするとき、Registrarオブジェクトは学生の口座番号を渡します。このようにしてTellerFactoryオブジェクトは、正しいデータベースを備えたグループ内のTellerオブジェクトへの参照を作成します。
注意:
Productionサンプル・アプリケーションが適正に動作するためには、システム管理者がサーバー・グループとデータベースの構成を正しく行うことが不可欠です。具体的には、システム管理者はルーティング表で指定されたルーティング基準と、これらの基準を使用したリクエストのルーティング先となるデータベースを、確実に一致させる必要があります。Productionサンプルを例にすると、指定されたグループにあるデータベースは、そのグループにルーティングされたリクエストに正しく対応する学生情報および口座情報を含んでいる必要があります。
アプリケーションをさらにスケーリングする方法
将来的には、Productionサンプル・アプリケーションのシステム管理者がOracle Tuxedoドメインの容量を増やす必要を感じる場合もあります。たとえば、今後大学の学生数が著しく増えたり、いくつかのキャンパスを包含する、州全体の大学システムのコース登録プロセスに対応するようにProductionアプリケーションが拡張されたりすることが考えられます。これを行うのに、アプリケーションを修正したり再ビルドしたりする必要はありません。
システム管理者は、次の処理によって、容量を追加し続けることができます。
Productionサンプル・アプリケーションのサーバー・グループを複数のマシンにレプリケートします。
システム管理者は、UBBCONFIGファイルを修正し、追加のサーバー・グループ、これらのグループで実行されるサーバー・プロセス、およびサーバー・グループが動作するマシンを指定する必要があります。
ファクトリ・ベース・ルーティング表を変更します。
たとえば、Productionサンプル・アプリケーションの既存の2つのグループへルーティングするかわりに、システム管理者はUBBCONFIGファイルのルーティング・ルールを変更して、Oracle Tuxedoドメインに追加されたサーバー・グループにわたるよう、アプリケーションをさらにパーティション化することができます。ルーティング表への変更はすべて、UBBCONFIGファイル内の構成済のサーバー・グループおよびマシンの情報と一致している必要があります。
注意:
データベースを使用する既存のOracle Tuxedo CORBAアプリケーションに容量を追加する場合、特にファクトリ・ベース・ルーティングを使用しているときは、データベースのセットアップに対する影響も考慮する必要があります。たとえば、Productionサンプル・アプリケーションが6台のマシンに分散されている場合、各マシン上のデータベースを適切かつUBBCONFIGファイルのルーティング表に従って設定する必要があります。
 

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved