1 回の High-speed Service Framework (HSF) 呼び出しでは、HSF コンシューマーがネットワーク経由で HSF プロバイダーにリクエストを送信し、プロバイダーがターゲットメソッドを実行し、その結果がコンシューマーに返されます。このプロセスには、複数のスレッドと HSF プロトコルに固有のいくつかのドメインオブジェクトが関与します。
この呼び出しフローを理解することは、遅延問題のデバッグ、スレッドダンプの解釈、およびご利用の Enterprise Distributed Application Service (EDAS) アプリケーションで障害が発生する箇所を特定するのに役立ちます。
呼び出しフローの概要
HSF 呼び出しには 3 つのフェーズがあります:
クライアント側の準備 (ステップ 1~3) -- クライアントスレッドがリクエストをシリアル化し、エンコーディングと送信のために I/O スレッドに渡します。
サーバー側の処理 (ステップ 4~8) -- プロバイダーの I/O スレッドが受信データをデコードし、HSF サーバースレッドがリフレクションを介してターゲットメソッドを実行し、応答をシリアル化してエンコードします。
応答の返却 (ステップ 9~11) -- エンコードされた応答がコンシューマーに返され、I/O スレッドがそれをデコードし、クライアントスレッドが結果を逆シリアル化します。
次の図は、11 ステップからなる完全なプロセスを示しています。

スレッドモデル
すべての HSF 呼び出しには、3 種類のスレッドが関与します:
| スレッド | 役割 |
|---|---|
| クライアントスレッド | コンシューマー側で呼び出しを開始します。リクエストパラメーターをシリアル化し、応答を待機し、結果を逆シリアル化します。 |
| I/O スレッド | 両側でネットワーク通信を処理します。アウトバウンドオブジェクトをバイナリコンテンツにエンコードし、インバウンドバイナリコンテンツを通信オブジェクトにデコードします。 |
| HSF サーバースレッド | プロバイダー側でリクエストを処理します。リクエストを逆シリアル化し、ターゲットメソッドを呼び出し、応答をシリアル化します。 |
この分離により、実行の遅いメソッドが他の同時呼び出しのネットワーク I/O をブロックすることや、ネットワーク遅延や輻輳がビジネススレッドプールを枯渇させることが防止されます。
ドメインオブジェクト
HSF は、ユーザーデータとプロトコルメタデータを分離するために、2 つのレイヤーのオブジェクトを使用します:
| オブジェクト | 目的 |
|---|---|
| リクエストオブジェクト | リクエストパラメーター、つまり実際のメソッドの引数を含みます。 |
| リクエスト通信オブジェクト | リクエストオブジェクトをラップする HSF プロトコルのラッパーです。リクエスト ID などのプロトコルレベルのメタデータを含みます。 |
| 応答オブジェクト | メソッドの戻り値を含みます。 |
| 応答通信オブジェクト | 応答オブジェクトをラップする HSF プロトコルのラッパーです。復路のためのプロトコルレベルのメタデータを含みます。 |
この 2 レイヤー設計により、HSF はユーザーデータを変更することなく、ルーティング、トレース、およびプロトコル情報をアタッチできます。問題をデバッグする際、この区別は、問題がビジネスロジック (リクエスト/応答オブジェクト) にあるのか、プロトコルレイヤー (通信オブジェクト) にあるのかを判断するのに役立ちます。
詳細なステップバイステップのフロー
フェーズ 1:クライアント側の準備 (ステップ 1~3)
| ステップ | 内容 |
|---|---|
| 1 | クライアントスレッドはリクエストパラメーターをリクエストオブジェクトにシリアル化し、それをリクエスト通信オブジェクトでラップします。通信オブジェクトは HSF プロトコルに従い、リクエスト ID などのメタデータを含みます。 |
| 2 | クライアントスレッドはリクエスト通信オブジェクトを I/O スレッドに送信し、I/O スレッドはそれをバイナリコンテンツにエンコードします。 |
| 3 | I/O スレッドはエンコードされたバイナリコンテンツを HSF プロバイダーに送信します。クライアントスレッドはブロックされ、応答を待ちます。 |
フェーズ 2:サーバー側の処理 (ステップ 4~8)
| ステップ | 発生内容 |
|---|---|
| 4 | HSF プロバイダーの I/O スレッドはバイナリコンテンツを受信してリクエスト通信オブジェクトにデコードし、そのオブジェクトを HSF サーバースレッドに送信します。 |
| 5 | サーバースレッドはリクエスト通信オブジェクトを逆シリアル化して、元のリクエストオブジェクトを復元します。 |
| 6 | サーバースレッドはリフレクション呼び出しを介してターゲットメソッドを呼び出し、応答オブジェクトを取得します。 |
| 7 | サーバースレッドは応答オブジェクトをシリアル化し、それを応答通信オブジェクトでラップします。 |
| 8 | サーバースレッドは応答通信オブジェクトを I/O スレッドに送信し、I/O スレッドはそれをバイナリコンテンツにエンコードします。 |
フェーズ 3:応答の返却 (ステップ 9~11)
| ステップ | 何が起こるか |
|---|---|
| 9 | HSF プロバイダーの I/O スレッドは、エンコードされたバイナリコンテンツを HSF コンシューマーに返送します。 |
| 10 | HSF コンシューマーの I/O スレッドはバイナリコンテンツを受信し、それを応答通信オブジェクトにデコードして、ブロックされていたクライアントスレッドを再開させます。 |
| 11 | クライアントスレッドは応答通信オブジェクトを逆シリアル化して応答オブジェクトを抽出します。呼び出し元が結果を受け取り、リモート呼び出しが完了します。 |
設計の論理的根拠
シリアル化とエンコーディング
HSF はアウトバウンドデータに 2 つの異なる変換を適用します:
シリアル化は、オブジェクト (リクエストまたは応答オブジェクト) を、通信オブジェクトに含めるのに適したバイトストリーム形式に変換します。
エンコーディングは、プロトコルメタデータを含む完全な通信オブジェクトを、ネットワーク送信用にバイナリコンテンツに変換します。
受信側では、デコーディングがバイナリコンテンツから通信オブジェクトを再構築し、逆シリアル化が通信オブジェクトから元のオブジェクトを抽出します。
これらのステップを分離することで、HSF はワイヤープロトコルのエンコーディングとは独立してシリアル化フォーマットを交換できます。
I/O スレッドとビジネススレッドの分離
I/O スレッドはネットワークの読み取り、書き込み、エンコーディング、デコーディングを処理します。HSF サーバースレッドは逆シリアル化とメソッドの呼び出しを処理します。この分離には 2 つの利点があります:
実行の遅いビジネスメソッドが、他の同時呼び出しのネットワーク I/O をブロックしません。
ネットワークの遅延や輻輳が、ビジネススレッドプールを枯渇させません。
コンシューマー側での同期ブロッキング
標準的な同期 HSF 呼び出し中、クライアントスレッドはステップ 3 でブロックされ、ステップ 10 で I/O スレッドによって再開されるまで待機します。合計ブロッキング時間には、ネットワークのラウンドトリップ遅延、サーバー側の処理時間、および両側でのシリアル化/エンコーディングのオーバーヘッドが含まれます。