web-dev-qa-db-ja.com

REST vs gRPC:どちらを選択するかはいつですか?

サービス指向アーキテクチャでgRPCを使用するソフトウェア組織が増えていますが、人々はまだRESTを使用しています。どのようなユースケースでgRPCを使用するのが理にかなっており、サービス間通信にRESTを使用するのが理にかなっていますか?

興味深いことに、RESTとgRPCの両方を使用するオープンソースプロジェクトに出会いました。たとえば、KubernetesとDocker Swarmはすべてクラスター調整のためにある程度gRPCを使用していますが、RESTマスター/リーダーノードとのインターフェイス用のAPI。gRPCを上下に使用してみませんか?

25
nmurthy

RESTを正しく実行すると、パフォーマンスと複雑さが増しますが、長期的な進化とスケーラビリティが向上します。 RESTは、Web自体のように独立して開発および保守する必要があるサービスに最適です。クライアントとサーバーは疎結合であり、互いに壊れることなく変更できます。

RPCサービスは、柔軟性と独立性を犠牲にして、よりシンプルでパフォーマンスを向上させることができます。 RPCサービスは、クライアントとサーバーが緊密に結合され、同じ開発サイクルに従う環境に最適です。

ただし、ほとんどのいわゆるRESTサービスはRESTにまったく従いません。これは、RESTがあらゆる種類のHTTP APIの単なる流行語になったためです。実際、ほとんどのREST AP​​Iは非常に緊密に結合されているため、RPC設計に勝る利点はありません。

それを考えると、あなたの質問に対する私のやや皮肉な答えは次のとおりです。

  1. 一部の人々は、数年前にRESTを採用したのと同じ理由で、design-by-buzzwordでgRPCを採用しています。

  2. とにかくRESTの実装方法がRPCに相当することに多くの人々が気づいているので、貧弱なREST実装を主張するのではなく、標準化されたRPCフレームワークを使用して正しく実装してみませんか?

  3. RESTは、複数の組織にまたがる長期的な目標を持つプロジェクトに現れる問題の解決策です。たぶん、人々はRESTを本当に必要としないことに気付き、より良いオプションを探しています。

23
Pedro Werneck

GRPCの 将来のロードマップ に応じて、人々は移行を続け、REST(HTTP経由)を「静かに」させます。

gRPCは多くの点でより便利です

  • 通常は高速(超高速など)
  • (ほとんど)「設計の二分法」はありません-使用する正しいエンドポイント、使用する正しいHTTP動詞など。
  • messy入力/応答シリアル化を処理しないgRPCはシリアル化を処理するため、より効率的なデータエンコーディングとHTTP/2により多重化により高速化されます単一の接続およびヘッダー圧縮を介した要求
  • 入力/応答を定義/宣言し、さまざまな言語の信頼できるクライアントを生成します(もちろん、「サポートされている」言語は大きな利点です)
  • 正式な一連のエラー-これは議論の余地がありますが、これまでのところ、HTTPステータスコードよりもAPIユースケースにより直接適用できます

いずれにせよ、この世界では何も不変ではないので、すべてのgRPCトラブルに対処する必要がありますが、これまでのところ、REST ―よりもよく見えます。

私はあなたが両方の長所を持つことができると思います。いずれの場合でも、gRPCは(HTTP/2を介した)HTTPセマンティクスの大部分に従いますが、staticを使用するため、通常のRESTパスは、コールディスパッチ中のパフォーマンス上の理由で、パスからコールパラメーターを解析します。クエリパラメーターとペイロードボディにより、待ち時間と複雑さが増します。

9
x80486

RESTの約束は、常に 均一なインターフェース でした。理想的なRESTクライアントは、クライアントがコーディングされたときに存在しなかったものも含め、RESTfulリソース。

残念ながら、この理想は、RESTの元のケースであるWorld Wide Webの人間が読めるドキュメントを除いて、実際に具体化されたことはありません。

この時点で、「RESTful」と呼ばれるほとんどのインターフェイスは、実際にはバロック形式のRPCであり、リクエストデータや応答データは、メソッド、クエリ文字列、ヘッダー、ステータスコード、ペイロードなど、さまざまな壊れやすい形式で塗りつぶされます。

今日の「RESTful」インターフェースのほとんどの統一性は、開発者の頭の中にあります。彼らはPOST /orders/は、おそらく新しい注文を追加する予定です。しかし、彼らは、クライアントがプログラムする必要があります。それは、彼らが話すすべてのAPIについて、しばしば多くのエラーを起こすことを「知る」ためです。

それでも、実際にはコードで役立つ均一性があります。たとえば、「RESTful」APIを使用している場合、透過的で微調整可能なキャッシングレイヤーをほとんど無料で追加できます。これは、(メッセージが正しい)HTTPメッセージがキャッシュに必要な標準化されたすべての情報(要求メソッド、URL、ステータスコード、Cache-ControlVaryなど。 gRPCでは、独自のキャッシュをロールする必要があります。

しかし、現在の「REST」の優位性の本当の理由は、この種の小さなアフォーダンスではありません。これは、まさにWorld Wide Webの成功です。歴史のある時点で、誰もがすでに高性能で柔軟なHTTPサーバー(Webサイトを提供するため)と堅固なHTTPクライアント(そのサイトを参照してください)、だから人々が機械可読なリソースを追加し始めたとき、同じHTTP方法に固執するのは簡単で安価でした。 HTTPメソッドとヘッダーとステータスコードを使用しました。これは、Webサーバーが既に理解して記録しているためです。 PHPなどのツールを使用すると、通常のWebサイトでのデプロイメントオーバーヘッドなしでこれを実行できます。

World Wide Webとの統一性と整合性が重要でない場合、RPCは試行された真のアーキテクチャの選択であり、gRPCはトラブルを軽減できる堅実な実装です。

9
Vasiliy Faronov