gRPCとは?

gRPCの概念について説明します。

gRPCとは?

gRPCはGoogleが開発した、高性能で汎用的なオープンソースRPC(Remote Procedure Call)フレームワークです。サービス間で高速かつ効率的に通信するために使用します。

ネットワーク上の関数を、自分のコード内の関数のように呼び出せます。リモート関数呼び出しを標準化し、高速で型安全な通信を実現します。

HTTP/1.1とJSONを主に使用する従来のREST通信とは異なり、gRPCはHTTP/2とバイナリシリアライズ形式のProtocol Buffers(ProtoBuf)を使用します。これにより、低レイテンシー、高スループット、小さいメッセージサイズを実現します。

サービスAPIは.protoファイルで定義します。サーバーとクライアントは同じインターフェース定義を共有し、複数のプログラミング言語向けにStubコードを自動生成できます。多言語環境での開発を容易にし、サービス境界を明確にします。

gRPC Flow 出典: https://appmaster.io/ko/blog/grpcneun-mueosibnigga

gRPCの主要要素

1. Protocol Buffersベース

gRPCはJSONの代わりに、バイナリ形式のProtocol Buffersを使用します。

  • JSONより小さく高速
  • protobufファイルによる明確なスキーマ
  • 各言語向けのクライアントとサーバーのStubコードを自動生成

例: hello.proto

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

2. HTTP/2通信

gRPCは内部でHTTP/2を使用するため、次の機能を利用できます。

  • Multiplexing: 1つの接続で複数のリクエスト
  • Server Push
  • ヘッダー圧縮
  • 双方向を含むストリーミング

適切な用途ではRESTより高速で効率的です。

gRPCの4つの通信方式

種類 説明
Unary 1リクエストと1レスポンス
Server Streaming サーバーが複数のメッセージをストリームとして配信
Client Streaming クライアントが複数のメッセージを送り、サーバーが1回応答
Bidirectional Streaming クライアントとサーバーが複数のメッセージを同時に送受信

チャット、リアルタイムログ処理、ストリーミングデータ処理に適しています。

gRPCの長所と短所

長所

  • Protocol BuffersとHTTP/2による高速で軽量な通信
  • protoスキーマに基づくコンパイル時検証による強い型安全性
  • Go、Java、Kotlin、Python、Rust、C#、Node、Rubyなどをサポート
  • 双方向ストリーミングを標準サポート
  • マイクロサービスの内部通信に適している

短所

  • gRPC-WebやWebAssemblyなしではブラウザーから直接呼び出しにくい
  • protoの作成とコンパイルへの理解が必要
  • RESTよりデバッグが難しい

gRPCを使用するタイミング

適したケース

  • マイクロサービスの内部通信
  • 高性能が重要なトラフィック
  • リアルタイムストリーミングサービス
  • JavaサーバーとGoクライアントなどの多言語サービス
  • IoT、ゲームサーバー、リアルタイムイベント処理

RESTが適したケース

  • ブラウザーから直接呼び出すAPI
  • シンプルな公開API
  • JSONなど人間が読みやすい形式が必要な場合

gRPCとRESTの比較

項目 gRPC REST
通信プロトコル HTTP/2 通常はHTTP/1.1。HTTP/2も可能
データ形式 バイナリのProtocol Buffers JSONやXMLなどのテキスト形式
速度 非常に高速で小さく、解析も効率的 比較的低速
ストリーミング 双方向を含め完全にサポート 制限あり。SSEやWebSocketが別途必要
インターフェース定義 .protoファイルで型とスキーマを定義 必須スキーマなし。OpenAPIを推奨
型安全性 コンパイル時に検証 実行時に検証される場合が多い
コード生成 クライアントとサーバーのStubを自動生成 Swagger/OpenAPIで文書化可能。Stubは任意
使いやすさ ブラウザー呼び出しにはgRPC-Webが必要 ブラウザーとJavaScriptから直接利用可能
人間の可読性 バイナリ形式のため低い JSONで高い
デバッグ 難しい curlやPostmanで容易
セキュリティ TLSとHTTP/2の強力な組み合わせ 標準的なTLS
適したサービス 内部マイクロサービス、高性能、リアルタイムストリーミング 公開API、外部連携、ブラウザー中心のサービス
言語サポート ほぼすべての主要言語を公式サポート HTTPを扱えれば言語を問わない
長所の要約 高速、効率的、型安全、強力なストリーミング シンプル、デバッグ容易、高い互換性
短所の要約 複雑、ブラウザーから利用しにくい 性能と型安全性で不利

まとめ

  • gRPC: 内部通信、高性能、ストリーミングに最適です。
  • REST: ブラウザー、公開API、デバッグのしやすさに最適です。