RPC概論

1.RPCとは何か?

RPCとは、Remote Procedure Callの略です。簡単に説明すると、プログラミングでのメソッド呼び出しを、同一プロセス内ではなく、別のプロセス(通常、別サーバ上)に対して行うものを指しています。RPCの考え方自体は1976年頃には既に存在しているもので、特に意識せず皆さんも使っているものかもしれません。

2.RESTとRPCとの違いは?

RESTとRPCの一番大きな違いは、RPCはあくまで別環境のメソッドの呼び出しを行うものでしかないという点です。RESTの場合はROA(リソース指向アーキテクチャ)であり、特定のリソースに対するCURD操作を行うという思想が前提になります。RESTでインタフェースを考える場合には、ROAに従うべきであるため、システムによってはその縛りで逆に設計が辛くなる場合もあるかと思います。(古い設計思想のシステムを大きく変えずに更改したい場合などは、RESTが向かない場合もあるので)

RPCの場合は、単純なメソッド呼び出しで、その呼出先が別の環境(別サーバ、別プロセス)である為、特に大きな縛りは有りません。なので、RESTの導入にREST特有の考え方が原因で障壁がある場合などには、RPCの導入を検討する余地もあるかもしれません。

3.代表的なRPCについ

・CORBA
Common Object Request Broker Architectureの略です。異なるプログラミング言語間でのメソッドの相互利用を可能にする、分散オブジェクトの標準規格です。主な特徴としては、メソッド呼び出しに必要なIFの記述にインタフェース記述言語(IDL)を用いる事が挙げられます。IDLでインタフェース定義を記述した後に、IDLから各言語用のソースコードを生成する事が可能で、通信部分について詳細に理解せずともRPCを実現する事が可能です。また、CORBAはあくまで規格なので、規格を満たした多くの実装が存在しています(VisiBroker,Orbit,JacORBなど)。

JavaなどではJava11以降でCORBAサポートが打ち切られているなど、レガシーな規格という印象です。しかし、一部のプロジェクトなどではまだ利用されているようです。

・Java RMI
Javaプログラム間でのメソッド呼び出しを行うためのものです。CORBAに似た分散オブジェクト思想を持つものですが、Javaに限定されている為、IDLの定義は不要です。Javaのみの環境で簡易なクライアントサーバモデルのシステムを作る場合などには検討の余地がある方式です。

・XML-RPC(JSON-RPC)
エンコードにXMLを利用し、HTTPで転送を行うプロトコルです。
非常に単純な仕様のプロトコルであり、規格書の内容はA4用紙で2枚に纏められる程度のものになっています。
後にXML-RPCをベースに様々な機能を追加したものがSOAPです。
SOAPほどの高機能が不要な場合は、こちらの利用も検討の余地有りかと思います。

また、エンコードにJSONを利用する場合はJSON-RPCと呼称する。

・SOAP
RESTの隆盛以前のWebAPIのデファクトスタンダードであったプロトコルです。XMLでエンコードしたメッセージを、主にHTTPかSMTPプロトコルで伝送しています。IDLに似たインタフェース記述言語で、WSDLという記述言語が存在しています。

特徴としては以下の3点があります。

① 拡張性(WS-*という関連プロトコルなどで機能を必要に応じて拡張する事ができる)
② 中立性(HTTPに限らず、SMTP,TCP,UDPなど様々なプロトコルで運用可能)
③ 独立性(単なるRPCなのでプログラミングモデルに依存しない)

現在ではRESTが大多数を占めており、SOAPで新規にAPIを実装するようなことは少なくなっています。

・gRPC
Googleが社内で利用していたRPCプロトコルを元に公開されたプロトコルです。特徴としてはProtocolBuffersというシリアライズ方式を用いて、高速な通信を実現できる点です。環境などにもよりますが、RESTに比べて大体2~3倍ほど高速なようです。また、対応言語も幅広くGo、C++、Java、Python、Ruby、Node.js、PHPなど一通りの言語に対応しています。IDLからソースを生成する方式ですが、IDL定義の可読性も高く、通信が高速である点から国内ではクックパッド、海外ではDropboxなどが採用しています。

4.まとめ

新規に作成するWebシステムであり、特に性能面の制約などがない場合は基本的にRESTで問題ありません。ただし、性能要件などでシビアな通信速度が求められる場合や、複数言語のプログラム間でIFする場合は、例えばgRPCなどが向いている場合などもあります。それぞれ特徴がありますので、RESTに限らず、条件や制約に適した方式を検討してみると良いかもしれません。もし新規にIFを実装するような事があった場合、本記事を切掛に、そのシステムに合ったRPCを検討していただければ幸いです。