分散コンピューティングにおいて、リモートプロシージャコール (RPC )とは、コンピュータプログラムが、現在のプロセスの異なるアドレス空間(通常は共有コンピュータネットワーク上の別のコンピュータ)でプロシージャ (サブルーチン)を実行させるアクションです。これは、プログラマがリモートインタラクションの詳細を明示的に記述することなく、通常の(ローカル)プロシージャコールであるかのように記述されます。つまり、サブルーチンが実行中のプログラムのローカルにあるかリモートにあるかにかかわらず、プログラマは基本的に同じコードを記述します。これは、通常、リクエスト/レスポンス型のメッセージパッシングシステムを介して実装される、サーバインタラクションの一形態です(呼び出し元はクライアント、実行元はサーバ)。オブジェクト指向プログラミングパラダイムでは、RPCはリモートメソッド呼び出し(RMI)によって表現されます。RPCモデルは、ある程度のロケーション透過性、つまり、呼び出し元のプロシージャはローカルかリモートかにかかわらずほぼ同じであることを意味しますが、通常は同一ではないため、ローカル呼び出しとリモート呼び出しを区別できます。リモート呼び出しは通常、ローカル呼び出しよりも桁違いに遅く、信頼性も低いため、これらを区別することが重要です。
RPC はプロセス間通信 (IPC) の一種であり、異なるプロセスは異なるアドレス空間を持ちます。同じホスト マシン上にある場合、物理アドレス空間は同じでも、仮想アドレス空間は異なります。一方、異なるホスト上にある場合は、物理アドレス空間も異なります。この概念を実装するために、さまざまな (多くの場合互換性のない) テクノロジーが使用されてきました。gRPC や Apache Thrift などの最新の RPC フレームワークは、 効率的 なバイナリ シリアライゼーション (プロトコル バッファなど)、HTTP/2 多重化、認証、負荷分散、ストリーミング、エラー処理などの機能の組み込みサポートを使用することで、基本的な RPC モデルを拡張し、スケーラブルなマイクロ サービスの構築や言語間の相互運用性の実現に適しています。[ 1 ]
歴史と起源 リクエスト・レスポンス・プロトコルは1960年代後半の初期の分散コンピューティングに遡り、ネットワーク操作のモデルとしてのリモートプロシージャコールの理論的提案は1970年代に遡り、実際の実装は1980年代初頭に遡ります。ブルース・ジェイ・ネルソンは1981年に「リモートプロシージャコール」という用語を造語したと一般的に考えられています。[ 2 ]
現代のオペレーティングシステムで使用されるリモートプロシージャコールは、プロセス同期に要求応答通信プロトコルを使用したRC 4000マルチプログラミングシステムにルーツがあります[ 3 ] 。 [ 4 ] ネットワーク操作をリモートプロシージャコールとして扱うという考え方は、少なくとも1970年代の初期のARPANET文書にまで遡ります[ 5 ] 。 1978年、Per Brinch Hansenは、プロセス間のプロシージャコールで構成される「外部要求」に基づく分散コンピューティング言語である分散プロセスを提案しました[ 6 ] 。
最も初期の実用的な実装の 1 つは、1982 年に Brian Randell と同僚が UNIX マシン間の Newcastle Connection で実装したものです。[ 7 ] これに続いて、Xerox PARC の Cedar 環境で Andrew Birrell と Bruce Nelson が「Lupine」を開発しました。[ 8 ] [ 9 ] [ 10 ] Lupine はスタブを自動的に生成し、型安全なバインディングを提供し、通信に効率的なプロトコルを使用しました。[ 9 ] RPC の最初のビジネス用途の 1 つは、1981 年に Xerox が「Courier」という名前で使用したものです。Unix 上で最初に普及した RPC の実装は Sun の RPC (現在は ONC RPC と呼ばれています) で、ネットワーク ファイルシステム (NFS) の基盤として使用されました。
1990年代、オブジェクト指向プログラミングの普及に伴い、CORBA(Common Object Request Broker Architecture、1991年)やJavaリモートメソッド呼び出しなど、リモートメソッド呼び出し(RMI)の代替モデルが広く実装されました。しかし、インターネットの普及、特に2000年代に入ると、RMIの人気は低下していきました。
メッセージパッシング RPCはリクエスト・レスポンスプロトコルです。RPCはクライアントによって開始され、クライアントは既知のリモート サーバー にリクエストメッセージを送信して、指定された手順をパラメータとともに実行します。リモートサーバーはクライアントにレスポンスを送信し、アプリケーションは処理を続行します。サーバーが呼び出しを処理している間、クライアントはブロックされます(サーバーの処理が完了するまで実行を再開しません)。ただし、クライアントがXMLHttpRequestなどの非同期リクエストをサーバーに送信した場合は例外です。 さまざまな実装には多くのバリエーションと微妙な違いがあり、結果としてさまざまな(互換性のない)RPCプロトコルが存在します。
リモートプロシージャコールとローカルコールの重要な違いは、リモートコールは予測不可能なネットワークの問題によって失敗する可能性がある点です。また、呼び出し側は通常、リモートプロシージャが実際に呼び出されたかどうかを知ることなく、そのような失敗に対処しなければなりません。冪等性 を持つプロシージャ(複数回呼び出しても追加の効果がないプロシージャ)は容易に処理できますが、それでもなお多くの困難が残るため、リモートプロシージャを呼び出すコードは、多くの場合、慎重に記述された低レベルの サブシステムに限定されます。
一連の出来事 クライアントはクライアントスタブを呼び出します。この呼び出しはローカルプロシージャ呼び出しであり、パラメータは通常の方法でスタックにプッシュされます。 クライアントスタブはパラメータをメッセージにパックし、システムコールを実行してメッセージを送信します。パラメータをパックする処理はマーシャリング と呼ばれます。 クライアントのローカルオペレーティングシステムは、クライアントマシンからサーバーマシンへメッセージを送信します。 サーバーマシン上のローカルオペレーティングシステムは、受信したパケットをサーバースタブに渡します。 サーバースタブはメッセージからパラメータを解凍します。パラメータの解凍はアンマーシャリングと呼ばれます。 最後に、サーバースタブがサーバープロシージャを呼び出します。応答では、同じ手順が逆方向に実行されます。
様々なクライアントがサーバーにアクセスできるようにするため、数多くの標準化されたRPCシステムが開発されてきました。これらのシステムのほとんどは、インターフェース記述言語 (IDL)を使用して、様々なプラットフォームからRPCを呼び出すことができます。そして、IDLファイルを使って、クライアントとサーバー間のインターフェースとなるコードを生成することが可能です。
類似品 注目すべきRPCの実装例および類似例には以下が含まれる。
言語固有の Javaのリモートメソッド呼び出し(Java RMI)APIは、標準的なUnix RPCメソッドと同様の機能を提供します。 Go言語は、非同期呼び出しをサポートするRPC実装用のパッケージrpcを提供しています。 Modula-3のネットワークオブジェクトはJavaのRMIの基礎となった[ 11 ] RPyCは、非同期呼び出しをサポートするRPCメカニズムをPythonで実装しています。 分散型Ruby(DRb)は、Rubyプログラムが同一マシン上またはネットワーク経由で相互に通信することを可能にします。DRbは、リモートメソッド呼び出し(RMI)を使用して、プロセス間でコマンドとデータをやり取りします。 Erlangはプロセス指向であり、ノード間およびローカルプロセス間でのメッセージパッシングを介した分散処理とRPCをネイティブにサポートしています。 Elixirは Erlangをベースに構築されています。エージェントとメッセージパッシングを介して、同一ネットワーク内のプロセス間通信(Elixir/Erlangプロセス間、OSプロセス間ではない)を標準で実現します。GoogleのRust RPCフレームワークであるTarpcは、protobufを使用する代わりに、Rustの構造体とトレイトを使用してメッセージの構造を開発者が定義できるようにします。[ 12 ]
アプリケーション固有 アクションメッセージフォーマット(AMF)を使用すると、Adobe Flexアプリケーションは、バックエンドやAMFをサポートする他のアプリケーションと通信できます。 リモート関数呼び出し(RFC)は、SAPシステム間の通信のための標準的なSAP インターフェースです。RFCは、リモートシステムで実行される関数を呼び出します。
一般的な NFS (ネットワークファイルシステム)は、RPCの最も著名なユーザーの一つである。サン・マイクロシステムズ社製オープン・ネットワーク・コンピューティングRPC(Sun RPCとも呼ばれる) D-Busは オープンソースのIPCプログラムであり、CORBAと同様の機能を提供する。SORCERは、フェデレーションメソッド呼び出しのためのAPIとエグゼキューション指向言語(EOL)を提供する。 XML-RPC は、呼び出しをエンコードするためにXMLを使用し、トランスポートメカニズムとしてHTTPを 使用するRPCプロトコルです。JSON-RPCは、 JSON形式 でエンコードされたメッセージを使用するRPCプロトコルです。JSON-WSP は、JSON-RPCに着想を得たRPCプロトコルです。SOAP はXML-RPCの後継であり、HTTPベースの呼び出しをエンコードするためにXMLを使用する。ZeroC のインターネット通信エンジン (ICE)分散コンピューティングプラットフォーム。 ネットワークサービス構築のためのEtchフレームワーク。 Apache Thrift プロトコルおよびフレームワーク。CORBAは 、オブジェクトリクエストブローカー と呼ばれる中間層を介してリモートプロシージャ呼び出しを提供します。Libeventは RPCサーバーとクライアントを作成するためのフレームワークを提供する。[ 13 ] Windows Communication Foundationは、.NETフレームワークにおけるアプリケーションプログラミングインターフェイスであり、接続されたサービス指向アプリケーションを構築するために用いられます。 Microsoft .NET Remotingは、Windowsプラットフォーム上で実装された分散システム向けにRPC機能を提供していました。現在はWCF に置き換えられています。 Microsoft DCOMは、DCE/RPCをベースとしたMSRPCを使用しています。 Open Software FoundationのDCE/RPC分散コンピューティング環境(マイクロソフトも実装)。 Google Protocol Buffers (protobufs) パッケージには、RPC プロトコルに使用されるインターフェース定義言語が含まれており[ 14 ]、 2015 年に gRPC としてオープンソース化されました。[ 1 ] WAMPは 、RPCとPublish-Subscribeを単一のトランスポートに依存しないプロトコルに統合したものです。Google Web Toolkit は非同期 RPC を使用してサーバー サービスと通信します。[ 15 ] Apache Avroは、クライアントとサーバーが接続ハンドシェイクでスキーマを交換したり、コード生成を必要としないRPCを提供します。
参考文献 1 2 「gRPC オープンソースのユニバーサル RPC フレームワーク」。Googleプロジェクト Web サイト 。2016年9 月 7 日 に取得。 ↑ ブルース・ジェイ・ネルソン (1981年5月)。 リモートプロシージャコール (博士論文)。ゼロックス・パロアルト研究所。PARC CSL-81-9(CMU-CS-81-119とも)。 ↑ 「ブリンチ・ハンセン氏による • IEEE コンピュータ協会」 。 www.computer.org 。 2015 年 12 月 15 日 に取得 。 ↑ ブリンチ・ハンセン、Per (1969)。 RC 4000 コンピュータ ソフトウェア: マルチプログラミング システム (PDF) 。デンマーク、コペンハーゲン: Regnecentralen。 ↑ James E. White (1975 年 12 月 23 日). 「ネットワークベースのリソース共有のための高レベルフレームワーク」 . RFC 707. Augmentation Research Center . doi : 10.17487/RFC0707 . 2011 年 7 月 11 日 取得 。 ↑ブリンチ ・ ハンセン、パー(1978年11月) 。 「 分散プロセス:並行プログラミングの概念」 ( PDF ) 。Communications of the ACM。21 ( 11): 934–941。CiteSeerX 10.1.1.107.3108。doi : 10.1145 / 359642.359651。S2CID 11610744 。 ↑ Brownbridge, David R.; Marshall, Lindsay F.; Randell, Brian (1982). "The Newcastle Connection" (PDF) . Software: Practice and Experience . 12 (12): 1147– 1162. doi : 10.1002/spe.4380121206 . S2CID 1840438 . 2016年8月16日に オリジナル (PDF) からアーカイブ済み. 2016年 8月16日 に取得 . ↑ Birrell, Andrew D.; Nelson, Bruce Jay (1984). "リモートプロシージャコールの実装" (PDF) . ACM Transactions on Computer Systems . 2 : 39– 59. doi : 10.1145/2080.357392 . S2CID 11525846 . 1 2 「1994 – Andrew Birrell、Bruce Nelson: Remote Procedure Call」 。 ソフトウェアシステム賞受賞理由 。Association for Computing Machinery 。 2012年4月2日に オリジナルからアーカイブ 。 2011年 7月11日 に取得。 ↑ 「SIGOPS殿堂入り賞」 。 オペレーティングシステムに関する特別利益団体 。Association for Computing Machinery 。 2011年 7月11日 取得 。 ↑ プログラミング言語のAZ: Modula-3 - プログラミング言語のAZ 2009年1月5日にWayback Machine に アーカイブされました。Computerworld。2013年7月17日に取得。 ↑ tarpc 、Google、2023年11月2日、 2023年11月2日 取得 ↑ libevent: メインページ。Monkey.org。2013年7月17日取得。 ↑ 「プロトコルバッファ - Googleのデータ交換フォーマット」 。Google プロジェクトウェブサイト。 2011年 11月1日 取得 。 ↑ 「Google Web Toolkit」 。Google プロジェクトのウェブサイト。 2011年 11月1日 取得 。
外部リンク RFC 9289 – リモートプロシージャコール暗号化のデフォルト化に向けて RFC 5531 - ONC RPCのバージョン2を規定(バージョン2として公開された3番目のRFC) RFC 1831 - ONC RPCのバージョン2を規定(2番目に公開されたRFCバージョン2) RFC 1057 - ONC RPCのバージョン2を規定(RFCバージョン2が最初に公開された) RFC 1050 - ONC RPCの最初のバージョン(最初に公開されたRFCバージョン)を規定する リモートプロシージャコール(RPC)— カーディフ大学のデイブ・マーシャル博士によるONC RPCに関するチュートリアル RPCプログラミング入門— SGI IRIXドキュメントからの、開発者向けのRPCおよびXDR入門。