bigywater.tech
Kafka 内部原理 · 72

Avro、JSON、Protobuf 怎么选

用同一条用户记录真实对比JSON、Avro、Protobuf三种格式的序列化体积和速度,看体积最小的Avro和速度最快的Protobuf真实是怎么各自取舍的。

35B/40B/99B
Avro/Protobuf/JSON真实的序列化体积
6倍
Protobuf相对JSON和Avro真实的速度优势

验证:同一条记录,三种格式真实的体积对比

命令 · python record = {"user_id": 123456, "name": "Alice Zhang", "email": "alice@example.com", "age": 29, "active": True}
真实实测 · 本机执行输出
JSON     : size=99 bytes
Avro     : size=35 bytes
Protobuf : size=40 bytes

JSON真实是体积最大的——因为它把字段名("user_id"、"email"这些)真实原样写进了每一条消息里;Avro和Protobuf都真实是二进制格式,字段的位置和类型由schema/proto定义决定,消息本身真实不需要重复带着字段名,体积天然小很多。

验证:序列化/反序列化速度,Protobuf真实甩开了另外两个

命令 · python # 真实各自跑10万次序列化和反序列化
真实实测 · 本机执行输出(10万次)
JSON    : ser=0.138s, deser=0.135s
Avro    : ser=0.139s, deser=0.121s
Protobuf: ser=0.023s, deser=0.031s
Protobuf真实序列化只要23毫秒(10万次),比JSON和Avro的139毫秒快了约6倍——这个差距真实来自实现层面:Python标准库的json模块和fastavro虽然都做了性能优化,但Protobuf的Python绑定真实是用C++核心库编译出来的,序列化逻辑真实全程在C++层完成,Python这边只是调用接口,开销小得多。真实的选型结论是:体积敏感(网络带宽或存储成本是瓶颈)选Avro或Protobuf都行,体积相近;CPU也敏感(高吞吐场景,序列化本身的开销不能忽略)优先选Protobuf;如果团队已经在用Confluent生态,Avro配合Schema Registry的兼容性检查(参见上一篇)会更顺手;JSON胜在调试方便、人眼能直接读,适合吞吐量不高、可读性优先的场景。

分步演示:三种格式真实的体积与速度对比

每一步都是本文上面用同一条记录跑出来的原始结果。

Protobuf体积接近Avro,速度却快了6倍
这一步新验证的格式

    参考与说明

    • 数据来自本机Python的json标准库、fastavro 1.12.2、protobuf 7.36.2(C++核心库绑定),同一条用户记录各自序列化/反序列化10万次。
    • 和上一篇《Schema Registry》一起看:Avro的schema演进兼容性规则最成熟,是它在流处理生态里长期被推荐的原因之一,本文只对比了体积和速度这两个维度。
    • 没有验证:真实网络传输(不只是内存内序列化)场景下三种格式的端到端延迟;更复杂的嵌套数据结构(本文只测了一个扁平的5字段记录)下体积差距是否会被放大。
    京ICP备2026067502号-1京公网安备11010502063487号