Kafka调研(2):消息序列化框架建议与对比
调研结果和建议
综合来看,Avro或者Protocol Buffer二选一即可, 但是出于灵活性和标准JSON的支持力度上来看,更推荐Protocol Buffers。同时部分数据依然可以通过JSON方式传输。
主流序列化框架对比
Kafka的序列化
Kafka并不限定的消息格式。Kafka自身提供了一系列的序列化器,比如ByteArraySerializer,ByteBufferSerializer,DoubleSerializer,FloatSerializer,StringSerializer,UUIDSerializer, IntegerDeserializer, LongSerializer, ShortSerializer, 总结起来就是基本类型、字符串类型、二进制消息。
但是在通常情况下不会使用比如Float这种来做序列化,原因在于系统间交互或者放到Kafka的数据一般来说都比较复杂,无法用一个字段来表示。于是,这种情况下,就需要在Kafka之上建立一个消息格式的契约,以便于Kafka的生产者和消费者之间都能理解消息中的语义。最好地方就是在Kafka基础之上增加一层应用层的消息协议,比如JSON格式、比如二进制编解码协议(序列化),出于性能考虑,一般也不直接使用Java POJO对象的原生序列化(虽然可行)。在Apache Spark中使用的Kryo Register,由于场景限制(不提供IDL定义),不适用Kafka。
下面对常见的几个序列化框架做一个横向对比:
几种主流序列化对比
当前比较流行的有JSON[1], Apache Avro[2], Google开源的Protocol Buffer[3],Apache Thrift[4]。
| 消息格式 | JSON | Apache Avro | Protocol Buffer |
|---|---|---|---|
| License | ECMA-404标准 | Apache License 2.0 | BSD License |
| IDL | 无IDL定义,也就意味着系统间无契约 | 通过JSON定义,灵活度不够。语言无关。 | 类似Thrift格式,灵活定义,支持Any类型 |
| Code Generator | 无,但是应该可以找到对应的开源工具 | 有 | 有 |
| 性能 | 低 | 高 | 高 |
| 兼容性 | 高 | 前向兼容 | 前向兼容 |
| JSON<->二进制 | 支持 | 支持,但是非标准JSON | 支持 |
| 支持语言 | 几乎所有 | Java/C++/C/C# | Java/Python/C++。 其他语言有对应开源库,比如Nodejs可以使用暴雪开源库。 |