gRPC(ジーアールピーシー)とは、Googleが2015年に公開した高性能リモートプロシージャコール(RPC)フレームワークのこと。HTTP/2をトランスポートに採用し、Protocol Buffersをインタフェース記述言語(IDL)として使うことで、JSONベースのREST APIに比べて低レイテンシ・小ペイロードを実現する。マイクロサービス間通信、双方向ストリーミング、多言語環境の通信基盤として広く採用されている。
例えるなら、gRPCは「電話の専用線」、RESTは「Eメール」。RESTがどこにでも届く汎用的な通信であるのに対し、gRPCはサービス間の高頻度・低レイテンシ通信に特化した「直結回線」だと考えると違いがイメージしやすい。実務ではマイクロサービス間API、内部データプレーン、エッジ・モバイル通信などで頻繁に採用される。
gRPCとは
gRPCとは、Googleが2015年8月にオープンソースとして公開したRPC(Remote Procedure Call)フレームワークである。HTTP/2の多重化・サーバープッシュ機能と、Protocol Buffersによる効率的なバイナリシリアライズを組み合わせ、単一接続で双方向ストリーミングを可能にする。CNCF(Cloud Native Computing Foundation)に採用されているプロジェクトで、Kubernetes・Envoy・etcdなど多くのクラウドネイティブツールが内部通信に利用している。
gRPCの「g」は当初は「Google」の頭文字だったが、現在では公式に「gRPC Remote Procedure Calls」の頭文字を取った再帰略号として説明されており、リリースごとに別の単語に変わるという遊び心のある仕様もある。ここが重要なポイントです。試験などで「gRPCのgは何の略か?」と問われた場合、Googleと答えるのは厳密には不正確になります。
gRPCの読み方
ジーアールピーシー
グラルピック(ごく一部の英語圏での口語的読み)
gRPCの仕組み
gRPCの動作は「IDL定義 → コード生成 → ランタイム呼出し」の3段階に分かれる。まず.protoファイルにサービスとメッセージを定義し、protocコンパイラで多言語(Go・Python・Java・C++・Rust等)のクライアント・サーバーコードを自動生成する。生成されたコードは内部でHTTP/2フレームを送受信し、Protocol Buffersでバイナリシリアライズする。
gRPCの構成
(IDL定義)
(多言語コード生成)
(実行時通信)
4種類のRPC
gRPCはHTTP/2の双方向ストリームを活用して以下4種のRPCをサポートする。RESTでは表現が難しいリアルタイム通信パターンに対応できる点が大きな差別化ポイントです。
- Unary RPC — リクエスト1件・レスポンス1件。最も基本的な形(HTTP REST に近い)。
- Server Streaming RPC — リクエスト1件に対しサーバーが複数レスポンスを返す。
- Client Streaming RPC — クライアントが複数リクエストを送り、サーバーが1件返す。
- Bidirectional Streaming RPC — 両方向で独立にストリームを送受信。チャットや株価配信に最適。
HTTP/2とProtocol Buffersの役割
HTTP/2は単一TCP接続で複数ストリームを多重化でき、ヘッダ圧縮(HPACK)も効く。Protocol BuffersはJSONより圧倒的にコンパクトで、独立ベンチマークではJSONを置き換えることでシリアライズ済みメッセージサイズが10倍縮小、小ペイロードでのレイテンシが最大77%低下するといった結果が報告されている。最新版のgRPCはv1.76(2025年10月リリース)で、Protocol Buffersは2008年にOSS化されv3に至っている。
gRPCの使い方・実例
基本的な使い方(Quick Start)
下記は.proto定義からPythonクライアントを呼び出すまでの最小例。公式チュートリアルの構文に準拠した形に整えてある。
# greeter.proto
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest { string name = 1; }
message HelloReply { string message = 1; }
# Python クライアント例
import grpc
import greeter_pb2, greeter_pb2_grpc
with grpc.insecure_channel("localhost:50051") as channel:
stub = greeter_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(greeter_pb2.HelloRequest(name="World"))
print(response.message)
よくある実装パターン
パターンA: マイクロサービス間のUnary RPC
# 注文サービスが在庫サービスに在庫数を問い合わせる
response = stub.GetStock(StockRequest(sku="ABC-001"))
向いているケース: バックエンドの内部API。低レイテンシ・型安全性・多言語サポートが必要な場面に最適。実務ではJSON REST APIから移行するチームが多いです。
避けるべきケース: ブラウザから直接叩くケース。ブラウザはHTTP/2のtrailerを直接扱えないため、gRPC-Webプロキシ経由でないと使えない。覚えておきましょう。
パターンB: Server Streamingでログ配信
# サーバーがログをストリームで送り続ける
for log_entry in stub.StreamLogs(LogRequest(service="orders")):
print(log_entry.message)
向いているケース: 監視ダッシュボードへのログ配信、株価ティック配信、IoTデバイスからのテレメトリ集約など。1接続で長時間ストリームを保てる点が強み。
避けるべきケース: 短期間に大量の小要求が発生する用途。ストリーム維持のオーバーヘッドがUnary RPCより重くなる場面がある。
パターンC: Bidirectional Streamingでチャット
# 双方向で同時にストリームを流す
async def chat(stub):
async for response in stub.Chat(generate_messages()):
print(response.text)
向いているケース: チャットアプリ、対戦ゲームのリアルタイム通信、共同編集機能。WebSocketと近い使用感で型安全性が高い。
アンチパターン: gRPCをパブリックAPIとして公開
# 絶対NG
# gRPC over HTTP/2 trailer を直接公開しても多くのクライアントが扱えない
# パブリックAPIなら REST + OpenAPI、または gRPC-Gateway 経由の REST 変換層を用意すべき
gRPCはサービス間通信に最適だが、外部公開APIとしては未だRESTやOpenAPIの方が普及している。実務ではgRPC-Gatewayを使ってRESTファサードを自動生成する手法が一般的です。
gRPCのメリット・デメリット
メリット
- 低レイテンシ・小ペイロード — Protocol BuffersはJSONより数倍〜10倍コンパクト
- 多言語サポート — Go・Python・Java・C++・Rust・Node.js等
- 双方向ストリーミング — HTTP/2の多重化を活用
- 型安全 — 自動生成コードでコンパイル時に契約違反を検出
- ロードバランシング・認証・タイムアウトが標準装備
デメリット・注意点
- ブラウザ非対応 — gRPC-Web経由でないと直接叩けない
- デバッグが難しい — バイナリ通信のため curl で直接叩けない
- 仕様変更時のスキーマ管理 — 後方互換ルールの遵守が必要
- 学習コスト — protoc・コード生成ワークフローへの慣れが必要
gRPCとREST・GraphQLの違い
gRPCはしばしばREST・GraphQLと並べて比較される。三者は「サービス間通信のプロトコル」という大枠は同じだが、データ形式・通信モデル・適性が異なる。
| 観点 | gRPC | REST | GraphQL |
|---|---|---|---|
| データ形式 | Protocol Buffers(バイナリ) | JSON(テキスト) | JSON(テキスト) |
| トランスポート | HTTP/2 | HTTP/1.1 or 2 | HTTP/1.1 or 2 |
| 通信モデル | 単発+4種ストリーミング | 基本的に単発 | 単発+subscription |
| 主な用途 | マイクロサービス間API | パブリックAPI全般 | 柔軟なクエリAPI |
| ブラウザ対応 | gRPC-Web経由でのみ | ネイティブ対応 | ネイティブ対応 |
つまり「gRPC=サービス間専用、REST=公開API、GraphQL=柔軟クエリ」と整理できる。多くの大規模システムでは内部にgRPC、外部にRESTを置いた二層構成を採用しています。
gRPCに関するよくある誤解
誤解1: 「gRPCはGoogle専用の技術」
なぜそう誤解されるのか: 「g」がGoogleの頭文字に見えること、Googleが開発元であること、メジャー利用例がGoogle社内システム由来のものに偏って紹介される背景がある。
正しい理解: gRPCはApache 2.0ライセンスで公開されたOSSであり、CNCFがホストする中立プロジェクト。Netflix・Uber・Square・Slack等の大手も採用しています。Google専用ではない点を覚えておきましょう。
誤解2: 「Protocol BuffersはJSONより常に高速」
なぜそう誤解されるのか: ベンチマーク記事で「10倍小さい」「77%低レイテンシ」といった数字が独り歩きしているため。実は条件次第で逆転するケースもある背景がある。
正しい理解: 小〜中ペイロードでは確かに大幅に高速だが、巨大ペイロード(数MB級)ではJSONの圧縮効率と差が縮まる。さらにシリアライズコストはCPU依存で、JITに最適化されたJSONパーサが優位に立つ場面もある。実際のワークロードでベンチマークすることが重要なポイントです。
誤解3: 「gRPCはブラウザから直接叩ける」
なぜそう誤解されるのか: HTTP/2上で動くという説明から、現代ブラウザで直接動作すると思い込まれやすい。実際にはブラウザからはHTTP/2のtrailerフレームを直接送受信できないという技術的制約があるため。
正しい理解: ブラウザから利用するには gRPC-Web という別仕様を使い、Envoyなどのプロキシで通常のgRPCに変換する必要がある。直接gRPCサーバーをブラウザに公開しても動作しません。
gRPCの実務での活用シーン
- Kubernetesクラスタ内通信 — KubernetesのAPIサーバー・kubeletが内部でgRPCを利用
- クラウドネイティブの内部RPC — Envoy・etcd・containerdなど多くのCNCFツールで採用
- マイクロサービスのAPI Gateway内側 — 公開はREST、内側はgRPCの2層構成
- モバイルアプリのバックエンド通信 — 帯域効率を重視する場面
- ストリーミングデータ配信 — 株価ティック・IoTテレメトリ・ライブログ
- 機械学習モデルのサービング — TensorFlow Serving・Triton Inference Server
gRPCに関するよくある質問(FAQ)
Q1. gRPCとREST、どちらを選ぶべきですか?
サービス間の内部通信や低レイテンシが必要な場面はgRPC、外部公開APIやブラウザから直接叩く必要がある場面はRESTが有利です。多くの実務では「内側gRPC+外側REST」の2層構成が採用されます。
Q2. gRPCの「g」は何の略ですか?
公式FAQによると「gRPC Remote Procedure Calls」の頭文字を取った再帰略号で、リリースごとに別の単語に置き換える運用がされています。元々はGoogleの「g」だったとも言われますが、現在では公式に再帰略号として説明されています。
Q3. gRPCをブラウザから使えますか?
直接は使えません。gRPC-Web仕様を使い、Envoyなどのプロキシで通常のgRPCに変換する必要があります。React・Vue等のフロントエンドからはgRPC-WebクライアントSDKを介して呼び出します。
Q4. Protocol BuffersはJSONより本当に速いですか?
小〜中ペイロードではメッセージサイズが約10倍小さく、ベンチマークでは小ペイロードのレイテンシが最大77%低下したという結果が報告されています。ただし巨大ペイロードや特殊なJSONパーサ環境では差が縮まることもあるため、実ワークロードでの検証が推奨されます。
Q5. gRPCのセキュリティはどう確保しますか?
gRPCは標準でTLS(mTLS)をサポートしており、認証はJWT・OAuthトークンをmetadataで渡す形が一般的です。プロダクションではmTLS必須にし、リソースアクセス制御をinterceptorで実装するのが定石です。
まとめ
- gRPCはGoogleが2015年に公開したRPCフレームワーク。現在はCNCFがホストする中立OSS。
- HTTP/2をトランスポート、Protocol Buffersをデータ形式に採用し、低レイテンシ・小ペイロードを実現。
- 4種のRPC(Unary・Server Streaming・Client Streaming・Bidirectional Streaming)をサポート。
- マイクロサービス間通信、Kubernetesなどクラウドネイティブツール、機械学習モデルサービングで広く採用。
- ブラウザからは直接叩けず、gRPC-Web経由が必要。
- RESTとの比較では「サービス間の内側はgRPC、公開APIはREST」という二層構成が定石。
- gRPCの「g」は再帰略号で、リリースごとに別の単語が当てられる遊び心のある仕様がある。
参考文献・出典
参考文献・出典
- ・gRPC公式「Introduction to gRPC」 https://grpc.io/docs/what-is-grpc/introduction/
- ・gRPC公式トップ https://grpc.io/
- ・gRPC GitHub「PROTOCOL-HTTP2.md」 https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md
- ・Protocol Buffers公式 https://protobuf.dev
- ・Wikipedia「gRPC」 https://en.wikipedia.org/wiki/GRPC



































コメントを残す