# Protocol Buffers
## 概要
[[Google]]が提供するプラットフォーム中立・拡張可能な構造化データのシリアライズ機構であり、オープンソース実装として公開されている。[[@2010__VLDB__Dremel - Interactive Analysis of Web-Scale Datasets]]では、Dremelのデータモデル(強く型付けされたネストレコード)の名称の由来がProtocol Buffersであると説明され、C++やJavaなどのプログラミング言語向けにコード生成ツールがバインディングを生成する。フィールド値がレコード出現順に逐次レイアウトされる標準的なバイナリオンワイヤ表現により、言語をまたいだ相互運用性(例: Javaで書かれたMRプログラムがC++ライブラリ経由で公開されたデータソースのレコードを消費する)を実現する(Source: [[@2010__VLDB__Dremel - Interactive Analysis of Web-Scale Datasets]] §3 Data Model)。
Dremelが提案する列指向ストレージ表現は、このProtocol Buffersのネストデータモデルを損失なくカラムへ分解・再構成するアルゴリズム(repetition level・definition level)として設計されている。
## エンコーディングとスキーマ発展(DDIA 2E 第5章)
Googleで開発されたバイナリエンコーディング形式(protobuf)。Facebook発の Apache Thrift と類似する。IDL でスキーマを記述しコード生成ツールで各言語のクラスを生成する。例示レコード(`userName`・`favoriteNumber`・`interests` の3フィールド)を符号化すると 33 バイトで、フィールド名を含む MessagePack(66 バイト)より大幅に小さい。フィールドはスキーマで割り当てた**タグ番号**(1, 2, 3 等)で識別され、型注釈と可変長整数エンコーディングを併用して1バイトにタグと型を詰め込む。`repeated` 修飾子でリスト・配列を表現し、同一タグの繰り返し出現として符号化する。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 5 Encoding and Evolution]] "Protocol Buffers")
**スキーマ発展の規則**: フィールド名の変更は可能(符号化データはタグ番号しか参照しない)だが、タグ番号は変更・再利用できない。新フィールド追加は新規タグを割り当てれば前方互換(旧コードは未知タグを型注釈をもとにスキップ)・後方互換(新コードは欠落フィールドにデフォルト値を補う)を両立する。削除したタグは `reserved` で予約し将来の再利用を防ぐ。データ型変更は一部可能だが値の切り捨てリスクがある(32bit→64bit整数への拡張は安全、逆方向は危険)。この設計はタグ番号を人手で割り当てる前提のため、リレーショナルスキーマ等からの動的生成には[[Apache Avro]]ほど向かない(タグ番号の一意性を管理者が手動保守する必要がある)。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 5 Encoding and Evolution]] "Field tags and schema evolution", "Dynamically generated schemas")
gRPC のサービス定義 IDL としても採用され、Protocol Buffers のエンコーディング形式の互換性規則がそのまま gRPC の後方・前方互換性に継承される。
## 関連
- ソース: [[@2010__VLDB__Dremel - Interactive Analysis of Web-Scale Datasets]] / [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 5 Encoding and Evolution]]
- エンティティ: [[Google]] / [[Apache Avro]]
- 概念: [[ネスト型カラムナストレージ]] / [[スキーマ発展]] / [[バイナリエンコーディング]]
## 出典
- [[@2010__VLDB__Dremel - Interactive Analysis of Web-Scale Datasets]]
- [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 5 Encoding and Evolution]]("Protocol Buffers", "Field tags and schema evolution")