HTTP API を使用した gRPC サービスの比較Compare gRPC services with HTTP APIs

James のニュートン-キングBy James Newton-King

この記事では、 Grpc サービスと HTTP api (ASP.NET Core web apiを含む) の比較について説明します。This article explains how gRPC services compare to HTTP APIs (including ASP.NET Core web APIs). アプリの API を提供するために使用されるテクノロジは重要な選択であり、gRPC は HTTP Api と比較して独自の利点を提供します。The technology used to provide an API for your app is an important choice, and gRPC offers unique benefits compared to HTTP APIs. この記事では、gRPC の長所と短所について説明し、他のテクノロジで gRPC を使用する場合のシナリオを推奨します。This article discusses the strengths and weaknesses of gRPC and recommends scenarios for using gRPC over other technologies.

高レベルの比較High-level comparison

次の表は、gRPC と JSON を使用した HTTP Api の機能の概要を示しています。The following table offers a high-level comparison of features between gRPC and HTTP APIs with JSON.

特性Feature gRPCgRPC HTTP Api と JSONHTTP APIs with JSON
コントラクトContract 必須 (プロトコル)Required (.proto) 省略可能 (OpenAPI)Optional (OpenAPI)
プロトコルProtocol HTTP/2HTTP/2 HTTPHTTP
PayloadPayload Protobuf (小、バイナリ)Protobuf (small, binary) JSON (大規模で人間が読みやすい)JSON (large, human readable)
PrescriptivenessPrescriptiveness 厳密な指定Strict specification ペイント.Loose. HTTP はすべて有効です。Any HTTP is valid.
ストリームStreaming クライアント、サーバー、双方向Client, server, bi-directional クライアント、サーバーClient, server
ブラウザーサポートBrowser support いいえ (grpc-web が必要)No (requires grpc-web) [はい]Yes
セキュリティSecurity トランスポート (TLS)Transport (TLS) トランスポート (TLS)Transport (TLS)
クライアントコード生成Client code-generation はいYes OpenAPI + サードパーティ製ツールOpenAPI + third-party tooling

gRPC の長所gRPC strengths

パフォーマンスPerformance

gRPC メッセージは、効率的なバイナリメッセージ形式であるProtobufを使用してシリアル化されます。gRPC messages are serialized using Protobuf, an efficient binary message format. Protobuf は、サーバーとクライアント上で非常に高速にシリアル化します。Protobuf serializes very quickly on the server and client. Protobuf のシリアル化では、モバイルアプリのような限られた帯域幅シナリオで重要なメッセージペイロードが小さくなります。Protobuf serialization results in small message payloads, important in limited bandwidth scenarios like mobile apps.

gRPC は http/2 向けに設計されており、http 1.x に比べてパフォーマンスが大幅に向上します。gRPC is designed for HTTP/2, a major revision of HTTP that provides significant performance benefits over HTTP 1.x:

  • バイナリフレームと圧縮。Binary framing and compression. HTTP/2 プロトコルは、送信と受信の両方においてコンパクトで効率的です。HTTP/2 protocol is compact and efficient both in sending and receiving.
  • 1つの TCP 接続での複数の HTTP/2 呼び出しの多重化。Multiplexing of multiple HTTP/2 calls over a single TCP connection. 多重化により、行のブロックが不要になります。Multiplexing eliminates head-of-line blocking.

コード生成Code generation

すべての gRPC フレームワークは、コード生成のためのファーストクラスのサポートを提供します。All gRPC frameworks provide first-class support for code generation. GRPC 開発の中核となるファイルは、gRPC サービスとメッセージのコントラクトを定義するプロトコルファイルです。A core file to gRPC development is the .proto file, which defines the contract of gRPC services and messages. このファイルから、gRPC フレームワークによって、サービスの基本クラス、メッセージ、および完全なクライアントがコードによって生成されます。From this file gRPC frameworks will code generate a service base class, messages, and a complete client.

サーバーとクライアントの間でプロトコルファイルを共有することにより、メッセージとクライアントコードをエンドツーエンドから生成できます。By sharing the .proto file between the server and client, messages and client code can be generated from end to end. クライアントのコード生成によって、クライアントとサーバー上のメッセージの重複が排除され、厳密に型指定されたクライアントが作成されます。Code generation of the client eliminates duplication of messages on the client and server, and creates a strongly-typed client for you. クライアントを作成する必要がない場合は、多くのサービスを持つアプリケーションで大幅な開発時間を節約できます。Not having to write a client saves significant development time in applications with many services.

厳密な指定Strict specification

JSON での HTTP API の正式な仕様は存在しません。A formal specification for HTTP API with JSON doesn't exist. 開発者は、Url、HTTP 動詞、および応答コードの最適な形式について議論します。Developers debate the best format of URLs, HTTP verbs, and response codes.

Grpc 仕様は、grpc サービスが従う必要がある形式について規範としています。The gRPC specification is prescriptive about the format a gRPC service must follow. grpc はプラットフォームと実装全体で一貫しているため、開発時間を短縮し、開発者の時間を節約します。gRPC eliminates debate and saves developer time because gRPC is consistent across platforms and implementations.

ストリームStreaming

HTTP/2 は、有効期間が長いリアルタイム通信ストリームの基盤を提供します。HTTP/2 provides a foundation for long-lived, real-time communication streams. gRPC では、HTTP/2 を使用したストリーミングがファーストクラスでサポートされています。gRPC provides first-class support for streaming through HTTP/2.

GRPC サービスは、ストリーミングのすべての組み合わせをサポートしています。A gRPC service supports all streaming combinations:

  • 単項 (ストリーミングなし)Unary (no streaming)
  • サーバーからクライアントへのストリーミングServer to client streaming
  • クライアントからサーバーへのストリーミングClient to server streaming
  • 双方向ストリーミングBi-directional streaming

期限/タイムアウトとキャンセルDeadline/timeouts and cancellation

gRPC を使用すると、クライアントが RPC の完了を待機する時間を指定できます。gRPC allows clients to specify how long they are willing to wait for an RPC to complete. 期限はサーバーに送信され、サーバーは期限を超えた場合に実行するアクションを決定できます。The deadline is sent to the server, and the server can decide what action to take if it exceeds the deadline. たとえば、サーバーは、タイムアウト時に、実行中の gRPC/HTTP/データベース要求をキャンセルする場合があります。For example, the server might cancel in-progress gRPC/HTTP/database requests on timeout.

子 gRPC 呼び出しによって期限と取り消しを反映すると、リソース使用量の制限を適用できます。Propagating the deadline and cancellation through child gRPC calls helps enforce resource usage limits.

gRPC は、次のシナリオに適しています。gRPC is well suited to the following scenarios:

  • grpc は、低待機時間と高スループット通信を実現するように設計されています。Microservices – gRPC is designed for low latency and high throughput communication. gRPC は、効率性が非常に重要な軽量マイクロサービスに適しています。gRPC is great for lightweight microservices where efficiency is critical.
  • ポイントツーポイントのリアルタイム通信– grpc では、双方向ストリーミングが優れてサポートされています。Point-to-point real-time communication – gRPC has excellent support for bi-directional streaming. gRPC サービスは、ポーリングせずにリアルタイムでメッセージをプッシュできます。gRPC services can push messages in real-time without polling.
  • 多言語環境– grpc ツールは、一般的なすべての開発言語をサポートしているため、grpc は多言語環境に適しています。Polyglot environments – gRPC tooling supports all popular development languages, making gRPC a good choice for multi-language environments.
  • GRPC メッセージ –ネットワークの制約がある環境では、ライトウェイトメッセージ形式である Protobuf を使用してシリアル化されます。Network constrained environments – gRPC messages are serialized with Protobuf, a lightweight message format. GRPC メッセージは、常に同等の JSON メッセージよりも小さくなります。A gRPC message is always smaller than an equivalent JSON message.

gRPC の短所gRPC weaknesses

制限付きブラウザーサポートLimited browser support

現在、ブラウザーから gRPC サービスを直接呼び出すことはできません。It's impossible to directly call a gRPC service from a browser today. gRPC は HTTP/2 機能を多用しており、gRPC クライアントをサポートするために web 要求で必要な制御レベルを提供するブラウザーはありません。gRPC heavily uses HTTP/2 features and no browser provides the level of control required over web requests to support a gRPC client. たとえば、ブラウザーでは、呼び出し元が HTTP/2 を使用するように要求したり、基になる HTTP/2 フレームにアクセスしたりすることを許可していません。For example, browsers do not allow a caller to require that HTTP/2 be used, or provide access to underlying HTTP/2 frames.

grpc-Webは、ブラウザーで制限付きの grpc サポートを提供する grpc チームの追加テクノロジです。gRPC-Web is an additional technology from the gRPC team that provides limited gRPC support in the browser. gRPC-Web は、すべての最新のブラウザーをサポートする JavaScript クライアントと、サーバー上の gRPC-Web プロキシの2つの部分で構成されています。gRPC-Web consists of two parts: a JavaScript client that supports all modern browsers, and a gRPC-Web proxy on the server. GRPC-Web クライアントはプロキシを呼び出し、プロキシは gRPC の要求を gRPC サーバーに転送します。The gRPC-Web client calls the proxy and the proxy will forward on the gRPC requests to the gRPC server.

Grpc のすべての機能が gRPC-Web でサポートされているわけではありません。Not all of gRPC's features are supported by gRPC-Web. クライアントと双方向のストリーミングはサポートされておらず、サーバーストリーミングのサポートは限られています。Client and bi-directional streaming isn't supported, and there is limited support for server streaming.

人間が判読できないNot human readable

HTTP API 要求はテキストとして送信され、人間が読み取りや作成を行うことができます。HTTP API requests are sent as text and can be read and created by humans.

gRPC メッセージは、既定で Protobuf を使用してエンコードされます。gRPC messages are encoded with Protobuf by default. Protobuf は送信と受信が効率的ですが、バイナリ形式は人間が判読できません。While Protobuf is efficient to send and receive, its binary format isn't human readable. Protobuf では、適切に逆シリアル化するために、プロトコルファイルに指定されているメッセージのインターフェイスの説明が必要です。Protobuf requires the message's interface description specified in the .proto file to properly deserialize. ネットワーク上の Protobuf ペイロードを分析し、手動で要求を作成するために、追加のツールが必要です。Additional tooling is required to analyze Protobuf payloads on the wire and to compose requests by hand.

サーバーリフレクションgrpc コマンドラインツールなどの機能は、バイナリ Protobuf メッセージを支援するために用意されています。Features such as server reflection and the gRPC command line tool exist to assist with binary Protobuf messages. また、Protobuf メッセージはJSON との間の変換をサポートしています。Also, Protobuf messages support conversion to and from JSON. 組み込みの JSON 変換は、デバッグ時に、Protobuf メッセージを人間が判読できる形式に変換するための効率的な方法を提供します。The built-in JSON conversion provides an efficient way to convert Protobuf messages to and from human readable form when debugging.

その他のフレームワークのシナリオAlternative framework scenarios

次のシナリオでは、gRPC よりも他のフレームワークをお勧めします。Other frameworks are recommended over gRPC in the following scenarios:

  • ブラウザーでアクセス可能な api – grpc はブラウザーで完全にはサポートされていません。Browser accessible APIs – gRPC isn't fully supported in the browser. gRPC-Web はブラウザーサポートを提供できますが、制限があり、サーバープロキシも導入されています。gRPC-Web can offer browser support, but it has limitations and introduces a server proxy.
  • ブロードキャストリアルタイム通信– grpc ではストリーミングによるリアルタイム通信がサポートされますが、登録済み接続へのメッセージのブロードキャストの概念は存在しません。Broadcast real-time communication – gRPC supports real-time communication via streaming, but the concept of broadcasting a message out to registered connections doesn't exist. たとえば、チャットルーム内のすべてのクライアントに新しいチャットメッセージを送信するチャットルームの場合、新しいチャットメッセージをクライアントに個別にストリーミングするには、各 gRPC 呼び出しが必要です。For example in a chat room scenario where new chat messages should be sent to all clients in the chat room, each gRPC call is required to individually stream new chat messages to the client. SignalRは、このシナリオにとって便利なフレームワークです。SignalR is a useful framework for this scenario. SignalR には、永続的な接続と、メッセージをブロードキャストするための組み込みサポートの概念があります。 has the concept of persistent connections and built-in support for broadcasting messages.
  • プロセス間通信– は、着信 grpc 呼び出しを受け入れるために HTTP/2 サーバーをホストする必要があります。Inter-process communication – A process must host an HTTP/2 server to accept incoming gRPC calls. Windows では、プロセス間通信パイプは高速で軽量な通信方法です。For Windows, inter-process communication pipes is a fast, lightweight method of communication.

その他の技術情報Additional resources