遠隔手続き呼出し(RPC)とは
遠隔手続き呼出し(Remote Procedure Call、RPC)とは、プログラムが別のコンピュータ上の
サブルーチンや手続きを実行するための技術です。ネットワークを介して異なるアドレス空間にあるプログラムを呼び出す際に、ネットワークの複雑な処理を隠蔽し、あたかもローカルの関数を呼び出すかのようにプログラミングできます。
RPCの基本
RPCの主な目的は、分散環境で動作するアプリケーションを開発する際の複雑さを軽減することです。開発者は、リモートの処理を意識することなく、ローカルの関数呼び出しと同じようにプログラムを記述できます。これにより、分散システムの開発が効率的になり、保守性も向上します。
オブジェクト指向プログラミングの文脈では、RPCはリモート呼び出し(Remote Invocation)やリモートメソッド呼び出し(Remote Method Invocation、RMI)と呼ばれることもあります。
Java RMIなどがその例です。
RPCの起源と歴史
RPCの概念は古く、1976年に発表されたRFC 707まで遡ります。最初に商用化されたのは、1981年の
ゼロックスの「Courier」でした。その後、
UNIX環境で広く使われるようになったのは、
サン・マイクロシステムズのONC RPCです。これはNFS(ネットワークファイルシステム)の基盤として利用され、現在でも広く使われています。
アポロコンピュータのNetwork Computing System (NCS)も初期のRPC実装の一つです。NCSは後にOSFのDCE(分散コンピューティング環境)でDCE/RPCの基盤となりました。MicrosoftはDCE/RPCを基盤としてMSRPCを開発し、DCOMの実装に使用しました。また、1990年代には、
パロアルト研究所のILUやObject Management GroupのCORBAといった分散オブジェクト向けのRPCパラダイムも登場しました。
RPCの動作原理
RPCクライアントは、呼び出す手続きと引数をメッセージとしてリモートサーバに送信します。同期型のRPCでは、クライアントはサーバからの応答があるまで待機し(ブロック)、応答を受け取ると処理を続行します。一方、非同期型のRPCでは、クライアントは呼び出し後すぐに次の処理に進むことができ、サーバからの応答はコールバックで通知されます。
同期型RPCは、サーバやネットワークが遅い場合、大量のデータを転送する場合には問題が生じることがありますが、非同期型RPCはこれらの問題を解決できます。
RPCの課題
RPCは通常のローカル呼び出しとは異なり、ネットワークの問題で失敗することがあります。また、手続きが実際に実行されたかどうかをクライアントが確認できない場合もあります。このような状況に対応するため、低レベルのサブシステムで制限付きで呼び出しを実行したり、タイムアウトを設定して例外をスローしたりするなどの対策が講じられます。
標準コンタクト機構
標準RPCシステムでは、インタフェース記述言語(IDL)を用いて、異なるプラットフォーム間でのRPCを可能にしています。IDLファイルからクライアントとサーバ間のインタフェースコードが生成され、これによりプラットフォーム間の相互運用性が確保されます。RPCGENなどのツールが、このコード生成に用いられます。
RPCの技術および規格
RPCにはさまざまな技術と規格が存在します。
Java RMI: JavaのAPIで、標準的なUNIX RPCと同等の機能を提供します。
XML-RPC: XMLで呼び出しを符号化し、HTTPを通信プロトコルとして使用するRPCプロトコルです。
DCOM: MicrosoftのCOMベースの分散型オブジェクト指向RPC技術ですが、現在では非推奨です。
.NET Remoting: Windowsプラットフォーム上でRPC機能を提供しますが、こちらも非推奨のレガシー技術です。
WCF: .NET Remotingの代替となるRPC機構であり、.NET Framework 3.0で導入されましたが、.NET Coreへの完全移植はされていません。
-RPC: を符号化に用いるシンプルなRPCプロトコルです。
*
gRPC: Googleが開発した、Protocol Buffersと
HTTP/2|HTTP_2を使用した比較的新しいRPCフレームワークです。
まとめ
RPCは、分散システムを構築する上で重要な技術であり、様々な実装が存在します。それぞれの技術には特性があり、特定の用途に適したものが存在します。システムの要件に応じて適切なRPC技術を選択することで、効率的で信頼性の高い分散システムを構築できます。