Hitachi

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


2.1.6 非応答型RPC

サーバUAPの処理結果をクライアントUAPに返さないRPCです。クライアントUAPではサーバUAPの処理結果を受信できません。

非応答型RPCは時間監視をしません。

非応答型RPCの遠隔サービスを要求するサービス関数は,サービス要求後にリターンします。クライアントUAPは,サービス関数のリターン後に処理を続けます。サーバUAPの処理結果は受信できません。

非応答型RPCの遠隔サービスを要求するサービス関数は,サービス要求がサーバUAPに受け付けられたことを確認しないでリターンします。そのため,通信障害などによってサービス要求が消失しても,クライアントUAPで認識することはできません。また,一つのクライアントUAPから同じサービスグループに複数の非応答型RPCでサービスを要求した場合,サーバUAP側でこの要求順どおりにサービスを受け付けるとは限りません。

非応答型RPCを次の図に示します。

図2‒10 非応答型RPC

[図データ]

〈この項の構成〉

(1) TP1/EEがサーバUAPの場合の非応答型RPC

サーバUAP(TP1/EE)では,クライアントUAP(SUP,SPP)からのメッセージを受信するための受信スレッドは,自ポート番号ごとに存在します。

クライアントUAPからの要求メッセージの受信には,ソケットAPI(TCP/IPソケットインタフェース)が使用されます。

サービスは,受信したメッセージ中のサービス名を基に処理キューに登録されます。処理キューに登録されたサービスは,処理スレッドによって引き出され,ユーザデータをサーバUAPに引き渡します。

TP1/EEが非応答型RPCでメッセージを受信したときの処理の流れを次の図に示します。

図2‒11 非応答型RPCでメッセージを受信したときの処理の流れ

[図データ]

(a) ノード間負荷バランス機能を使用した場合のRPCメッセージ受信

ノード間負荷バランス機能とは,他ノードにある同じサービスグループ名のサーバUAP間で,サービス処理の負荷を分散させる機能です。ノード間負荷バランス機能を使用してRPCメッセージを受信した場合,自プロセスの負荷が高いとき,または,スケジューラダイレクト機能を使用したRPCメッセージのときに,他ノードにある同じサービスグループ名のサーバUAPの中から負荷の低いプロセスを選択し,メッセージを転送します。他ノードにある同じサービスグループ名のサーバUAPの中に,負荷の低いプロセスがない場合は,自プロセスで処理します。

ノード間負荷バランス機能の詳細については,マニュアル「TP1/Server Base Enterprise Option 使用の手引」を参照してください。

(b) 他サービスグループ名を指定した場合のRPCメッセージ受信

RPCメッセージの受信時,クライアントUAPで指定したサービスグループ名とTP1/EEのサービスグループ名が一致しない場合,ネーム情報から該当するサービスグループを選択し,メッセージを転送します。

(2) TP1/EEがクライアントUAPの場合の非応答型RPC

TP1/EEがクライアントUAP(SPP)の場合の非応答型RPCの送信形態には,次の種類があります。

各送信形態の概要を次の表に示します。

表2‒1 各送信形態の概要

送信形態

送信種別

送信先

サービス関数

即時送信

即時送信

他ノードのサーバUAP

ee_rpc_call

ee_rpc_call_to

トランザクション同期型送信

コミット送信

他ノードのサーバUAP

ee_rpc_cmtsend

【CBLEERPC('CMTSND ')】

ee_rpc_cmtsend_to

【CBLEERPC('CMTSNDTO')】

自プロセス送信

自ノードのサーバUAP

ee_rpc_cmtsend

注※

同期点処理がコミットの場合だけ送信します。ロールバックの場合は送信しません。

非応答型RPCの場合,応答メッセージがないため,コネクションの障害などが発生し,メッセージが消失しても検知できません。ユーザによる送達確認が必要になります。

クライアントUAPとして使用するTP1/EEが要求できるサーバUAPは,キュー受信型サーバと,ソケット受信型サーバのどちらでもかまいません。

ネームサービスを使用する場合は,RPC関連定義のrpc_destination_modeオペランドでメッセージ送信先の取得方法を指定します。また,メッセージ送信先の決定時に,通信障害によって送信先のサーバUAPを起動できなかった場合,または,送信先のサーバUAPが未起動などの旨の応答メッセージが返ってきた場合,別のあて先を取得するためにリトライ処理をします。ただし,ネームサービスからネーム情報を取得する場合は,同じサービスグループの同じあて先に対してリトライ処理をする場合もあります。

ネームサービスを使用しない場合は,サービスグループ情報関連定義のeesvgdef定義コマンドで指定したあて先にメッセージを送信します。送信時に障害が発生しても,リトライ処理はしません。

ネームサービスの詳細については,マニュアル「TP1/Server Base Enterprise Option 使用の手引」を参照してください。

(a) 即時送信

即時送信は,クライアントUAPからの要求で指定されたサーバUAPに非応答型RPCでメッセージを送信します。クライアントUAPは,ee_rpc_call関数でメッセージを作成し,サーバUAPにメッセージを送信します。サーバUAPから応答は受け取りません。即時送信時に障害が発生した場合は,クライアントUAP(即時送信要求元)にエラーリターンします。

即時送信の流れを,次の図に示します。

図2‒12 即時送信の流れ(非応答型RPC)

[図データ]

(b) トランザクション同期型送信

トランザクション同期型送信は,トランザクションのコミット時に,サーバUAPへのサービス要求を有効にします。ロールバック時(ロールバックリターン含む)は,サービス要求は無効になります。

トランザクション同期型送信は,非グローバルトランザクション,非応答型RPCの場合だけ有効です。

トランザクション同期型送信は,サービス要求が有効になるタイミングがコミット時ということ以外は,即時送信と変わりません。

■ コミット送信

ee_rpc_cmtsend関数またはee_rpc_cmtsend_to関数でサーバUAPを指定してサービス要求を行います。ee_rpc_cmtsend(ee_rpc_cmtsend_to)関数のflagsにはEENOFLAGSを指定します。ee_rpc_cmtsend(ee_rpc_cmtsend_to)関数の呼び出し時は,実際の送信処理はしないで,サービス要求の受け付けだけをして,メッセージ作成後にリターンします。メッセージはメモリ(バッファ)上に退避します。退避していたメッセージは同期点処理(コミット)時に送信されます。同期点処理がロールバックの場合は,メッセージは送信されないで破棄されます。

トランザクション開始から同期点取得までで,複数回ee_rpc_cmtsend(ee_rpc_cmtsend_to)関数を呼び出して複数のメッセージを作成できます。メッセージごとに異なるサーバUAPを指定できます。

コミット送信の流れを次の図に示します。

図2‒13 コミット送信

[図データ]

■ 自プロセス送信

クライアントUAP(TP1/EE)と同じノードのサーバUAPに対してサービス要求をする場合,ee_rpc_cmtsend関数に要求先サーバUAPを指定して呼び出します。自プロセス送信は,コミット送信と同様に,トランザクションの同期点処理(コミット)時にサービス要求を有効にし,メッセージを送信します。このメッセージの送信は,クライアントUAPとは別スレッドで実行されます。

ネームサービスの使用時に自プロセス送信をする場合は,ee_rpc_cmtsend関数のflagsにEERPC_CMTSEND_MYPROCを指定してください。指定しないと,他プロセスにメッセージが送信されることがあります。

自プロセス送信の流れを次の図に示します。

図2‒14 自プロセス送信

[図データ]