【ぷろとこるばっふぁーず】

Protocol Buffers とは?

💡 JSONより「速く・軽い」データ形式
📌 このページのポイント
Protocol Buffers — スキーマ駆動のシリアライズ .proto 定義 message User { string name int32 age } コード生成 Go Java / Python シリアライズ オブジェクト ⇄ バイナリ 高速・コンパクト・型安全 JSON vs Protobuf 比較 JSON(テキスト形式) {"name":"田中","age":30} 27バイト・人間が読める スキーマなし・パース遅め Protobuf(バイナリ形式) 0a 04 e7 94 b0 e4 b8 ad 10 1e 10バイト・約63%削減 スキーマ必須・パース高速 大量データのやり取りではProtobufの効率が際立つ
Protocol Buffersのイメージ — スキーマからコード生成し高速にシリアライズ
ひよこ ひよこ

JSONと何が違うの?

ペンギン先生 ペンギン先生

JSONはテキスト形式で人間が読めるけど、フィールド名が毎回含まれるからサイズが大きい。Protocol Buffersはバイナリ形式で人間には読めないけど、フィールド番号で識別するからコンパクト。{"name":"Alice","age":30}が約30バイトのところ、Protobufなら約10バイト程度。大量データのやり取りでは差が大きいよ

ひよこ ひよこ

.protoファイルって何を書くの?

ペンギン先生 ペンギン先生

message User { string name = 1; int32 age = 2; repeated string tags = 3; } のようにメッセージ型を定義する。= 1や= 2はフィールド番号で、データの識別に使う。protocコマンドでPython、Go、JavaTypeScript等のコードを自動生成できるから、手動でパーサーを書く必要がないよ

ひよこ ひよこ

フィールド番号を変えたらどうなる?

ペンギン先生 ペンギン先生

フィールド番号はデータの互換性の要だから変えちゃダメ。新しいフィールドを追加するときは未使用の番号を使う。古いフィールドを削除する場合はreservedで番号を予約して再利用を防ぐ。この仕組みのおかげで、新旧のクライアント・サーバーが混在しても互換性を保てるんだよ

ひよこ ひよこ

Protocol Buffersを使うべき場面は?

ペンギン先生 ペンギン先生

マイクロサービス間の内部通信(gRPC+Protobuf)、②大量データの保存・ストリーミング、③モバイルアプリとサーバー間通信(帯域節約)。逆にWebブラウザとのAPI通信はJSONの方がデバッグしやすく、エコシステムも充実している。「内部通信はProtobuf、外部APIJSON」という使い分けが一般的だよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Protocol Buffers」って出てきたら「スキーマ定義型のバイナリデータ形式」と思えればだいたいOK!
📖 おまけ:英語の意味
「Protocol Buffers (Protobuf)」 = プロトコルバッファー
💬 Protocol(通信規約)のBuffer(緩衝記憶)。データ交換の効率を最大化するために設計されたよ
← 用語集にもどる