まず押さえる5つの判断軸
REST か gRPC かは、技術の好みではなくシステムが置かれた条件で決まる。実務で効くのは次の5軸だ。
| 判断軸 | 問い | 傾向 |
|---|---|---|
| ① 公開範囲 | API を叩くのは社外の不特定多数か、自社の内部サービスか | 外部 → REST / 内部 → gRPC |
| ② クライアント | ブラウザが直接叩くか | ブラウザ直 → REST |
| ③ レイテンシ/流量 | サービス間の往復回数・スループットが性能を左右するか | 高負荷・低遅延 → gRPC |
| ④ 通信形態 | ストリーミングや双方向通信が要るか | ストリーミング → gRPC |
| ⑤ チーム/基盤 | protobuf・HTTP/2・L7LB の運用に耐えられるか | 整備が薄い → REST |
💡 軸の優先順位
多くの場合、最初に効くのは①公開範囲と②クライアントだ。ブラウザや社外が叩くなら、性能を理由に gRPC を選んでも周辺コスト(gRPC-Web・プロキシ)で相殺されがち。性能軸(③④)は「内部通信」と確定してから効いてくる。
選定の判断フロー
上の軸を上から順に当てていくと、自然に落とし所が決まる。
→ YES なら REST。汎用性・キャッシュ・デバッグ性が勝る。(gRPC を使うなら gRPC-Web+プロキシ前提)
→ YES なら gRPC。ストリーミングが第一級機能。
→ YES なら gRPC。protobuf+HTTP/2 多重化が効く。
→ 体制が薄いなら REST で十分。整っているなら型の厳密さを取りに gRPC でもよい。
⚠️ このフローは「内部通信ほど gRPC 寄り」という偏りを持つ
あくまで一般的傾向であり、内部通信でも「数も流量も少ない管理用 API」なら REST のほうが運用が楽なことは多い。フローは出発点であって、最後は具体的なトラフィックと体制で微調整する。
REST に倒すべきケース
gRPC に倒すべきケース
.proto を単一の契約として共有したい。併用という現実解
実際の多くのシステムは「どちらか一方」ではなく両方を層ごとに使い分ける。 典型は「外向きは REST、内部は gRPC」だ。エッジ(BFF / API Gateway)で外部からの REST/JSON を受け、 そこから先のサービス間通信は gRPC で行う。フロントの扱いやすさと、内部の効率を両取りできる。
[ブラウザ/モバイル]
| REST + JSON(扱いやすい・キャッシュ可)
v
[ BFF / API Gateway ]
| gRPC(型安全・低レイテンシ)
+--> [UserService]
+--> [OrderService]
+--> [PaymentService]
| gRPC
v
サービス間は protobuf で高速通信
さらに「1つの定義から REST と gRPC の両方を提供したい」場合は gRPC-Gateway が定番だ。
.proto にHTTPマッピングを書いておくと、gRPC サーバーの前段に REST/JSON ↔ gRPC を変換するリバースプロキシを自動生成できる。
1つの契約から両方のインターフェースを生やせるため、移行期や「内部は gRPC・外部にも JSON を出したい」ケースで効く。
💡 併用の代表パターン
① BFF パターン:エッジで REST を受け内部を gRPC 化。② gRPC-Gateway:1つの .proto から REST と gRPC を同時提供。③ サービスメッシュ:Envoy 等で gRPC の LB・リトライ・可観測性を基盤側に寄せる。
選定でやりがちな誤り
| ありがちな判断 | なぜ危ういか |
|---|---|
| 「速いから全部 gRPC」 | ブラウザ・外部公開層では gRPC-Web/プロキシのコストが性能利得を相殺する |
| 「枯れてるから全部 REST」 | 高頻度のサービス間通信では往復コストと型のゆるさが後で効いてくる |
| 「流行ってるから gRPC」 | L7LB・専用監視・デバッグ手段の整備コストを見積もっていない |
| 性能を計測せず選ぶ | 多くのシステムのボトルネックは DB や N+1 であり、プロトコル差ではないことが多い |
✅ 次の章では…
PART 04 では、実際に「JSON/REST で作った内部 API を gRPC へ移行する」ケーススタディを扱う。同一エンドポイントの REST 版と gRPC 版のコードを並べて対比し、.proto の起こし方から段階的移行(gRPC-Gateway 併用・ストラングラーパターン)、ハマりどころまでを具体的に見ていく。