MENU

Protocol Buffersとは|Google発のスキーマ駆動IDLを解説

Protocol Buffers アイキャッチ
Protocol Buffers

Protocol Buffers(プロトコルバッファーズ、protobuf)はGoogleが社内で利用していた言語横断のデータシリアライズ/IDL(Interface Definition Language)を2008年にオープンソース化したものだ。.protoファイルで型とサービスを定義し、専用コンパイラprotocで各言語のコードを生成する仕組みで、gRPCの標準ペイロード形式としても採用される。JSONより圧倒的にコンパクトかつ高速で、マイクロサービスやモバイルアプリのRPCで事実上の標準となった。

目次

この記事の目次

  1. ワイヤーフォーマットとproto3の特徴
  2. gRPCと組み合わせるRPC実装
  3. 他のシリアライズ形式との位置づけ
  4. 運用で気をつけたい互換性ルール
  5. まとめ

ワイヤーフォーマットとproto3の特徴

ワイヤーフォーマットとproto3の特徴

protobufのワイヤー表現はタグ番号と型を組み合わせたvarint+値のシンプルなTLV(Type-Length-Value)方式である。フィールド名は転送されず、.protoで定義したタグ番号のみで識別される。これにより1〜15番のフィールドは1バイトのキーで済み、JSONと比べて数倍コンパクトになる。整数のvarintエンコーディングは小さい値ほど短くなる可変長表現で、よく使う値域にチューニングしやすい。

現行のproto3では、proto2に比べてrequired/optionalキーワードが廃止され、全フィールドがデフォルト値持ちのオプショナル扱いになった(後にoptionalが復活)。これによりスキーマ進化が緩やかになり、フィールド追加でも古いコードが落ちない設計となっている。oneof・map・wrappers型などモダンな表現も加わり、JSON相互変換も標準APIで提供される。

gRPCと組み合わせるRPC実装

gRPCと組み合わせるRPC実装

protobufの真価はgRPCと組み合わせたときに発揮される。.protoファイルにserviceを宣言してメソッドのリクエスト/レスポンス型を書けば、protoc-gen-goやprotoc-gen-grpcが自動でクライアント/サーバのスタブを生成する。HTTP/2上のストリーミング・Bi-directional通信・コード生成によるI/F共有が同時に手に入るため、マイクロサービス間通信の生産性が大きく向上する。

Kubernetes・etcd・Envoy・Cilium・TiKVなどクラウドネイティブの中核基盤も内部でprotobufとgRPCを多用しており、運用ノウハウも豊富だ。Webブラウザからの直接利用はgRPC-Webやconnect-goといったプロキシ/プロトコル拡張で対応する。OpenAPIとの二択になる場面では、内部マイクロサービスはprotobuf、外部公開APIはOpenAPI+JSON、と使い分けるのが一般的な落としどころである。

他のシリアライズ形式との位置づけ

他のシリアライズ形式との位置づけ

protobufと比較されるのはJSON・MessagePack・Avro・FlatBuffersなどだ。JSONは可読性で勝るが転送量と速度で劣り、MessagePackは可読性なしの軽量化版だがスキーマレスな点が異なる。Avroはスキーマをデータと一緒に運ぶ性質があり、Kafkaの中間形式に強い。FlatBuffersはGoogle製で、デシリアライズ不要でアクセスできるゲーム/組込向け特化形式である。

protobufは「コード生成+強い契約」が最大の特徴で、複数言語チームでI/Fを共有する場面に最も向く。一方で動的言語(Python・Ruby)でadhocに使うにはコード生成が面倒という声もあり、その場合はJSONやMessagePackの方が手早い。BigQueryやBigtableなど、Google系プロダクトはprotobufネイティブ対応が多く、Googleエコシステムにいるほどメリットが累積する。

運用で気をつけたい互換性ルール

運用で気をつけたい互換性ルール

protobufを長く運用するためのコツは「タグ番号を絶対に再利用しない」「フィールド削除時はreservedで番号を予約する」「型変更は禁止」という3点を守ることだ。これを破ると古いクライアントが新しいバイト列を誤解釈し、業務障害につながる。schema lintツール(buf)の導入を強く推奨したい。

また、proto3でfield presence(フィールドの有無)を厳密に区別したい場合はoptionalキーワードを明示的に付ける必要がある。これを忘れると0や空文字がデフォルト値として扱われ、「未指定」と「ゼロ」の区別が消えてしまう。さらに、Any型・JSON Mapping・enum名衝突など仕様の細部にハマりどころが多いため、buf breakingなど互換性チェックを継続的インテグレーションに組み込むのが安全策だ。

まとめ

Protocol Buffersはコンパクト・高速・多言語対応を兼ね備えたスキーマ駆動IDLで、gRPCと組み合わせることでマイクロサービス時代の通信基盤を支えている。互換性ルールを守ればスキーマ進化に強く、長期運用に耐える。クラウドネイティブ環境を構築するなら、まず候補に挙がるシリアライズ形式である。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次