FORMAT COMPARISON
Avro vs Protocol Buffers schema
Apache Avroはデータとwriter schemaを結び付け、reader schemaとの解決を行う直列化システムです。Protocol Buffers(Protobuf)は`.proto`定義とフィールド番号からコードを生成し、番号を含むwire formatでメッセージを符号化します。
AvroとProtocol Buffers schema、どちらを選ぶ?
スキーマをデータファイルとともに扱い、動的言語を含む複数環境でreader/writer schema解決を利用するならAvroを検討します。`.proto`から型付きコードを生成し、RPCやサービス境界でメッセージを交換する設計ではProtobufがよく合います。どちらも進化規則が必要で、互換性は一方向とは限らないため実際の旧新reader/writerで検証してください。
Avro向き
スキーマ付きレコードデータのシリアライズと交換
- イベントやレコードをスキーマとともに扱うデータ連携
Protocol Buffers schema向き
Protocol Buffersメッセージの構造定義・複数言語間で共有するデータ契約
- protocで各言語のコードを生成する
- RPCやサービス間通信のメッセージを定義する
基本情報を比較
AvroとProtocol Buffers schemaの主な違いを確認できます。
| 項目 | Avro | Protocol Buffers schema |
|---|---|---|
| 拡張子 | .avro | .proto |
| MIME Type | application/avro | text/plain |
| 主な用途 | スキーマ付きレコードデータのシリアライズと交換 | Protocol Buffersメッセージの構造定義・複数言語間で共有するデータ契約 |
| 圧縮 | schema_serialization | none |
| 開く方法 | Avro対応ツールでスキーマ、フィールド、型、レコード内容を確認します。 | テキストエディタやProtocol Buffers対応IDEで開きます。構文やimportを検証するには、プロジェクトが使うprotocと同じ版・設定でコンパイルします。 |
| 書き出し・変換 | JSONやParquetへ変換する場合は、フィールド名、型、null、論理型、スキーマ互換性を確認します。 | 別スキーマ形式へ移す場合、型・フィールド番号・省略値・列挙値・互換性の意味を対応付けてからコード生成と実データのテストを行います。.protoをJSONやバイナリへ単純に拡張子変更しても変換されません。 |
用途別の選び方
作りたいものや使う場面から選べます。
イベントやレコードをスキーマとともに扱うデータ連携
スキーマ付きレコードデータのシリアライズと交換
Avro向きprotocで各言語のコードを生成する
Protocol Buffersメッセージの構造定義・複数言語間で共有するデータ契約
Protocol Buffers schema向きRPCやサービス間通信のメッセージを定義する
Protocol Buffersメッセージの構造定義・複数言語間で共有するデータ契約
Protocol Buffers schema向き確認ポイント 1
AvroのObject Container Fileはwriter schemaとデータブロックを同じファイルに格納できます。Protobufのwire data自体はschema定義を含まないので、`.proto`やdescriptorを別途配布・管理する設計が必要です。
使い分け確認ポイント 2
Avroはreader schemaとwriter schemaの差を解決する機構を規定します。Protobufは各field numberをwire format上の識別子として使い、削除済み番号の再利用を避けるなどの進化規則に従います。
使い分け選ぶ理由を詳しく
- 両者のバイナリwire formatは互換ではありません。union/oneof、optional・presence、default、enum、unknown field、logical type、field numberと型変更を対応付け、古いデータやクライアントとの互換性をテストしてください。