结构化数据,有时也称消息交换格式(message interchange format)。一般用在编程语言中,将某一内存结构编码(encode / marshal / serialize)成字节序列,反之亦然。
按编码后的字节序列是否人类可读,分为:
- 文本格式:如 JSON, XML
- 二进制格式:如 Protobuf, Thrift
文本格式对比二进制格式:
- 二进制格式占用更少的空间(序列化后)
- 二进制格式序列化、反序列化时,性能更高
- 文本格式更容易使用,可以手写、肉眼可读
对比各种格式 / 序列化框架时,考虑几点:
- 时空效能(efficiency),比如序列化、反序列化性能,序列化后的大小
- 是否语言、平台中立
- 开发起来是否简单、快速
- 是否提供一种 IDL,用来描述数据本身的格式
- 基础数据类型有何差异,比如 pb2 中并没有
map
结构,Thrift 有;是否支持组合类型 - 是否支持范型、反射等高级能力
- 这些协议经常用在 RPC 场景中,存在客户端和服务器的角色,因此要考虑:
- 两方的协议格式文件变动,引起的兼容性问题。比如新增字段、删除字段等
Resources
- Designing Data-intensive Applications Ch04
- Dropbox 中
pbvsthriftvsavro.pdf
对比了 Protobuf 和 Thrift 方方面面,虽然是 12 年写的,但是内容很不错