Closed5

Protocol BuffersとgRPCの関係

0y00y0

Protocol Buffers(プロトコルバッファ)とは?

Protocol Buffers(protobuf)は、Googleが開発した軽量で効率的なデータシリアライズフォーマット。JSONやXML のようなフォーマットと同様に、データの構造を定義し、異なるシステム間でのデータ交換を効率化することを目的としている。

特徴

  • バイナリ形式なのでJSONやXMLよりも高速・コンパクト
  • 型安全でデータ構造を厳密に定義できる
  • 言語非依存で、C++, Java, Python, Go, Rust などさまざまな言語で使用可能
  • .protoファイルを使ってデータ構造を定義する
0y00y0

gRPC とは?

gRPCは、Googleが開発した高性能なRPC(Remote Procedure Call)フレームワーク。gRPCは、データシリアライズにProtocol Buffers(protobuf)を使用し、クライアントとサーバー間で高速・効率的に通信するために最適化されている。

特徴

  • HTTP/2を使用し、並列リクエスト・ストリーミングが可能
  • protobufをデフォルトのデータフォーマットとして使用(JSONも利用可能)
  • 多言語対応(C++, Python, Go, Java, C#, Rust など)
  • ストリーミング対応(クライアント/サーバー/双方向ストリーミング)
  • 認証・ロードバランシングをサポート
0y00y0

Protocol BuffersとgRPCの関係

protobufはgRPCのデータフォーマットとして利用され、gRPCはその上にRPCの仕組みを提供するという関係

項目 Protocol Buffers(protobuf) gRPC
役割 データフォーマット(シリアライズ) RPC(リモートプロシージャコール)フレームワーク
用途 構造化データの交換 クライアントとサーバー間の通信
フォーマット バイナリ形式(コンパクト&高速) protobuf(デフォルト)、JSONも使用可能
通信方式 ファイルやメッセージのシリアライズ HTTP/2を利用したRPC通信
関係性 gRPCのデフォルトデータフォーマット protobufを使って通信を効率化
0y00y0

なぜgRPCはHTTP/2を使うのか?

gRPCの特徴である以下は、HTTP/2でなければ実現できないため

  • 双方向ストリーミング
  • 同時に複数のリクエスト処理(多重化)
  • ヘッダー圧縮による高速化

gRPCはHTTP/2の能力をフルに活かして、API通信を簡単・高速・型安全にするライブラリといえる

HTTP/2

  • 通信プロトコル
  • gRPCに限らず、WebサーバーやREST APIでも使える汎用的な輸送手段

gRPC

  • HTTP/2の上に構築されたアプリケーション層の通信ライブラリ
  • RPC(Remote Procedure Call)という「関数呼び出し」のモデルで通信を抽象化
0y00y0

なぜgRPCはREST APIのようなスタイルではなく、RPCを採用したのか?

マイクロサービス時代の内部通信に最適な形を追求した結果、RPCスタイルが最も効率的

  • HTTP/2 + Protocol Buffers による高速・軽量な通信
  • IDLによる強い型安全と自動コード生成
  • RESTのような汎用性ではなく、密結合でも効率重視の設計
  • 関数を呼び出すようにサービスを使うニーズに最適

RESTとRPCの違い

観点 REST RPC
通信単位 リソース(例: /users/123) 関数(例: GetUserById(id))
データ形式 通常はJSON Protocol Buffersなどバイナリ形式
柔軟性 高い(疎結合) 低め(密結合)
型安全 手動で検証(JSON) IDLで定義(静的に検証)
通信効率 冗長(ヘッダーやJSONが大きい) 高速・圧縮済み

なぜマイクロサービスではRPCが有利か?

関数呼び出しのように扱える(開発しやすい)

  • サーバーの処理を、クライアントから client.AddUser(user) みたいに呼び出せる
  • RESTのようにURLやHTTPメソッドを設計する必要がない

自動コード生成で手間がない

  • .proto を書くだけで、クライアントとサーバーのスタブが多言語で自動生成
  • RESTだとOpenAPI(Swagger)などを使っても、完全自動化は難しい

通信が軽い・速い(バイナリ・圧縮)

  • JSONより数倍小さい Protocol Buffers
  • HTTP/2の多重化・ヘッダー圧縮で高スループット

型安全・構造化されたAPI定義ができる

  • IDL(インターフェース定義言語)により、コンパイル時にエラー検出が可能

RESTが向いている場面との違い

使い方 向いている通信方式
外部公開API(Web APIなど) REST
内部マイクロサービス間通信 gRPC(RPC)
ブラウザ⇔サーバー REST or gRPC-Web
高速・高頻度なやりとり gRPC

gRPCは外部通信にも使えるか?

可能ではあるが制約がある

  • ブラウザからは直接使えない(gRPC-Webが必要)
  • HTTP/2に対応していないプロキシ/ロードバランサが問題になることも
  • 外部向けAPIとしてはRESTのほうが一般的で互換性も高い
このスクラップは5ヶ月前にクローズされました