Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成の手引


2.1.11 リモートプロシジャコールとサービスを実行するプロセスの関連

サービスを要求されたサーバUAPは,クライアントUAPとは別のプロセスで実行されます。OpenTP1では,一つのサーバUAPを実行するためのプロセスを複数起動できるマルチサーバを実現できます。マルチサーバの場合でRPCをネストさせると,ネストさせるサービス数だけプロセスが実行される場合があります。

同じサーバUAPでも,クライアントUAPが異なれば,決まったプロセスで実行されるとは限りません。また,クライアントUAPと同じサービスグループに属するサービスを要求する場合でも,そのサービスグループを実行するための新しいプロセスが必要になります。マルチサーバを使う場合は,使用するプロセス数には余裕を持った値を指定しておいてください。

RPCとプロセスの関係を次の図に示します。

図2‒10 RPCとプロセスの関係

[図データ]

  1. クライアントUAP1からサーバUAP1にサービスを要求した場合,サーバUAP1はプロセスAで実行されます。

  2. クライアントUAP1からサーバUAP2にサービスを要求した場合,サーバUAP2はプロセスBで実行されます。

  3. 新たなクライアントUAP2からサーバUAP1にサービスを要求した場合,1.のサービス要求とは別の,プロセスCで実行されます。

〈この項の構成〉

(1) 連鎖RPC

同じサービスグループに属するサービスを2回以上要求する同期応答型RPCの場合に限り,そのサービスを以前と同じプロセスで実行できます。これを連鎖RPCといいます。連鎖RPCでサービスを要求すると,マルチサーバのサーバUAPでも前回のRPCと同じプロセスで実行されるため,トランザクション処理に必要なプロセスを最小限にできます。UAPのプロセスはサービスグループごとに確保されるため,同じサービスグループに属していれば,異なるサービスに対しても連鎖RPCでサービスを要求できます。

連鎖RPCの処理は,トランザクションとしてもトランザクションとしなくても実行できます。トランザクションとして連鎖RPCを実行する場合は,一つのグローバルトランザクションとして処理されます。

連鎖RPCは,クライアントUAPのプロセス単位で保証されます。ただし,同じグローバルトランザクション内でも,クライアントUAPが異なれば,複数回呼び出されたサービスは同じプロセスで起動されることは保証されません。

(a) 連鎖RPCの開始

連鎖RPCとなるサービス要求をする場合は,サービスを要求するdc_rpc_call関数のflagsにDCRPC_CHAINEDを設定してください。この値を設定してサービスを要求したことで,サーバUAP側は連鎖RPCであることを認識して,プロセスを確保します。2回目以降のサービス要求のflagsにも,DCRPC_CHAINEDを設定します。

2回目以降のサービス要求では,ユーザサーバおよびサービスの閉塞状態を検出できません。2回目以降のサービス要求の実行中に異常が発生した場合は,ユーザサーバが閉塞します。このとき,サービス単位には閉塞できません。

(b) 連鎖RPCの終了

連鎖RPCは,次のどれかの方法で終了します。

  • ユーザサービス定義のrpc_extend_functionオペランドに00000002を指定していない場合は,連鎖RPCを実行しているサービスグループに対して,同期応答型RPC(flagsにDCNOFLAGSを設定)でサービス要求する。

  • トランザクション実行中に開始した連鎖RPCの場合は,連鎖RPCを実行しているグローバルトランザクションを同期点処理(コミット,またはロールバック)で完了させる。

  • ユーザサービス定義のrpc_extend_functionオペランドに00000002を指定している場合は,トランザクション実行中に開始した非トランザクションの連鎖RPCが,同期点処理を実行したあと,連鎖RPCを実行しているサービスグループに対して同期応答型RPC(flagsにDCNOFLAGSを設定)でサービス要求する。

(c) 連鎖RPCの時間監視

連鎖RPCの処理中に通信障害などで次のサービス要求が受け取れないと,SPPがプロセスを確保したままになってしまうことがあります。これを防ぐため,連鎖RPCで実行しているSPPでは,応答を返してから次のサービス要求,または連鎖RPCの終了要求が来るまでの時間(最大時間間隔)を次に示す値で監視しています。

  • TP1/Server Baseの場合:

    ユーザサービス定義のwatch_next_chain_timeオペランドに指定した値

  • TP1/LiNKの場合:

    180秒

上記の監視時間を過ぎても次のサービス要求,または連鎖RPCの終了要求が来ない場合は,OpenTP1はクライアントUAPで障害が起こったものと見なして,該当するSPPのプロセスを異常終了させます。

(d) ソケット受信型サーバへの連鎖RPCについて

ソケット受信型サーバ(スケジュールキューを経由しないでサービス要求を受信するSPP)は,マルチサーバとして稼働できません。また,非常駐プロセスとしても稼働できません。ソケット受信型サーバは,一つの常駐プロセスで稼働しています。

ソケット受信型サーバに対して連鎖RPCでのサービス要求をすると,サーバUAPは,該当のクライアントUAPだけからしかサービス要求を受け付けなくなります。ソケット受信型サーバへ連鎖RPCでのサービス要求は,できるだけしないようにしてください。

連鎖RPCとプロセスの関係を次の図に示します。

図2‒11 連鎖RPCとプロセスの関係

[図データ]

  1. クライアントUAP1からサーバUAP1に連鎖RPC(flagsにDCRPC_CHAINEDを設定)でサービスを要求した場合,サーバUAP1はプロセスAで実行されます。

  2. クライアントUAP1からサーバUAP2に連鎖RPCでサービスを要求した場合,サーバUAP2はプロセスBで実行されます。

  3. クライアントUAP1からサーバUAP1に,再び連鎖RPCでサービスを要求した場合,1.のサービス要求と同じプロセスAで実行されます。

  4. クライアントUAP1からサーバUAP1に,同期応答型RPC(flagsにDCNOFLAGSを設定)でサービスを要求した場合,サーバUAP1はプロセスAで実行されます。そしてクライアントUAP1とサーバUAP1の連鎖RPCは終了します。

  5. クライアントUAP1からサーバUAP2に,連鎖RPCでサービスを要求した場合,サーバUAP2はプロセスBで実行されます。

  6. 同期点を取得すると,クライアントUAP1とサーバUAP2の連鎖RPCは終了します。