JSON vs Protocol Buffers vs FlatBuffers:谁才是高性能序列化的“卷王”?

1 阅读3分钟

🧐 为什么我们还在用 JSON?

JSON 是微服务通信的“老好人”——人见人爱,花见花开。它有三大优点:

  • 人类可读(程序员深夜 debug 时的救命稻草)
  • 语言通吃(Go、Python、JavaScript… 全都支持)
  • 比 XML 简洁一万倍(XML:我谢谢你全家)

但天下没有免费的午餐。JSON 的“可读性”恰恰是它的性能软肋——每次接收数据,都得先 parse 成结构体,这个过程既耗 CPU 又费内存。

比如在 Go 中:

type Event struct {
    Type   string `json:"type"`
    Source string `json:"source"`
    // ...其他字段
}

var e Event
err := json.NewDecoder(r.Body).Decode(&e)

看似简单,背后却是一场“字符串到结构体”的翻译大会,效率嘛……你懂的。


🚀 方案升级:Protocol Buffers(Protobuf)

Google 出品,必属精品。Protobuf 是一种二进制序列化协议,主打一个“小、快、稳”。

✅ 优点:

  • 比 JSON 更紧凑(体积小 30%~50% 很常见)
  • 跨语言支持(Go、Java、Rust… 都行)
  • 强类型 schema,减少运行时错误

❌ 缺点:

  • 依然是“解析型”:收到数据后,还是要 proto.Unmarshal 成 Go 结构体
  • 可读性差(一堆乱码,调试靠工具)

Go 示例:

e := &events_pb.Event{}
err := proto.Unmarshal(data, e) // 依然要解析!

所以,Protobuf 虽快,但还没“快到飞起”。


🥷 终极选手:FlatBuffers

FlatBuffers 最初是 Google 为游戏开发搞出来的,目标就一个:零解析、零内存分配、直接访问原始字节

✅ 核心优势:

  • 无需 Unmarshal!数据在内存中就是“就绪状态”
  • 零拷贝访问:直接通过偏移量读字段
  • 同样是二进制,但比 Protobuf 更激进

Go 中怎么用?

e := events.GetRootAsEvent(data, 0) // 直接拿到“指针式”对象
saveEvent(string(e.Type()), string(e.Source()), ...)

注意:这里 e.Type() 返回的是 []byte,转成 string 才能用——但整个过程没有 new struct,没有 deep copy


📊 性能实测:Go 基准测试结果

作者搭建了一个简单的事件上报 API,分别用 JSON、Protobuf、FlatBuffers 实现,然后跑 Go benchmark:

格式每次操作耗时 (ns/op)内存分配 (B/op)分配次数 (allocs/op)
JSON1732228826
Protobuf697195221
FlatBuffers640185621

💡 结论

  • FlatBuffers 比 JSON 快 2.7 倍
  • 内存也更省,尤其在高并发场景下,GC 压力显著降低。

🤔 那我该用哪个?

场景推荐方案
内部 API、低频调用、快速开发✅ JSON(简单、直观、调试方便)
高性能 RPC、gRPC 生态✅ Protobuf(生态成熟,工具链完善)
极致性能、高频事件、低延迟要求(如游戏、IoT、审计日志)✅✅ FlatBuffers

🧠 记住:不要为了“快”而盲目替换。
如果你的服务每天只有 1000 个请求,用 FlatBuffers 可能反而增加维护成本。
但如果你每天处理 10 亿事件,那省下的服务器费用可能够你买辆特斯拉了 🚗。


🔧 小贴士:如何开始?

  1. 定义 schema

    • Protobuf: event.proto
    • FlatBuffers: event.fbs
  2. 生成 Go 代码

    # Protobuf
    protoc --go_out=. event.proto
    
    # FlatBuffers
    flatc --go event.fbs
    
  3. 集成到 HTTP handler


🎉 结语

JSON 是“舒适区”,Protobuf 是“性能升级包”,而 FlatBuffers 是“性能外挂”。
选择哪个,取决于你的业务需求、团队能力和性能瓶颈。

技术不是越新越好,而是越合适越好
但了解这些选项,能让你在关键时刻,多一张王牌。