web-dev-qa-db-ja.com

RPC風のアプローチがRESTより適切なのはいつですか?

この話を見て REST、再利用、セレンディピティ スティーブヴィノスキによる、greenfieldプロジェクトにビジネスケースがあるかどうか疑問に思います(XML-)RPC-ish設定、RESTはより良い方法で解決できませんでした。

彼が言及するいくつかのRPC問題:

  • 言語に焦点を合わせる(分散システムを言語に適合させる。その逆ではない)
  • 「ローカルに見えるようにする」(そして、ルールではなく例外として障害とレイテンシに対処します)
  • 言語に依存しないことを意図していますが、主要な要素として、言語間の「関数呼び出し」がまだあります
  • [〜#〜] idl [〜#〜] ボイラープレート
  • タイプセーフティの錯覚
  • そしてもう少し...

少しドラマ化するために、RPCとRESTのGoogleインスタント結果をいくつか示します。

RPC

REST

34
miku

一般に、RPCはRESTよりもはるかに多くの言語統合を提供します。あなたが述べたように、これは、特に単一の分散システムが複数の言語で書かれたコードを実行する複数のホストを含​​む場合、規模、エラー処理、タイプセーフなどの面で多くの問題を伴います。ただし、RPC、REST、およびその両方を同時に使用するビジネスシステムを記述した後、RESTの場合よりもRPCを選択することにはいくつかの正当な理由があることがわかりました。

以下は、RPCの方が適しているとわかった場合です。

  • 密結合システムの(分散)コンポーネントは連携して動作するように設計されており、1つを変更すると他のすべてに影響を与える可能性があります。将来、コンポーネントを他のシステムと通信するように適合させる必要があるとは考えられません。
  • 信頼性の高い通信。コンポーネントは、完全に同じホスト上で、または遅延の問題、パケット損失などが発生する可能性が低いネットワーク上で相互に通信します。(これは、ただし、これらのケースを処理するシステム)
  • 統一言語。すべて(またはほとんどすべて)のコンポーネントは単一の言語で記述されます。別の言語で記述されたコンポーネントが将来追加される可能性は低いです。

IDLに関するポイントについては、RESTシステムでは、REST要求と応答のデータを、内部データ表現に変換するコードを記述する必要があります。 IDLソース(適切なコメント付き)は、REST APIに対して個別に作成および保守する必要があるインターフェースのドキュメントとしても機能します。

上記の3つの項目は、より大きなシステムの1つのコンポーネントを構築しようとしているときによく発生します。私の経験では、これらのコンポーネントは多くの場合、それらのサブシステムが独立して障害を起こし、他のサブシステムまたはコンポーネント全体の全体的な障害を引き起こさないようにする必要があるコンポーネントです。多くのシステムは、これらの目標を達成するためにErlangで記述されており、場合によっては、他の言語でシステムを記述し、RPCを使用してこれらの利点を得るためにErlangを選択する方がよい場合があります。

ほとんどのエンジニアリング問題と同様に、プロセス間通信の問題に対する単一の解決策はありません。設計しているシステムを見て、ユースケースに最適な選択をする必要があります。

20
ndm

あなたは実際に両方を持つことができます。 RestRPC for Grailsのようなプラグインは、メソッドへの呼び出しをインターセプトし、それらを安静に処理しながら、必要な数だけ(RPCのように)使用できるようにするアノテーションを提供します。

1
orubel

RESTにはいくつかの主要な利点があります。製品がデータセンター全体に拡大され、高可用性と負荷分散を行っている場合です。

ただし、小規模なプロジェクトについて考えてみてください。 1時間に数百のリクエストがあるWebサービスが必要ですか? WCFはすべてのトランスポート問題を扱います。ネットワークを介してオブジェクトを送信するための便利なインターフェイスを備えており、application.configファイルのみを使用して、プログラミングなしでネットワーク接続を構成、暗号化、認証できます。

1
Michael Shaw