サービスを要求されたサーバUAPは,クライアントUAPとは別のプロセスで実行されます。OpenTP1では,一つのサーバUAPを実行するためのプロセスを複数起動できるマルチサーバを実現できます。マルチサーバの場合でRPCをネストさせると,ネストさせるサービス数だけプロセスが実行される場合があります。
同じサーバUAPでも,クライアントUAPが異なれば,決まったプロセスで実行されるとは限りません。また,クライアントUAPと同じサービスグループに属するサービスを要求する場合でも,そのサービスグループを実行するための新しいプロセスが必要になります。マルチサーバを使う場合は,使用するプロセス数には余裕を持った値を指定しておいてください。
RPCとプロセスの関係を次の図に示します。
図2-10 RPCとプロセスの関係
同じサービスグループに属するサービスを2回以上要求する同期応答型RPCの場合に限り,そのサービスを以前と同じプロセスで実行できます。これを連鎖RPCといいます。連鎖RPCでサービスを要求すると,マルチサーバのサーバUAPでも前回のRPCと同じプロセスで実行されるため,トランザクション処理に必要なプロセスを最小限にできます。UAPのプロセスはサービスグループごとに確保されるため,同じサービスグループに属していれば,異なるサービスに対しても連鎖RPCでサービスを要求できます。
連鎖RPCの処理は,トランザクションとしてもトランザクションとしなくても実行できます。トランザクションとして連鎖RPCを実行する場合は,一つのグローバルトランザクションとして処理されます。
連鎖RPCは,クライアントUAPのプロセス単位で保証されます。ただし,同じグローバルトランザクション内でも,クライアントUAPが異なれば,複数回呼び出されたサービスは同じプロセスで起動されることは保証されません。
連鎖RPCとなるサービス要求をする場合は,サービスを要求するdc_rpc_call関数のflagsにDCRPC_CHAINEDを設定してください。この値を設定してサービスを要求したことで,サーバUAP側は連鎖RPCであることを認識して,プロセスを確保します。2回目以降のサービス要求のflagsにも,DCRPC_CHAINEDを設定します。
2回目以降のサービス要求では,ユーザサーバおよびサービスの閉塞状態を検出できません。2回目以降のサービス要求の実行中に異常が発生した場合は,ユーザサーバが閉塞します。このとき,サービス単位には閉塞できません。
連鎖RPCは,次のどれかの方法で終了します。
連鎖RPCの処理中に通信障害などで次のサービス要求が受け取れないと,SPPがプロセスを確保したままになってしまうことがあります。これを防ぐため,連鎖RPCで実行しているSPPでは,応答を返してから次のサービス要求,または連鎖RPCの終了要求が来るまでの時間(最大時間間隔)を次に示す値で監視しています。
上記の監視時間を過ぎても次のサービス要求,または連鎖RPCの終了要求が来ない場合は,OpenTP1はクライアントUAPで障害が起こったものと見なして,該当するSPPのプロセスを異常終了させます。
ソケット受信型サーバ(スケジュールキューを経由しないでサービス要求を受信するSPP)は,マルチサーバとして稼働できません。また,非常駐プロセスとしても稼働できません。ソケット受信型サーバは,一つの常駐プロセスで稼働しています。
ソケット受信型サーバに対して連鎖RPCでのサービス要求をすると,サーバUAPは,該当のクライアントUAPだけからしかサービス要求を受け付けなくなります。ソケット受信型サーバへ連鎖RPCでのサービス要求は,できるだけしないようにしてください。
連鎖RPCとプロセスの関係を次の図に示します。
図2-11 連鎖RPCとプロセスの関係