protobufスキーマとは?Protocol Buffersを解説
protobufスキーマとは、GoogleのコンパクトなバイナリシリアライゼーションフォーマットであるProtocol Buffers向けにメッセージの構造を定義する.protoファイルです。
Protocol Buffers(protobuf)は、高速かつコンパクトでスキーマ駆動なデータシリアライズ手法であり、サービス間通信で多用されています。スキーマ - .protoファイル - は契約そのものです。各メッセージのフィールドを宣言し、コンパイラがそれを各言語のコードへ変換します。protobufをプロジェクトに組み込むということは、CIに属するコード生成のステップを持つことを意味します。
protobufスキーマとは何か
protobufスキーマは、メッセージとそのフィールドを宣言するプレーンテキストの.protoファイルであり、各フィールドは型・名前・一意の番号を持ちます。ワイヤー上でフィールドを識別するのは名前ではなく番号であり、これこそがprotobufにデータをコンパクトにエンコードさせ、安全に進化させることを可能にしています。
スキーマ駆動のバイナリエンコード
JSONと異なり、protobufはシリアライズされたバイトにフィールド名を埋め込みません - スキーマのフィールド番号を使います。そのため出力は小さく解析も高速ですが、スキーマなしにはバイトを読めないことも意味します。スキーマは任意のドキュメントではなく必須のものです。
コード生成
コンパイラは.protoファイルを読み、対象言語でメッセージをエンコード・デコードするためのクラスやstructを生成します。この生成されたコードこそ、アプリケーションが実際にimportするものです。生成物であるため、通常はコミットせずCIで再生成し、スキーマと同期させ続けます。
CIにおけるprotobuf
CIのbuildでは通常、protobufコンパイラを実行してコードを再生成し、スタイルや破壊的変更についてスキーマをlintし、スキーマの編集が既存クライアントを黙って壊せないよう後方互換性を検証します。.protoファイルに対する破壊的変更の検出は、共有APIにとって価値あるCIのゲートです。
# Generate code and check compatibility in CI
steps:
- run: buf lint
- run: buf breaking --against ".git#branch=main"
- run: buf generateLatchkeyについて
protobufコンパイラやbufのようなツールは、jobがインストールする単なるCLIにすぎません。Latchkeyではそうしたツールのダウンロードが実行間でcacheされるため、コード生成のjobがbuildのたびにコンパイラを取り直すことはありません。
重要なポイント
- protobufスキーマは、コンパクトなバイナリフォーマットのためにメッセージと番号付きフィールドを宣言する.protoファイルである。
- エンコードは名前ではなくフィールド番号を使うため、バイトを読むにはスキーマが必要になる。
- CIはスキーマからコードを再生成し、既存クライアントを守るために破壊的変更をゲートで止める。