リモートプロシージャコール

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

分散コンピューティングは、リモートプロシージャコールRPC)は、コンピュータプログラムがプロシージャ(サブルーチン)を別のアドレス空間(通常は共有ネットワーク上の別のコンピュータ)で実行する場合であり、通常の(ローカル)プロシージャコール。プログラマがリモートインタラクションの詳細を明示的にコーディングする必要はありません。つまり、プログラマーは、サブルーチンが実行中のプログラムに対してローカルであるかリモートであるかにかかわらず、本質的に同じコードを記述します。これはクライアントとサーバーの相互作用の形式であり(呼び出し元はクライアント、実行者はサーバー)、通常は要求と応答のメッセージパッシングシステムを介して実装されます。オブジェクト指向プログラミングパラダイムでは、RPCは次のように表されます。リモートメソッド呼び出し(RMI)。RPCモデルは、ロケーションの透過性のレベルを意味します。つまり、呼び出し手順はローカルでもリモートでもほぼ同じですが、通常は同一ではないため、ローカル呼び出しとリモート呼び出しを区別できます。リモートコールは通常、ローカルコールよりも桁違いに遅く、信頼性が低いため、それらを区別することが重要です。

RPCは、プロセス間通信(IPC)の一種であり、プロセスごとにアドレススペースが異なります。同じホストマシン上にある場合、物理アドレススペースが同じであっても、仮想アドレススペースは異なります。一方、それらが異なるホスト上にある場合、物理アドレス空間は異なります。この概念を実装するために、多くの異なる(多くの場合互換性のない)テクノロジーが使用されてきました。

歴史と起源

要求/応答プロトコルは1960年代後半の初期分散コンピューティングにまでさかのぼり、ネットワーク操作のモデルとしてのリモートプロシージャコールの理論的提案は1970年代にさかのぼり、実際の実装は1980年代初頭にさかのぼります。ブルース・ジェイ・ネルソンは、1981年に「リモートプロシージャコール」という用語を作り出したと一般に信じられています。[1]

最新のオペレーティングシステムで使用されているリモートプロシージャコールは、プロセスの同期に要求/応答通信プロトコルを使用したRC4000マルチプログラミングシステム[2]にそのルーツをたどります。[3]ネットワーク操作をリモートプロシージャコールとして扱うという考えは、初期のARPANETドキュメントでは少なくとも1970年代にまでさかのぼります。[4] 1978年、Per Brinch Hansenは、プロセス間のプロシージャ呼び出しで構成される「外部要求」に基づく分散コンピューティング用の言語である分散プロセスを提案しました。[5]

最も初期の実用的な実装の1つは、1982年にBrianRandellとその同僚によるUNIXマシン間のNewcastle接続でした。 [6]これに続いて、XeroxPARCの杉環境でAndrewBirrell とBruceNelsonによる「Lupine」が続きました[7] [8] [9] Lupinは自動的にスタブを生成し、タイプセーフなバインディングを提供し、通信に効率的なプロトコルを使用しました。[8] RPCの最初のビジネス用途の1つは、1981年に「Courier」という名前でXeroxによって使用されました。UnixでのRPCの最初の一般的な実装は、 SunのRPCでした。(現在はONC RPCと呼ばれています)。ネットワークファイルシステム(NFS)の基盤として使用されます。

1990年代には、オブジェクト指向プログラミングの人気により、 Common Object Request Broker Architecture(CORBA、1991)やJavaリモートメソッド呼び出しなど、リモートメソッド呼び出し(RMI)の代替モデルが広く実装されましたRMIは、特に2000年代に、インターネットの台頭とともに人気が低下しました。

メッセージパッシング

RPCは、要求と応答のプロトコルです。RPCはクライアントによって開始され、クライアントは既知のリモートサーバーに要求メッセージを送信して、指定されたパラメーターを使用して指定されたプロシージャを実行します。リモートサーバーはクライアントに応答を送信し、アプリケーションはそのプロセスを続行します。サーバーが呼び出しを処理している間、クライアントはXMLHttpRequestなどの非同期要求をサーバーに送信しない限り、ブロックされます(サーバーが処理を終了するまで待機してから実行を再開します) 。さまざまな実装には多くのバリエーションと微妙な点があり、その結果、さまざまな(互換性のない)RPCプロトコルが発生します。

リモートプロシージャコールとローカルコールの重要な違いは、予測できないネットワークの問題が原因でリモートコールが失敗する可能性があることです。また、呼び出し元は通常、リモートプロシージャが実際に呼び出されたかどうかを知らずに、このような障害に対処する必要があります。べき等プロシージャ(複数回呼び出されても追加の効果がないプロシージャ)は簡単に処理できますが、リモートプロシージャを呼び出すコードは、慎重に記述された低レベルのサブシステムに限定されることが多いため、十分な問題が残っています。

イベントのシーケンス

  1. クライアントはクライアントスタブを呼び出します。この呼び出しはローカルプロシージャコールであり、パラメータは通常の方法でスタックにプッシュされます。
  2. クライアントスタブパラメータをメッセージにパックし、システムコールを実行してメッセージを送信します。パラメータのパッキングはマーシャリングと呼ばれます。
  3. クライアントのローカルオペレーティングシステムは、クライアントマシンからサーバーマシンにメッセージを送信します。
  4. サーバーマシンのローカルオペレーティングシステムは、着信パケットをサーバースタブに渡します。
  5. サーバースタブは、メッセージからパラメーターを解凍します。パラメータの解凍は、アンマーシャリングと呼ばれます。
  6. 最後に、サーバースタブはサーバープロシージャを呼び出します。応答は、逆方向に同じステップをトレースします。

標準の接触メカニズム

さまざまなクライアントがサーバーにアクセスできるようにするために、いくつかの標準化されたRPCシステムが作成されています。これらのほとんどは、インターフェイス記述言語(IDL)を使用して、さまざまなプラットフォームでRPCを呼び出せるようにします。次に、IDLファイルを使用して、クライアントとサーバー間のインターフェイスとなるコードを生成できます。

アナログ

注目すべきRPCの実装と類似物は次のとおりです。

言語固有

  • JavaJavaRemote Method Invocation(Java RMI)APIは、標準のUnixRPCメソッドと同様の機能を提供します。
  • Goは、非同期呼び出しをサポートするRPCを実装するためのパッケージrpcを提供します。
  • JavaのRMIの基礎となったModula-3のネットワークオブジェクト[10]
  • RPyCは、非同期呼び出しをサポートするRPCメカニズムをPythonで実装します。
  • 分散Ruby(DRb)を使用すると、Rubyプログラムは同じマシン上またはネットワーク上で相互に通信できます。DRbは、リモートメソッド呼び出し(RMI)を使用して、プロセス間でコマンドとデータを渡します。
  • Erlangはプロセス指向であり、ノードとローカルプロセス間でのメッセージパッシングを介して配布とRPCをネイティブにサポートします。
  • ElixirはErlangVMの上に構築されており、エージェントとメッセージパッシングを介して、同じネットワークのプロセス通信(OSプロセスではなくElixir / Erlangプロセス)をすぐに使用できます。

アプリケーション固有

一般

  • NFS(ネットワークファイルシステム)は、RPCの最も著名なユーザーの1つです
  • SunMicrosystemsによるOpenNetwork Computing Remote Procedure Call
  • D-BusオープンソースIPCプログラムは、 CORBAと同様の機能を提供します
  • SORCERは、フェデレーションメソッド呼び出し用のAPIと労作指向言語(EOL)を提供します
  • XML-RPCは、 XMLを使用して呼び出しをエンコードし、HTTPをトランスポートメカニズムとして使用するRPCプロトコルです。
  • JSON-RPCは、 JSONでエンコードされたメッセージを使用するRPCプロトコルです。
  • JSON-WSPは、 JSONでエンコードされたメッセージを使用するRPCプロトコルです。
  • SOAPはXML-RPCの後継であり、XMLを使用してHTTPベースの呼び出しをエンコードします。
  • ZeroCインターネット通信エンジン(Ice)分散コンピューティングプラットフォーム。
  • ネットワークサービスを構築するためのエッチングフレームワーク。
  • ApacheThriftプロトコルとフレームワーク。
  • CORBAは、オブジェクトリクエストブローカと呼ばれる中間層を介してリモートプロシージャコールを提供します
  • Libeventは、RPCサーバーとクライアントを作成するためのフレームワークを提供します。[11]
  • Windows Communication Foundationは、接続されたサービス指向アプリケーションを構築するための.NETFrameworkのアプリケーションプログラミングインターフェイスです。
  • Microsoft .NET Remotingは、Windowsプラットフォームに実装された分散システム用のRPC機能を提供します。WCFに取って代わられました
  • Microsoft DCOMは、 DCE / RPCに基づくMSRPCを使用します
  • Open Software Foundation DCE / RPC分散コンピューティング環境(これもMicrosoftによって実装されています)。
  • Google Protocol Buffers(protobufs)パッケージには、 2015年にgRPCとしてオープンソース化されたRPCプロトコル[12]に使用されるインターフェース定義言語が含まれています。[13]
  • WAMPは、RPCとパブリッシュ/サブスクライブを単一のトランスポートに依存しないプロトコルに結合します。
  • Google Web Toolkitは、非同期RPCを使用してサーバーサービスと通信します。[14]
  • Apache Avroは、接続ハンドシェイクおよびコード生成でクライアントとサーバーがスキーマを交換する必要がないRPCを提供します。
  • 組み込みRPCは、NXPによって開発された軽量RPC実装であり、プライマリCortexMコアを対象としています。
  • KF Trusted Execution Environmentは、プロキシとオブジェクトマーシャリングを使用して、サンドボックス間でオブジェクトを通信します
  • msgpack-rpcは、 MessagePackを使用してデータをシリアル化する軽量のRPC実装です。テキストエディタNeovimで使用されます。

も参照してください

参考文献

  1. ^ ブルース・ジェイ・ネルソン(1981年5月)。リモートプロシージャコールPARC CSL-81-9(CMU-CS-81-119も)ゼロックスパロアルトリサーチセンター。博士論文。
  2. ^ 「パーブリンチハンセン•IEEEコンピュータソサエティ」www.computer.org 2015年12月15日取得
  3. ^ ブリンチ・ハンセン、パー(1969)。RC 4000コンピュータソフトウェア:マルチプログラミングシステム(PDF)デンマーク、コペンハーゲン:Regnecentralen。
  4. ^ ジェームズE.ホワイト(1975年12月23日)。「ネットワークベースのリソース共有のための高レベルのフレームワーク」RFC707オーグメンテイション研究センター2011年7月11日取得
  5. ^ パー・ブリンチ・ハンセン(1978年11月)。「分散プロセス:並行プログラミングの概念」(PDF)ACMの通信21(11):934–941。CiteSeerX10.1.1.107.3108_ 土井10.1145 /359642.359651  
  6. ^ ブラウンブリッジ、デビッドR。; マーシャル、リンゼイF。; ランデル、ブライアン(1982)。「ニューカッスルコネクション」(PDF)ソフトウェア:実践と経験12(12):1147–1162。土井10.1002 /spe.43801212062016年8月16日にオリジナル(PDF)からアーカイブされました2016年8月16日取得
  7. ^ Birrell、Andrew D。; ネルソン、ブルースジェイ(1984)。「リモートプロシージャコールの実装」(PDF)コンピュータシステムでのACMトランザクション2:39–59。土井10.1145 /2080.357392
  8. ^ a b "1994 – Andrew Birrell、Bruce Nelson:リモートプロシージャコール"ソフトウェアシステム賞の引用コンピューティングマシナリー協会2012年4月2日にオリジナルからアーカイブされました2011年7月11日取得
  9. ^ 「SIGOPS殿堂賞」オペレーティングシステムに関する分科会コンピューティングマシナリー協会2011年7月11日取得
  10. ^ プログラミング言語のAZ:Modula-3-プログラミング言語のAZ 2009-01-05にウェイバックマシンでアーカイブされました。Computerworld。2013年7月17日に取得。
  11. ^ libevent:メインページMonkey.org。2013年7月17日に取得。
  12. ^ 「プロトコルバッファ-Googleのデータ交換フォーマット」Googleプロジェクトのウェブサイト2011年11月1日取得
  13. ^ 「gRPCオープンソースユニバーサルRPCフレームワーク」Googleプロジェクトのウェブサイト2016年9月7日取得
  14. ^ 「GoogleWebToolkit」Googleプロジェクトのウェブサイト2011年11月1日取得

外部リンク