2.1.5 非同期応答型RPC
サーバUAPの処理結果をクライアントUAPに返すRPCです。クライアントUAPでは,サーバUAPの処理結果を待たないで処理を続行し,サーバUAPの処理結果を非同期で受信します。
非同期応答型RPCを次の図に示します。
非同期応答型RPCは時間監視をします。監視時間内に応答が返らない場合はエラーリターンします。
- 〈この項の構成〉
(1) TP1/EEがサーバUAPの場合の非同期応答型RPC
サーバUAP(TP1/EE)では,クライアントUAP(TP1/Server Base)からのメッセージを受信するための受信スレッドは,自ポート番号ごとに存在します。
クライアントUAPからのメッセージの受信には,ソケットAPI(TCP/IPソケットインタフェース)が使用されます。
サービスは,受信したメッセージ中のサービス名を基に処理キューに登録されます。処理キューに登録されたサービスは,処理スレッドによって引き出され,ユーザデータをサーバUAPに引き渡します。
サーバUAPの処理終了後,ソケットAPIを使用してRPC応答メッセージをクライアントに送信します。
TP1/EEが非同期応答型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の送信形態は,クライアントUAPからの要求を受けて即時にメッセージ送信を行う即時送信(TP1/Server Baseのdc_rpc_call関数またはdc_rpc_call_to関数と同じ形態)です。
クライアント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がee_rpc_poll_any_replies関数を発行することによって,RPC応答メッセージを受信します。
即時送信の流れを次の図に示します。
- 非同期応答型RPCの時間監視
-
非同期応答型RPCの場合,ee_rpc_poll_any_replies関数で時間監視します。RPC関連定義のwatch_timeオペランドに指定した監視時間,またはee_rpc_set_watch_time関数で指定した監視時間は無視されます。
(3) エラーが発生した非同期応答型RPC要求の記述子の取得
エラーが発生した非同期応答型RPC要求に対応する記述子は,ee_rpc_get_error_descriptor関数で取得します。非同期応答の記述子を取得できるのは,サーバUAP側でエラーが発生した場合だけです。ee_rpc_get_error_descriptor関数の呼び出し側でエラーが発生した場合は,非同期応答の記述子を取得できません。