リモート プロシージャ コール (RPC) を構築するための強力なテクニックです クライアントサーバーベースの分散アプリケーション 。これは、従来のローカル プロシージャ呼び出しを拡張することに基づいており、 呼び出されるプロシージャは、呼び出し元のプロシージャと同じアドレス空間に存在する必要はありません 。 2 つのプロセスは同じシステム上に存在することも、ネットワークで接続された異なるシステム上に存在することもできます。
リモート プロシージャ コールを行う場合:

1. 呼び出し環境は一時停止され、プロシージャのパラメータがネットワークを介してプロシージャが実行される環境に転送され、そこでプロシージャが実行されます。
PythonはJSONをファイルに保存します
2. プロシージャが終了して結果が生成されると、その結果は呼び出し環境に転送され、通常のプロシージャ呼び出しから戻ったかのように実行が再開されます。
注: RPC 特にクライアントサーバーに適しています (例: クエリー応答) 制御の流れによる相互作用 発信者と受信者を交互に切り替えます 。概念的には、クライアントとサーバーの両方が同時に実行されることはありません。代わりに、実行スレッドは呼び出し元から呼び出し先にジャンプし、その後再び戻ります。
RPCの仕組み

Javaでnullをチェックする
RPC 中に次の手順が実行されます。
- クライアントが呼び出します。 クライアントスタブプロシージャ 、通常の方法でパラメータを渡します。クライアント スタブは、クライアント自身のアドレス空間内に存在します。
- クライアントのスタブ マーシャル(パック) パラメータをメッセージに追加します。マーシャリングには、パラメーターの表現を標準形式に変換することと、各パラメーターをメッセージにコピーすることが含まれます。
- クライアント スタブはメッセージをトランスポート層に渡し、トランスポート層はメッセージをリモート サーバー マシンに送信します。
- サーバーでは、トランスポート層がメッセージをサーバー スタブに渡します。 デマーシャル(開梱) パラメータを指定し、通常のプロシージャ呼び出しメカニズムを使用して目的のサーバー ルーチンを呼び出します。
- サーバープロシージャが完了すると、サーバースタブに戻ります (例:通常のプロシージャコールリターン経由) 、戻り値をメッセージにマーシャリングします。次に、サーバー スタブはメッセージをトランスポート層に渡します。
- トランスポート層は結果メッセージをクライアント トランスポート層に送り返し、クライアント トランスポート層はメッセージをクライアント スタブに返します。
- クライアント スタブは戻りパラメータをデマーシャリングし、実行は呼び出し元に戻ります。
RPC システムの設計と実装に関する主な考慮事項は次のとおりです。
- セキュリティ: RPC にはネットワーク上の通信が含まれるため、セキュリティが大きな懸念事項となります。不正アクセスを防止し、機密データを保護するには、認証、暗号化、認可などの対策を実装する必要があります。スケーラビリティ: クライアントとサーバーの数が増加しても、RPC システムのパフォーマンスが低下してはなりません。負荷分散技術と効率的なリソース利用は、スケーラビリティにとって重要です。フォールト トレランス: RPC システムは、ネットワーク障害、サーバーのクラッシュ、その他の予期しないイベントに対する回復力を備えている必要があります。冗長性、フェイルオーバー、グレースフル デグラデーションなどの対策は、フォールト トレランスの確保に役立ちます。標準化: 利用可能な RPC フレームワークとプロトコルがいくつかありますが、さまざまなプラットフォームやプログラミング言語間での相互運用性と互換性を確保するには、標準化され広く受け入れられているものを選択することが重要です。パフォーマンスのチューニング: 最適なパフォーマンスを得るために RPC システムを微調整することが重要です。これには、ネットワーク プロトコルの最適化、ネットワーク経由で転送されるデータの最小化、RPC 呼び出しに関連する遅延とオーバーヘッドの削減などが含まれる場合があります。
RPC の問題 :
対処する必要がある問題:
1. RPC ランタイム:
RPC ランタイム システムは、RPC メカニズムの基礎となるネットワーク通信を処理するルーチンと一連のサービスのライブラリです。 RPC 呼び出しの過程で、クライアント側とサーバー側のランタイム システムのコード ハンドルが実行されます。 バインディング、適切なプロトコルを介した通信の確立、クライアントとサーバー間の通話データの受け渡し、通信エラーの処理を行います。
2. スタブ:
スタブの機能は次のとおりです。 プログラマが作成したアプリケーション コードに透明性を提供する 。
- クライアント側では、スタブはクライアントのローカル プロシージャ コールとランタイム システムの間のインターフェイスを処理し、データのマーシャリングとアンマーシャリング、RPC ランタイム プロトコルの呼び出し、および要求に応じてバインディング ステップの一部を実行します。 サーバー側では、スタブはランタイム システムとサーバーによって実行されるローカル マネージャー プロシージャとの間に同様のインターフェイスを提供します。
3. バインディング: クライアントは、誰に電話すればよいか、サービスがどこにあるかをどのようにして知るのでしょうか?
最も柔軟な解決策は、動的バインディングを使用し、RPC が最初に行われる実行時にサーバーを検索することです。クライアント スタブが初めて呼び出されるとき、ネーム サーバーに接続して、サーバーが存在するトランスポート アドレスを決定します。
バインディングは 2 つの部分で構成されます。
DFS vs BFS
- 私たちは:
- 場所を特定する:
- 提供するサービスを持つサーバーは、そのサービスのインターフェイスをエクスポートします。インターフェイスをエクスポートすると、インターフェイスがシステムに登録され、クライアントが使用できるようになります。 クライアントは、通信を開始する前に、(エクスポートされた) インターフェイスをインポートする必要があります。
4. RPC に関連付けられた呼び出しセマンティクス:
主に以下の選択肢に分類されます。
- 再試行リクエストメッセージ –
サーバーに障害が発生した場合、または受信者がメッセージを受信しなかった場合に、リクエスト メッセージの送信を再試行するかどうか。重複フィルタリング –
重複したサーバーリクエストを削除します。結果の再送信 –
サーバー側で操作を再実行せずに、失われたメッセージを再送信します。
利点:
- RPC が提供するのは 抽象化 つまり、ネットワーク通信のメッセージパッシングの性質はユーザーには隠されています。
- RPC では、パフォーマンスを向上させるためにプロトコル層の多くが省略されることがよくあります。プログラムは RPC を頻繁に呼び出す可能性があるため、たとえわずかなパフォーマンスの改善であっても重要です。
- RPC を使用すると、ローカル環境だけでなく分散環境でもアプリケーションを使用できるようになります。
- RPC コードを使用すると、コードの再書き込み/再開発の労力が最小限に抑えられます。
- RPC によってサポートされるプロセス指向モデルとスレッド指向モデル。
参考文献:
- https://web.cs.wpi.edu/~cs4514/b98/week8-rpc/week8-rpc.html
- https://users.cs.cf.ac.uk/Dave.Marshall/C/node33.html
- コンピュータ ネットワーク: FOROUZAN によるトップダウン アプローチ