gRPCの特性と用途 - RESTとの違い・SaaSでの使いどころ
gRPC の特徴、REST との違い、SaaS での現実的な使い方をまとめる。
gRPC とは
Google が開発した RPC フレームワーク。Protocol Buffers でAPIを定義し、サーバー/クライアントのコードを自動生成する。
主な特徴
| 特徴 | 内容 |
|---|---|
| Protocol Buffers | JSON ではなくバイナリ形式。高速・軽量 |
| スキーマ駆動 | .proto で API を厳密に定義 → コード自動生成 |
| HTTP/2 | 多重化、ヘッダー圧縮が標準 |
| 型安全 | 生成コードによりコンパイル時に型チェック |
4つの通信パターン(REST との最大の違い)
1. Unary: クライアント → サーバー(1リクエスト1レスポンス。REST と同じ)
2. Server Stream: クライアント → サーバー →→→(サーバーが複数回返す)
3. Client Stream: クライアント →→→ サーバー →(クライアントが複数回送る)
4. Bidirectional: クライアント ⇄ サーバー(双方向ストリーム)
REST は基本 1 だけだが、gRPC は 2〜4 をネイティブにサポート。チャット、リアルタイムフィード、大量データの分割送信などに向く。
Reflection(エンドポイント一覧の取得)
gRPC にはサービス一覧を返す Reflection というオプション機能がある。有効にすると grpcurl -plaintext localhost:50051 list で一覧が取れる。REST でいう Swagger/OpenAPI の自動公開に近い。必須機能ではない。
ブラウザから直接叩けない
gRPC は HTTP/2 のフレームレベルを直接制御する必要があるが、ブラウザの fetch / XMLHttpRequest はそこまでの低レベル制御を公開していない。セキュリティの問題ではなく、ブラウザ API の制約。
回避策
| 方法 | 仕組み |
|---|---|
| gRPC-Web | プロキシ(Envoy等)が gRPC ↔ ブラウザ互換形式に変換 |
| gRPC-Gateway | gRPC サービスの前に REST エンドポイントを自動生成 |
| Connect | buf が作った新プロトコル。HTTP/1.1 + JSON でも動く gRPC 互換 |
これらが存在する理由は、gRPC の開発体験(型安全なクライアント自動生成、スキーマ駆動、API仕様のズレが起きない)をフロントでも使いたいという要望から。
buf とは
.proto ファイルから Go 等のコードを自動生成するツール。従来の protoc のモダンな置き換え。
| 従来 (protoc) | buf | |
|---|---|---|
| インストール | protoc + 各言語プラグインを個別に | buf 単体でOK |
| 設定 | シェルスクリプトで長いコマンド | buf.yaml で宣言的 |
| lint/breaking検出 | なし | 組み込み |
| 依存管理 | 手動 | buf.lock で管理 |
SaaS での使いどころ
gRPC が活きるケース
- マイクロサービスが多数あり、サービス間通信が頻繁
- リアルタイム性が必要(チャット、ライブ更新、IoT)
- 大量データの高速処理(データパイプライン、ML推論)
gRPC が微妙なケース
- サービス数が少ない(モノリス〜数個)
- 主にブラウザ向けの CRUD アプリ
- 外部開発者に API を公開したい
- チームが小さい
現実的な構成
ブラウザ → REST or GraphQL → BFF → 内部は gRPC
↕
マイクロサービス間
外向きは REST/GraphQL、内部通信だけ gRPC というハイブリッドが最も一般的。小〜中規模の SaaS で最初から全部 gRPC にするのはオーバーエンジニアリングになりがち。サービス間通信がボトルネックになった段階で導入するのが現実的。