ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
要点
- Protocol Buffers(プロトコル バッファ、略称 Protobuf)は Google が 2008 年に OSS 化した、言語非依存・プラットフォーム非依存のシリアライゼーション形式。スキーマ定義ファイルの拡張子が
.proto。 - IDL(Interface Definition Language)でスキーマを書き、
protocコンパイラで各言語のコード(C++/Java/Go/Python/Ruby/C# 等)を自動生成して使う。 - バイナリエンコードは小さくて高速で、JSON と比べてサイズは 1/3〜1/10、シリアライズ/パースは数倍〜数十倍速い。
- gRPC のデフォルトのワイヤフォーマットで、マイクロサービス間通信のデファクト基盤。
概要
Protocol Buffers は Google 社内で 2001 年頃から使われていた内部技術が、2008 年に proto2 仕様として公開された。社内インデックスサーバ間の通信形式が起源で、「人間が読むためでなく、機械が大量に処理することに特化したフォーマット」という設計思想を持つ。2016 年に proto3 が公開され、現在の業界利用はほぼ proto3 ベースである。
使い方の流れは独特で、まず .proto ファイルにメッセージ定義を書き、protoc コマンドで言語ごとのクラスを生成する。アプリ側ではそのクラスのインスタンスを作って SerializeToString() / ParseFromString() でバイナリ往復する。スキーマがコード(型)として存在するため、型安全で IDE 補完が効き、フィールド名の typo が即コンパイルエラーになる。これは JSON や CSV にはない大きな利点である。
用途として最大なのは gRPC(Google が開発した HTTP/2 ベースの RPC フレームワーク)のメッセージ形式で、現代のマイクロサービス間通信ではほぼ Protobuf+gRPC が選ばれる。次点で各種設定ファイル、ゲームのセーブデータ、IoT のテレメトリ、機械学習モデル定義(TensorFlow の SavedModel など)でも使われる。
内部構造
proto3 のスキーマ例は次のような形になる。
syntax = "proto3";
package example;
message User {
int64 id = 1;
string name = 2;
string email = 3;
repeated string tags = 4;
}
service UserService {
rpc GetUser(GetUserRequest) returns (User);
}
キモは各フィールド末尾の = 1 のようなタグ番号(field number)で、これがワイヤ上の識別子になる。フィールド名はバイナリには出ず、タグ番号と型のみ。これにより、フィールド名を後から変えてもバイナリ互換は壊れない(タグ番号さえ固定なら)。逆に、タグ番号を一度割り当てたら絶対に再利用してはいけない。
バイナリは TLV(Tag-Length-Value)に近い構造で、各フィールドは「タグ番号 + ワイヤ型(Varint/64bit/Length-delimited/32bit)」のヘッダの後に値を持つ。未知のフィールドは無視して読み飛ばすため、後方互換/前方互換のどちらもとりやすい。
整数は Varint(小さい数値ほど短いバイト数で済む)でエンコードされ、たとえば 0〜127 はわずか 1 バイト。これが JSON との容量差の大きな要因になる。
主な用途
- gRPC のメッセージ:
service+rpc定義から両端のクライアント/サーバスタブを生成。マイクロサービス間 RPC の事実上の標準。 - Kafka のペイロード: Avro と並ぶ選択肢。Schema Registry が Protobuf も対応している。
- 機械学習: TensorFlow の
SavedModel、ONNX、TFRecord などが Protobuf 形式。 - ゲーム / モバイル: 通信量・パース時間を切り詰めたい場面で JSON より優位。
- 各種設定ファイル: Envoy / Istio / Kubernetes の内部表現の一部など。
関連形式との比較
| 形式 | スキーマ | サイズ | 主な使い所 |
|---|---|---|---|
| Protocol Buffers | .proto、コード生成 | 非常に小 | gRPC、内部 RPC |
| Avro | JSON、ファイル同梱 | 小 | Kafka、長期保管 |
| JSON | 無し(or JSON Schema) | 大 | Web API、ログ |
| Thrift | .thrift、コード生成 | 小 | Facebook 系、古めの RPC |
| FlatBuffers | .fbs、コード生成 | 小(zero-copy) | ゲーム、リアルタイム |
Avro との対比でいうと、Protobuf は「アプリのコードに型としてスキーマを焼き込む」設計、Avro は「データに同梱して動的に解釈する」設計で、思想がほぼ正反対である。Web API の感覚で扱うなら Protobuf、データ基盤として保管するなら Avro、というのが大まかな指針になる。
コマンド・ツール
公式コンパイラ protoc をインストールして使う。
$ protoc --version
libprotoc 3.21.12
# Python 用コード生成
$ protoc --python_out=. user.proto
# Go 用
$ protoc --go_out=. --go-grpc_out=. user.proto
Python での読み書き例。
from user_pb2 import User
u = User(id=1, name="Alice", email="a@example.com", tags=["admin", "ops"])
buf = u.SerializeToString() # バイナリ化
print(len(buf)) # 数十バイト
u2 = User()
u2.ParseFromString(buf) # 復号
デバッグ用にバイナリと JSON を往復する CLI として protoc --decode や buf、grpcurl がよく使われる。buf は Lint・Breaking Change 検出を備えた現代的なツールチェーンで、スキーマ運用に強く推奨される。
注意点
- タグ番号は不可逆: フィールドを削除しても、その番号は
reservedにして二度と使わない運用が必須。番号再利用は互換性破壊の温床。 - 必須フィールドが無い: proto3 ではすべてオプショナル。欠落と「ゼロ値(0/空文字)」が区別できない問題があり、明示的に区別したいなら
optional修飾子(proto3.15 以降)か Wrapper 型を使う。 - 人間が読めない: バイナリ前提のため、ログ用途には不向き。
protoc --decodeで覗くか、JSON マッピング(gRPC-Gateway 等)を併用する。 - スキーマ管理が運用要: アプリ間でスキーマがずれるとパースエラーや silent な値破損が起きる。リポジトリ集中管理+ Breaking Change チェック(
buf breaking)の運用がほぼ必須。
関連リンク
- 親: データベース・データ交換
- 概論: ファイル拡張子とは
- カテゴリ: データベース(カテゴリ)
- 同 Wave: Avro(.avro) / Parquet(.parquet) / Feather / Arrow IPC
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?