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;
}
この定義から、Python・Java・Go・C++など10以上の言語向けのコードが自動生成されます。
フィールド番号が鍵!
Protobufの特徴的な仕組みが「フィールド番号」(= 1, = 2 の部分)です。
- JSONはフィールド名(文字列)をそのままデータに含めるため、データが大きくなります
- Protobufはフィールド名の代わりに番号(1〜2バイト) で識別するため、超コンパクトになります
JSON: {"id":1,"name":"Alice","email":"alice@example.com"}
→ 52バイト(テキスト)
Protobuf: バイナリ列
→ 約25バイト(バイナリ)
JSONとの比較
| 比較項目 | JSON | Protobuf |
|---|---|---|
| 形式 | テキスト | バイナリ |
| 人間が読める | ✅ はい | ❌ いいえ |
| データサイズ | 大きめ | 小さい(3〜10倍) |
| 処理速度 | 普通 | 高速 |
| スキーマ定義 | 任意 | 必須 |
| 主な用途 | Web API、設定ファイル | gRPC、内部通信 |
| 対応言語 | ほぼすべて | 主要言語(10以上) |
歴史と背景
- 2001年頃:Googleが社内でのデータ交換フォーマットとして開発開始。当時のXMLは冗長すぎて大規模システムには不向きだった
- 2008年:Googleがオープンソースとして公開(proto2)
- 2016年:proto3リリース。シンプルな文法に整理され、より多くの言語に対応
- 2016年:gRPC(GoogleのRPCフレームワーク)がProtobufを標準の通信フォーマットとして採用。マイクロサービスブームとともに普及が加速
- 現在:CNCF(クラウドネイティブ基盤)プロジェクトの多くで採用。Kubernetes、Envoyなど主要なクラウドネイティブツールでも利用
ProtobufとJSONとgRPCの関係
これら3つの関係を整理すると理解しやすくなります。
いつProtobufを選ぶべきか?
| こんなときは | 推奨フォーマット |
|---|---|
| 社内マイクロサービス間の大量通信 | Protobuf(gRPC) |
| モバイルアプリ↔サーバー(帯域節約したい) | Protobuf |
| 外部公開REST API | JSON |
| ブラウザから直接呼び出す | JSON(Protobufはブラウザ対応が難しい) |
| スキーマを厳密に管理したい | Protobuf(または JSON Schema) |
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 7159 | JSON形式の定義(比較対象として) |
| RFC 7540 | HTTP/2の仕様(gRPCが利用するプロトコル) |
| RFC 9113 | HTTP/2の改訂版仕様 |
関連用語
- gRPC — ProtobufをデフォルトのデータフォーマットとするGoogleのRPCフレームワーク
- REST API — HTTP上でJSONを使うAPI設計スタイル。Protobufと対比されることが多い
- JSON — テキストベースの軽量データ交換フォーマット。Protobufの主な比較対象
- スキーマ定義(IDL) — データ構造を言語非依存で定義するインターフェース記述言語
- マイクロサービス — 小さなサービスを組み合わせるアーキテクチャ。Protobufが多用される
- シリアライゼーション — データ構造をバイト列に変換する処理の総称
- HTTP/2 — gRPC(Protobuf通信)が基盤とする高速HTTPプロトコル
- OpenAPI — REST APIのスキーマ定義規格。Protobufの.protoと役割が対応する