乐闻世界logo
搜索文章和话题

RPC 框架中常见的序列化协议有哪些?它们各有什么优缺点?

2月22日 14:05

序列化是 RPC 框架中的核心组件,直接影响性能和效率。常见的序列化协议各有特点:

1. Protobuf(Protocol Buffers)

  • 特点:Google 开发,二进制格式,高效紧凑
  • 优势
    • 序列化/反序列化速度快
    • 数据体积小,传输效率高
    • 支持多语言(Java、Python、Go、C++等)
    • 向后兼容性好
    • 定义清晰的数据结构(.proto 文件)
  • 劣势
    • 可读性差,需要 .proto 文件
    • 不支持动态类型
  • 适用场景:高性能要求的微服务通信

2. Thrift

  • 特点:Facebook 开发,支持多种协议和传输方式
  • 优势
    • 支持多种序列化格式(Binary、JSON、Compact)
    • 支持多种传输协议(TCP、HTTP、Memory)
    • 代码生成功能强大
    • 支持异步和同步调用
  • 劣势
    • 学习曲线较陡
    • 文档相对较少
  • 适用场景:跨语言、多协议的复杂场景

3. JSON

  • 特点:文本格式,易读易写
  • 优势
    • 人类可读,调试方便
    • 通用性强,所有语言都支持
    • 灵活,支持动态类型
    • 浏览器原生支持
  • 劣势
    • 数据体积大,传输效率低
    • 序列化/反序列化速度慢
    • 类型安全性差
  • 适用场景:对外 API、Web 应用

4. Avro

  • 特点:Apache 项目,支持模式演化
  • 优势
    • 支持动态模式,无需代码生成
    • 模式演化能力强
    • 压缩率高
    • 适合大数据场景
  • 劣势
    • 学习成本较高
    • 相对小众
  • 适用场景:大数据处理、日志收集

5. MessagePack

  • 特点:二进制 JSON,高效紧凑
  • 优势
    • 比 JSON 更小更快
    • 保持 JSON 的数据类型
    • 支持多种语言
  • 劣势
    • 可读性不如 JSON
    • 生态系统相对较小
  • 适用场景:需要 JSON 兼容性但要求更高性能的场景

6. Hessian

  • 特点:二进制序列化,动态类型
  • 优势
    • 序列化速度快
    • 支持动态类型
    • 跨语言支持
  • 劣势
    • 数据体积相对较大
    • 社区活跃度不高
  • 适用场景:Java 生态的 RPC 调用

性能对比(大致排序):

  • 序列化速度:Protobuf > Hessian > Thrift > MessagePack > Avro > JSON
  • 数据体积:Protobuf > MessagePack > Thrift > Hessian > Avro > JSON
  • 可读性:JSON > Avro > MessagePack > Thrift > Protobuf > Hessian

选择建议:

  • 高性能内部服务:Protobuf、Thrift
  • 对外 API:JSON
  • 大数据场景:Avro
  • 需要 JSON 兼容性:MessagePack
  • Java 生态:Hessian
标签:RPC