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可以使用暴雪开源库。

  1. 1.http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
  2. 2.https://avro.apache.org/
  3. 3.https://developers.google.com/protocol-buffers
  4. 4.https://thrift.apache.org/