对比
Avro 与 Protocol Buffers
Apache Avro 将数据与写入模式关联,并按读取模式进行解析。Protocol Buffers(Protobuf)根据 `.proto` 定义和字段编号生成代码,再以带编号的二进制 wire format 编码消息。
应该选择哪种格式?
模式随数据传递且需要跨运行环境解析写入/读取模式时,可考虑 Avro。需要从 `.proto` 生成类型化代码,并在 RPC 或服务边界交换消息时,Protobuf 很合适。
适用于 Avro
按照定义好的模式交换记录
- 跟踪模式版本的事件和数据管道
适用于 Protocol Buffers 模式文件
定义 Protocol Buffers 消息结构 · 在不同编程语言间共享数据约定
- 使用 protoc 生成各语言代码
- 定义 RPC 和服务间通信所用的消息
基本信息
| 项目 | Avro | Protocol Buffers 模式文件 |
|---|---|---|
| 扩展名 | .avro | .proto |
| MIME 类型 | application/avro | text/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、未知字段及模式演进。