API設計

Protobuf(Protocol Buffers) ぷろとばふ

シリアライゼーションgRPCスキーマ定義バイナリ形式IDLデータ交換
Protobufについて教えて

簡単に言うとこんな感じ!

Protobufは、データを超コンパクトに圧縮して送るための「荷造りルール」だよ!JSONみたいにテキストで送るより何倍も小さく・速く転送できるんだ。Googleが作った仕組みで、gRPCというAPI通信とセットで使われることが多いよ!


Protobuf(Protocol Buffers)とは

Protocol Buffers(略称: Protobuf)は、Googleが開発したデータのシリアライゼーション(直列化)フォーマットです。シリアライゼーションとは、プログラム内のデータ構造を、ファイル保存や通信に使える形式に変換することを指します。

JSONやXMLが「人間が読めるテキスト形式」であるのに対し、Protobufはバイナリ形式(0と1の並び)を使います。これにより、データサイズをJSONの約3〜10倍小さく圧縮でき、解析速度も大幅に向上します。大量のデータを高速にやり取りするマイクロサービス間通信やモバイルアプリのAPI通信で特に威力を発揮します。

また、Protobufではスキーマ(データの設計図)を.protoファイルに先に定義します。このスキーマから複数の言語向けのコードを自動生成できるため、チーム間のデータ仕様のズレを防ぎやすいのも大きな特徴です。


Protobufの仕組みと構造

.protoファイルの基本構造

Protobufを使う手順は大きく3ステップです。

ステップ作業内容担当
① スキーマ定義.protoファイルでデータ構造を定義開発者
② コード生成protocコンパイラで各言語のコードを自動生成ツール
③ 通信・保存生成されたコードでバイナリデータをやり取りアプリ

.protoファイルの例:

syntax = "proto3";

message User {
  int32  id    = 1;
  string name  = 2;
  string email = 3;
}

この定義から、PythonJavaGo・C++など10以上の言語向けのコードが自動生成されます。

フィールド番号が鍵!

Protobufの特徴的な仕組みが「フィールド番号」(= 1, = 2 の部分)です。

  • JSONはフィールド名(文字列)をそのままデータに含めるため、データが大きくなります
  • Protobufはフィールド名の代わりに番号(1〜2バイト) で識別するため、超コンパクトになります
JSON:   {"id":1,"name":"Alice","email":"alice@example.com"}
        → 52バイト(テキスト)

Protobuf: バイナリ列
        → 約25バイト(バイナリ)

JSONとの比較

比較項目JSONProtobuf
形式テキストバイナリ
人間が読める✅ はい❌ いいえ
データサイズ大きめ小さい(3〜10倍)
処理速度普通高速
スキーマ定義任意必須
主な用途Web API、設定ファイルgRPC、内部通信
対応言語ほぼすべて主要言語(10以上)

歴史と背景

  • 2001年頃:Googleが社内でのデータ交換フォーマットとして開発開始。当時のXMLは冗長すぎて大規模システムには不向きだった
  • 2008年:Googleがオープンソースとして公開(proto2)
  • 2016年:proto3リリース。シンプルな文法に整理され、より多くの言語に対応
  • 2016年:gRPC(GoogleのRPCフレームワーク)がProtobufを標準の通信フォーマットとして採用。マイクロサービスブームとともに普及が加速
  • 現在:CNCF(クラウドネイティブ基盤)プロジェクトの多くで採用。KubernetesEnvoyなど主要なクラウドネイティブツールでも利用

ProtobufとJSONとgRPCの関係

これら3つの関係を整理すると理解しやすくなります。

Protobuf・JSON・gRPCの関係 gRPC (通信フレームワーク) サービス定義 (.protoで記述) HTTP/2上で 高速通信 Protobuf (シリアライゼーション) バイナリ形式で データを圧縮 .protoで スキーマ定義 JSON (テキストフォーマット) 人間が読める テキスト形式 REST APIで 広く使われる 標準採用 vs gRPCはProtobufを「荷造り係」として採用。 JSONはREST APIの定番だが、速度・サイズでProtobufに劣る。

いつProtobufを選ぶべきか?

こんなときは推奨フォーマット
社内マイクロサービス間の大量通信Protobuf(gRPC)
モバイルアプリ↔サーバー(帯域節約したい)Protobuf
外部公開REST APIJSON
ブラウザから直接呼び出すJSON(Protobufはブラウザ対応が難しい)
スキーマを厳密に管理したいProtobuf(または JSON Schema

関連する規格・RFC

規格・RFC番号内容
RFC 7159JSON形式の定義(比較対象として)
RFC 7540HTTP/2の仕様(gRPCが利用するプロトコル)
RFC 9113HTTP/2の改訂版仕様

関連用語

  • gRPC — ProtobufをデフォルトのデータフォーマットとするGoogleのRPCフレームワーク
  • REST APIHTTP上でJSONを使うAPI設計スタイル。Protobufと対比されることが多い
  • JSON — テキストベースの軽量データ交換フォーマット。Protobufの主な比較対象
  • スキーマ定義(IDL) — データ構造を言語非依存で定義するインターフェース記述言語
  • マイクロサービス — 小さなサービスを組み合わせるアーキテクチャ。Protobufが多用される
  • シリアライゼーション — データ構造をバイト列に変換する処理の総称
  • HTTP/2 — gRPC(Protobuf通信)が基盤とする高速HTTPプロトコル
  • OpenAPIREST APIのスキーマ定義規格。Protobufの.protoと役割が対応する