Format Atlas

对比

Avro 与 Protocol Buffers

Apache Avro 将数据与写入模式关联,并按读取模式进行解析。Protocol Buffers(Protobuf)根据 `.proto` 定义和字段编号生成代码,再以带编号的二进制 wire format 编码消息。

应该选择哪种格式?

模式随数据传递且需要跨运行环境解析写入/读取模式时,可考虑 Avro。需要从 `.proto` 生成类型化代码,并在 RPC 或服务边界交换消息时,Protobuf 很合适。

适用于 Avro

按照定义好的模式交换记录

  • 跟踪模式版本的事件和数据管道

适用于 Protocol Buffers 模式文件

定义 Protocol Buffers 消息结构 · 在不同编程语言间共享数据约定

  • 使用 protoc 生成各语言代码
  • 定义 RPC 和服务间通信所用的消息

基本信息

项目AvroProtocol Buffers 模式文件
扩展名.avro.proto
MIME 类型application/avrotext/plain
常见用途按照定义好的模式交换记录定义 Protocol Buffers 消息结构 · 在不同编程语言间共享数据约定
打开方式使用支持 Avro 的工具检查模式、字段、类型和记录。可用文本编辑器或支持 Protocol Buffers 的 IDE 打开。要检查语法和导入项,请使用项目所用版本及配置的 protoc 进行编译。
导出或转换转换为 JSON 或 Parquet 时,检查字段名、类型、空值、逻辑类型、记录数和模式兼容性。迁移到其他模式格式时,应先映射类型、字段编号、默认值、枚举值和兼容性语义,再生成代码并测试实际数据。仅把扩展名改成 .json 或二进制格式并不会完成转换。

按用途选择

跟踪模式版本的事件和数据管道

按照定义好的模式交换记录

Avro

使用 protoc 生成各语言代码

定义 Protocol Buffers 消息结构 · 在不同编程语言间共享数据约定

Protocol Buffers 模式文件

定义 RPC 和服务间通信所用的消息

定义 Protocol Buffers 消息结构 · 在不同编程语言间共享数据约定

Protocol Buffers 模式文件

关键点 1

Avro Object Container File 可以把写入模式和数据块一起保存。Protobuf wire data 本身不含模式定义,因此需要单独分发和管理 `.proto` 文件或 descriptor。

进一步了解差异

关键点 2

Avro 规定写入模式与读取模式之间的解析。Protobuf 将字段编号作为 wire 标识,并依赖诸如不重用已删除编号的演进规则。

进一步了解差异

进一步了解差异

文件需要携带写入模式且读取端需要解析模式时使用 Avro。生成的消息类和稳定字段编号契约适合系统设计时使用 Protobuf。两者都需要兼容性纪律;按实际需求测试新旧读写端的交叉组合。

  • Avro 容器文件可嵌入模式和数据块。Protobuf 二进制消息若没有匹配的模式或 descriptor,并非自描述。
  • Avro 按其规则解析模式差异。Protobuf 兼容性取决于字段编号、wire type、presence 语义和安全演进做法。
  • 两者 wire format 不能互换。应映射 union/oneof、optional 与 presence、默认值、enum、未知字段、逻辑类型、字段编号和类型变更,并用真实新旧客户端测试。

常见问题

Avro 和 Protobuf 能直接读取对方的二进制文件吗?

不能。两者编码不同。转换需要显式映射字段和类型,并检查默认值、presence、未知字段及模式演进。

了解详情

参考资料与规范