Kafka中AVRO、JSON Schema与Protobuf的消息大小及存储问询
Kafka序列化格式相关问题解答
1. Kafka是否采用AVRO、JSON Schema或Protobuf以二进制形式保存消息?
Kafka本身不强制任何特定的序列化格式,它仅以二进制字节流的形式存储和传输消息。AVRO、JSON Schema(配合对应序列化器)、Protobuf都是可选的序列化方案——只要你通过对应的序列化工具将业务对象转换为二进制字节,Kafka就会以二进制形式保存这些消息。
2. 关于AVRO、JSON Schema、Protobuf的消息体积及JSON Schema存储形式问题
消息大小差异(按体积从小到大排序)
- Protobuf:体积最小。它采用紧凑的二进制编码,用数字标识字段,无冗余元信息,在性能敏感、追求极致压缩的场景表现最优。
- AVRO:体积略大于Protobuf,但远小于JSON文本。其二进制编码同样紧凑,若配合Schema Registry使用(Schema单独存储,消息仅含数据),体积会进一步优化。
- JSON Schema相关序列化:
- 若仅用JSON Schema做校验,配合Jackson输出JSON文本,体积会远大于前两者,完全不满足缩小体积的需求;
- 若使用基于JSON Schema的二进制序列化实现(部分第三方库支持),体积接近AVRO,但通常仍比Protobuf大。
JSON Schema是否会像AVRO一样以二进制形式存储消息?
这完全取决于你使用的序列化器:
- 如果你只是用JSON Schema做结构校验,然后用Jackson等工具输出JSON文本,Kafka中存储的是文本的字节流(本质是二进制,但体积庞大);
- 若使用支持JSON Schema的二进制序列化器,会生成紧凑的二进制数据,和AVRO的存储形式类似,但这类实现并不普及,多数场景下的“JSON Schema+Jackson”仍指向文本序列化。
针对你的核心需求(缩小体积)的建议
如果觉得AVRO的代码生成流程繁琐,可以尝试:
- Protobuf的简化用法:使用Protobuf的Java注解方式定义字段,无需手动编写.proto文件,或借助工具自动生成代码;
- AVRO的反射式序列化:跳过Maven插件生成类的步骤,直接通过反射将POJO与AVRO Schema映射完成序列化。
注意:若选择JSON Schema路线,务必确认使用的是二进制序列化实现,否则无法达到缩小体积的目的。
内容的提问来源于stack exchange,提问作者Vytautas Šerėnas
相关产品推荐
相关产品推荐

