RESTと従来のRPC/分散オブジェクト(RPC, CORBA, SOAP, etc.)の比較

REST

提唱者は Roy Fielding で、彼は既存の Web のソフトウェアアーキテクチャを分析し、アーキテクチャスタイルとしてまとめて REST (Representational State Transfer) と名づけた。

Roy Fielding は Apache httpd, libwww-perl などの実装を手がけ、Tim Berners-Lee らとともに HTTP 1.0/1.1 の策定に関与している。

REST とは次の6つを組み合わせたアーキテクチャスタイルである。

  1. クライアント/サーバ: ユーザインタフェースと処理を分離
  2. ステートレスサーバ: サーバ側でアプリケーション状態を持たない
  3. キャッシュ: クライアントとサーバの通信回数を減らす (粒度の大きなデータを一度に取得する)
  4. 統一インタフェース: インタフェースを固定する (HTTP、URIなどインタフェースの仕様が十分枯れている)
  5. 階層化システム: システムを階層に分離する
  6. コードオンデマンド: プログラムをクライアントにダウンロードして実行する (例: JavaScriptAdobe Flash、Javaアプレット)

REST の API は以下の3つの要素で表される。

  • リソース表現: URI
  • リソース状態: HTTP レスポンス
  • 転送方式: HTTP

RESTと従来のRPC/分散オブジェクト(RPC, CORBA, SOAP, etc.)の比較

RPCは Remote Procedure Call の略であることからわかるとおり、手続き(Procedure) = 関数をネットワーク越しに呼び出せるようにしたものである。古くは SunRPC、IBM と DEC による DCE、最近では XML-RPC などがある。
分散オブジェクトは、ネットワーク越しに(オブジェクト指向モデルの)オブジェクトを扱えるようにしたもの。CORBA、マイクロソフトの DCOM、JavaRMI、XML ベースの SOAPなどがある。

しかし、ネットワーク越しの関数/メソッド呼び出しのオーバヘッドは同一プロセス内、同一マシン内の呼び出しとは比べ物にならないほどオーバヘッドがあり(関数/メソッド呼び出しが戻るまでにかかる時間が長い)、通常の関数/メソッドの粒度で呼び出すと性能劣化を引き起こしてしまう。関数/メソッドからなる API をネットワーク越しに呼び出せるようにしただけでは実用にならないことがわかった。

RESTに基づいたWebサービスでは、RPC/分散オブジェクトの API でやりとりされる場合よりデータの粒度が大きいため、性能劣化が抑えられる。

またRPC/分散オブジェクトは API の仕様が変わると互換性が失われるため、既存のクライアントをすべて同時に更新しなければならない。これは Web のような大規模システムには向かない。

REST はインターフェースが固定されていること(たとえば、HTTP 1.1 は1999年以来変わっていない)や基本となる仕様(HTTP, URI, HTML, etc.)がシンプルであるため、Web のような大規模システムを実現できる。