1 Oracle Tuxedo /Qの概要

このトピックには、次の項があります。

1.1 はじめに

Oracle Tuxedo /Qコンポーネントを使用すると、メッセージをキューに登録することができます。永続ディスクまたは非永続メモリーに格納しておき、後で、処理したり取り出したりすることができます。Oracle Tuxedoアプリケーション・トランザクション・モニター・インタフェース(ATMI)には、キューへのメッセージの登録、またはキューからのメッセージの取出しを行う関数が用意されています。応答メッセージやエラー・メッセージを、後からクライアント・プログラムが取り出せるようにキューに登録しておくことができます。管理コマンドのインタプリタによって、サーバーの作成、リスト表示、変更を行うことができます。メッセージ・キュー・サーバーは、メッセージのキューへの登録とキューからの取出し、処理のためのキューからのメッセージの転送、およびキューに関係するトランザクションの管理に関するリクエストを受け取ります。

1.2 キュー・システムのコンポーネントとタスク

次の図は、キュー式メッセージ機能のコンポーネントを示しています。

図1-1 キュー・サービスの呼出し


キュー・サービスの呼出しの図

この図は、キュー・サービスの呼出しで、キュー・システムの各コンポーネントがどのように動作するかを示しています。この図を利用して、管理者とプログラマがOracle Tuxedo /Qをどのように使用するかを説明します。キューに登録されたメッセージは処理を待機し、応答が送信側に返されます。また、図に示されているコンポーネントのサブセットを統合すると、ピア・ツー・ピア通信のためにキューイング・サービスを使用することもできます。キュー・スペースは、1つのリソースです。このリソースには、X/OpenのXA準拠のリソース・マネージャ・インタフェースからアクセスできます。このインタフェースに関連する2フェーズ・コミット・トランザクションでは、キューへの登録とキューからの取出しを、他のXA準拠リソース・マネージャと連携して実行できます。

1.3 管理者のタスク

Oracle Tuxedoの管理者は、サーバーを定義し、図「キュー・サービスの呼出し」で縦の2本の破線の間に示されているキュー・スペースおよびキューを作成する必要があります。キュー・サーバー・グループは、最低1つ定義します。その場合、TMS_QMをトランザクション・マネージャ・サーバーにします。

この他に、システムで提供される2つのサーバーを構成ファイルに定義する必要があります。この2つのサーバーは、次の処理を行います。

  • メッセージ・キュー・サーバーTMQUEUE(5)は、メッセージのキューへの登録や、キューからの取出しを行います。このサーバーは、クライアントとサーバーがキューに対してローカルであるかどうかにかかわらず、クライアントとサーバーのかわりにメッセージに関する操作を行います。
  • TMQFORWARD(5)は、メッセージをキューから取り出してアプリケーション・サーバーに転送するメッセージ転送サーバーです。Oracle Tuxedoは、サーバーの初期化と終了を処理するサーバー用のmain()関数を提供し、着信リクエストの受信とディスパッチを行うバッファを割り当て、応答を適切にルーティングします。この処理はすべてアプリケーションに透過的です。既存のサーバーが、メッセージをキューから取り出したり、応答をキューに登録したりすることはありません。Oracle Tuxedo /Qは、既存のサーバーが、変更を必要とせずに、キューに登録されたメッセージを処理できるように設計されています。TMQFORWARDサーバーは、キュー・スペース内の1つ以上のキューからメッセージを取り出し、そのメッセージをキューと同じ名前のサービスを持つサーバーに送信し、応答を待ちます。そして、発信元によって応答キューまたは異常終了キューが指定されている場合はメッセージの発信元の指定に従って、対応する応答キューまたは異常終了キューに、正常終了応答または異常終了応答を登録します。

また、管理者は、キュー管理プログラムqmadmin(1)またはAPPQ_MIB(5)管理情報ベース(MIB)のいずれかを使用して、キュー・スペースを作成する必要があります。キュー・スペースには、キューが格納されます。たとえば、図「キュー・サービスの呼出し」では、APPキュー・スペースには4つのキューが含まれています。各キュー・スペースは1つのリソース・マネージャ(RM)に対応し、1つのグループは1つのRMしか保持できません。

キュー・スペースの概念では、次に示す方法で、キュー間でオーバーヘッドを共有することにより、キューに対応する管理オーバーヘッドを減少させることができます。

  • キュー・スペース内のキューは、メッセージ用の永続的な記憶域および非永続的な記憶域を共有します。
  • 図「キュー・サービスの呼出し」の単一のメッセージ・キュー・サーバーTMQUEUEは、単一のキュー・スペース内で、複数のキューに対してメッセージの登録と取出しを行います。
  • 図「キュー・サービスの呼出し」の単一のメッセージ転送サーバーTMQFORWARDは、単一のキュー・スペース内で、複数のキューに対してメッセージの取出しと転送を行います。
  • 図「キュー・サービスの呼出し」には、トランザクション・マネージャ・サーバーTMS_QMの2つのインスタンスが示されています。これにより、同一キュー・スペース内の複数のキューにまたがってトランザクションを完了することができます。最初のトランザクション・マネージャ・サーバー・インスタンスは、非ブロッキング・トランザクション用に予約されています。これは、ブロッキング・トランザクションによって速度が低下することなく、できるだけ迅速に処理できるようにするためです。トランザクション・マネージャ・サーバーの2番目のインスタンスは、ブロッキング・トランザクションを担当します。

管理者は、キュー・スペースに対して、アプリケーション構成内に単一のサーバー・グループを定義でき、その場合は、UBBCONFIGにグループを指定するか、またはtmconfig(1)を使用してグループを動的に追加します。

  • 最後に、管理者が1つのキュー・スペース内にあるキュー間でメッセージを移動すると、メッセージが異なる安定記憶領域にある場合よりもオーバーヘッドが少なくなります。これは、1フェーズ・コミットを行うことができるからです。

キューを定義する作業の1つに、キューのメッセージの順序を指定することがあります。キューの順序付けは、メッセージの可用期間、有効期限、優先度、FIFO、LIFOのいずれか、またはこれらの組合せで決定します。

管理者は、この中から1つ以上の基準を指定します。その場合、最上位の基準から先に指定します。FIFOおよびLIFOの値は、最後に指定します。メッセージは、指定された順序付け基準に従ってキューに登録され、キューの先頭から取り出されます。管理者は、クライアントで生成されるリクエストに安定したキューで対応できるように、必要な数のメッセージ・キュー・サーバーを設定できます。

データ依存型ルーティング・アプローチによって、同じサービスを提供する複数のグループでサーバー間のルーティングを有効にできます。

管理上の目的から、定期的に取り出されないキューがしきい値に達したときに実行されるコマンドを設定できます。これは、キューに使用されるキュー・スペースのバイト数、ブロック数、または割合、あるいはキューのメッセージの数に基づいて設定します。このコマンドでは、TMQFORWARDサーバーを起動してキューを取り出すか、または管理者にメールを送信して手動で処理します。

Oracle Tuxedoシステムは、いくつかの操作のために、Oracle Tuxedoインフラストラクチャのキューイング・サービス・コンポーネントを使用します。(Oracle Tuxedoインフラストラクチャは、セキュリティ、スケーラビリティ、キュー処理、トランザクションなどのサービスを提供します。)たとえば、共用メモリーの管理操作は、Queuing Servicesコンポーネントで提供されます。Oracle Tuxedoアプリケーションで現在使用できない関数もあります。それらについては、その関数の説明で注意してあります。

キュー式メッセージ機能をクライアント間のピア・ツー・ピア通信で使用すると、クライアントは転送サーバーを使用せずに、他のクライアントと通信できます。次の図に、ピア・ツー・ピア通信モデルを示します。

図1-2 ピア・ツー・ピア通信


ピアツーピア通信の図

1.4 プログラマのタスク

「キュー・サービスの呼出し」のステップ1 - 3では、クライアントがtpenqueue(3c)を使用して、アプリケーション・キュー・スペース内のSERVICE1キューにメッセージを登録します。オプションの応答キューと異常終了キューをtpenqueue ()の呼出しに指定することもできます。この例ではCLIENT_REPLY1FAILURE_Qが示されています。クライアントは、メッセージに付ける相関識別子の値を指定することもできます。この値はキューの間で同じであるため、キューに登録されたメッセージに関連付けられている、応答メッセージまたは異常終了メッセージを識別するために使用できます。これは、このプロセス中に応答キューまたは異常終了キューから読み取られます。

クライアントで使用できるキューの順序付けは2種類あります。標準キュー順序(たとえば、メッセージをキューから取り出せるようになるまでの時間)か、デフォルトキュー順序の無効化(たとえば、このメッセージを先頭または別のメッセージの前に配置するようにリクエスト)です。tpenqueue()は、メッセージをTMQUEUEサーバーに送信し、メッセージをキューに登録し、クライアントに確認を送信します(ステップ3)。確認はクライアントでは認識されませんが、クライアントが正常なレスポンスを受け取ると確認と見なすことができます。異常終了の戻り値には、異常終了の内容についての情報が含まれています。

キュー・マネージャによって割り当てられたメッセージ識別子は、アプリケーションに返されます。この識別子は、特定のメッセージをキューから取り出す場合に使用します。これに加えて、tpenqueue()を使用して、後続のメッセージの前にすでに登録されているメッセージを識別することもできます。

メッセージがキューに登録されるトランザクションが正常に完了していないと、後でメッセージを取り出すことはできません。

Oracle Tuxedo /Qをキュー・サービスの呼出しに使用している場合に、メッセージがキューの先頭に到達すると、TMQFORWARDサーバーはそのメッセージをキューから取り出し、tpcall(3c)を介してキューと同じ名前を持つサービスに転送します。図「キュー・サービスの呼出し」では、このキューとサービスはSERVICE1,という名前で、ステップ4、5、および6がそれを示しています。クライアントの識別子およびアプリケーションの認証キーが、メッセージのキューへの登録を行うクライアントに提供され、これらは、キューから取り出されたメッセージがサービスに送信されるときに一緒に送信されます。

サービスが応答を返すと、TMQFORWARDはその応答(オプションとしてユーザー戻りコードを伴う)を応答キューに登録します(図「キュー・サービスの呼出し」のステップ7を参照)。

その後(図「キュー・サービスの呼出し」のステップ8、9、10)、クライアントはtpdequeue(3c)を使用して、応答メッセージを応答キューCLIENT_REPLY1から受け取ります。

tpdequeue()にTPQPEEKフラグを設定すると、メッセージをキューから削除せずに取り出すことができます。有効期限が過ぎたメッセージ、または管理者によって削除されたメッセージは、直ちにキューから削除されます。

関連項目:

1.4.1 トランザクション管理

トランザクション管理の目的の1つは、グローバル・トランザクション内でメッセージをキューに登録したりキューから取り出して、信頼性を確実にすることです。ただし、これとは相反する目的として、関与するトランザクションの数を最小限にして実行のオーバーヘッドを減少させることがあります。

呼出し側は、キュー処理を呼出し側のトランザクションから分離して、自身が関与しているあらゆるトランザクションとは別のトランザクションで、メッセージをキューに登録することもできます。ただし、この場合のタイムアウトは、メッセージがキューに登録されているかどうかにかかわらず、認識されません。

適切な方法としては、次の図に示すように、呼出し側のトランザクション内でメッセージをキューに登録します。

図1-3 トランザクション境界の判定


トランザクション境界の判定の図

この図では、クライアントがトランザクションを開始し、メッセージをキューに登録し、トランザクションをコミットしています。メッセージは、TMQFORWARDで開始される2番目のトランザクション内でキューから取り出されます。サービスはtpcall(3c)で呼び出されて実行され、応答が同じトランザクション内でキューに登録されます。クライアントは3番目のトランザクションを開始し、応答をキューから取り出します。また、別のリクエスト・メッセージをキューに登録する場合もあります。次のリクエストのキューへの登録は、前のリクエストからのレスポンスをキューから取り出す処理と同じトランザクション内で行うことができます。そのため、実行中の処理では、3番目と最初のトランザクションを1つにまとめることができます。

ノート:

システムでは、同じトランザクション内で、あるメッセージからのレスポンスをキューから取り出し、次のリクエストをキューに入れることが可能です。ただし、同じトランザクション内で、リクエストをキューに入れ、レスポンスをキューから取り出すことはできません。メッセージをキューから取り出すには、リクエストをキューに登録するトランザクションが正常にコミットされることが必要です。

関連項目:

「第3c項 - C関数」のtpcall(3c)

1.4.2 応答メッセージの処理

応答メッセージは、tpenqueue().の呼出し時に、アプリケーションによって指定することもしないことも可能ですその場合、それぞれ次のような結果になります。

  • キュー・メッセージに応答キューが指定されていない場合、メッセージの処理以外の作業は要求されません。
  • 応答キューを指定するメッセージがキューから取り出された場合、メッセージの発信者は、リクエストの実行が正常に終了したときに応答がキューに登録されることを要求しています。
  • アプリケーションがtpdequeue()を使用してメッセージを明示的にキューから取り出す場合、そのアプリケーションはtpenqueue()を呼び出して応答をキューに登録する必要があります。通常、これはリクエスト・メッセージがキューから取り出されて実行されるのと同じトランザクション内で行われます。そのため、この操作全体はアトミックに行われます。つまり、トランザクションが成功した場合にのみ、応答がキューに登録されます。
  • TMQFORWARDによってメッセージが自動的に処理される場合(キューから取り出され、tpcall()を介してアプリケーションに渡される場合)、アプリケーション・サービスが正常に終了したとき、つまりTPSUCCESSが設定されてtpreturn(3c)が呼び出され、tpcall()が1を返さなかったときは、TMQFORWARDは応答をキューに登録します。tpcall()がデータを受け取ると、使用された型付きバッファは応答キューに登録されます。tpcall()でデータが受信されなかった場合、データなしのメッセージ(つまり、NULLメッセージ)が、キューに登録されます。メッセージがキューに登録されることは、それがNULLであっても、操作の完了を示すには十分です。

関連項目:

「第3c項 - C関数」のtpreturn(3c)

1.4.3 エラー処理

エラーを処理するには、アプリケーションに起こるエラーの特徴を理解することと、Oracle Tuxedo管理者とアプリケーション・プログラム開発者の注意深い計画と協力が必要です。Oracle Tuxedo /Qでは、メッセージがトランザクション内でキューから取り出され、そのトランザクションがロールバックされたときに、再試行パラメータが0より大きい場合は、メッセージがキューに戻されて、再度取出しと実行が可能になります。

一時的な障害の場合は、少し時間をおいてから、メッセージの取出しと実行を再試行します。たとえば、アプリケーション・データベースに対するアクティビティが多数ある場合は、別のトランザクションによってデータベースのロックが解除されるには、少しの時間さえあればよい場合があります。通常、再試行の回数に上限を設定することも、なんらかのアプリケーション不備によってリソースを著しく浪費することを防ぐには有用です。管理者がキューを設定するときに、再試行の回数と遅延時間(秒単位)の両方を指定できます。再試行の回数0は、再試行が行われないことを示します。再試行の回数が上限に達すると、管理者がキュー・スペースに設定するエラー・キューにメッセージが移動されます。

障害が一時的なものではない場合もあります。たとえば、キュー・メッセージが存在しないアカウントに対して操作をリクエストする場合などです。その場合、再試行してリソースを浪費しないようにします。アプリケーション・プログラマまたは管理者が、特定の操作の失敗が一時的ではないと判断した場合、単に再試行の回数を0に設定します。同じサービスに対する障害が、一時的なものであったり、永続的なものであったりする場合がよくあります。管理者およびアプリケーション開発者は、いろいろな方法でエラーに対処できるようにしておきます。

アプリケーションは、直接メッセージをキューから取り出すことも、TMQFORWARDサーバーを使用することもできます。また、トランザクションをコミットするようにロジックで指示されている場合に、トランザクションがロールバックされたり、メッセージがキューに再度登録されたりするエラーが発生することがあります。このような問題とその対処法については、「Oracle Tuxedo /Qの管理」「Oracle Tuxedo /QのC言語プログラミング」、および「Oracle Tuxedo/Q COBOL言語プログラミング」を参照してください。

1.4.4 まとめ

Oracle Tuxedo /QによってOracle Tuxedoアプリケーション・プログラマおよび管理者に提供される機能は、次のようにまとめることができます。

  • アプリケーション・プログラミング・インタフェースを使用して、リクエストをキューに登録して後で処理することができます。システムでは、リクエストが1回だけ正常に実行されることが保証されます。デフォルトでは、失敗した場合はメッセージがキューに戻されます。また、アプリケーション・プログラミング・インタフェースを使用して、キューの先頭から、またはメッセージ識別子や相関識別子によって、メッセージを取り出すことができます。
  • アプリケーション・プログラミング・インタフェースを使用して、リクエストをキューに登録して後で処理することができます。システムでは、リクエストが1回だけ正常に実行されることが保証されます。デフォルトでは、失敗した場合はメッセージがキューに戻されます。また、アプリケーション・プログラミング・インタフェースを使用して、キューの先頭から、またはメッセージ識別子や相関識別子によって、メッセージを取り出すことができます。
  • アプリケーション・プログラムや管理者は、キューのメッセージの順序付けを制御できます。その場合、基準を設定して順序付けします。基準としては、メッセージの可用期間、有効期限、優先度、LIFO、FIFOのいずれか、またはこれらの組合せを使用できます。アプリケーションは、順序付けを無効化して、キューの先頭や、既にキューに登録されている特定のメッセージの前にメッセージを入れることができます。
  • Oracle Tuxedoサーバーを使用して、クライアントおよびサーバー(リモート・クライアントやサーバーの場合もあります)にかわって、メッセージをキューに登録したりキューから取り出すことができます。サーバーのコピーをいくつ設定するかは、管理者が決定します。
  • Oracle Tuxedoサーバーを使用して、キューからメッセージを取り出して、サービスに転送して実行できます。このサーバーを使用すると、既存のサーバーを変更せずにキューに登録されたリクエストを処理できます。各転送サーバーは、1つ以上のキューを処理するように設定できます。トランザクションでは、1回だけ処理が行われることが保証されます。管理者は、設定する転送サーバーの数を決定します。
  • 管理者は、処理のためにキューに格納されたメッセージを管理できます。たとえば、失敗時にリクエストを再試行する回数、再試行を行う間隔、キュー上のメッセージの再順序付け、キューの容量の管理などを行います。

キューに登録されたメッセージを使用するアプリケーション・パラダイムは多数あります。このようなパラダイムでは、マシン、サーバー、またはリソースが使用できない場合、または信頼性が低い場合(広域ネットワークやワイヤレス・ネットワークの場合など)に、リクエストをキューに登録できます。また、ワーク・フローで、プロセスの次のステップを行うために各ステップでキュー・リクエストを生成できます。さらに、処理に時間がかかるトランザクションのバッチ処理で、発信元が完了を待たなくても、最終的にはメッセージが処理されたことを保証できます。ピア・ツー・ピア関係で、関係がない2つのアプリケーション間で、データ・パイプを提供することもできます。