Kafka:消息格式的选择 Avro JSON XML String JavaBean

使用Kafka是应该用怎样的消息格式才是最优?

决定我们使用何种消息格式考虑的因素有两种,一个是方便,一个效率。

就方便来说其实就是数据的转换(或者Mapping),效率包括时间和空间两个维度,当然能压缩最小无论是空间还是时间都是良好的选择。所以不同的场景应该有不同的最优,Kafka提供了String和Byte数组两种选择,分别为:

org.apache.kafka.common.serialization.ByteArraySerializer

org.apache.kafka.common.serialization.StringSerializer

使用前者时可以使用官方推荐的Avro,或者自定义的序列化Bean。

后者主要是简单消息或者JSON,还有XML(比较少用)。

如果一句话能说清楚,当然用String

JSON是最常用的消息,因为它足够灵活,又没有XML那么罗嗦,而且支持的语言又多,几乎是计算机行业的自然语言了。所以采用JSON在数据转换方面的工作量肯定是比较小的。

它的劣势就是由于它每条记录都需要Key,所以在大数据时,其实它有大量的数据冗余(和二维表比较,二维表只有一行是Name),另外一方面的劣势就是它不够明白,需要额外的文档来说明每一个字段。

还有就是在操作的时候,其实是大量的String截取操作,也不经济。

使用Kafka的时候,如果我们要保留大量数据,存储是一个要考虑的重要因素。

所以当我们的数据格式固定时,应该避免直接JSON,可以考虑使用Avro。

 

那什么时候使用JSON呢?

我觉得当我们的数据格式完全不固定,而且大量的文字性的消息,例如从网上爬取一篇文章,然后分词,做摘要,最后存储到ElasticSearch里面做检索,这么一个流程,使用JSON其实是免去了很多转换工作。

Avro是官方推荐,有一篇文章(https://www.confluent.io/blog/avro-kafka-data/)解释了它的诸多好处。我觉得它的好处就是解决了JSON的一些问题,但增加了一道转换的工序。

另外说一下JavaBean,JavaBean的好处自然就是它是一个对象,直接用,没有额外的转换,它的缺点除了具备JSON所有的缺点外,它还不够灵活。

所以一般不用,除非是做一个临时解决方案。

但如果自己去实现序列化就另当别论了

例如,如果你想搜集用户行为,用户行为数据一般有固定的格式,例如帐户、姓名、事件、时间等,把这些信息序列化成一个数组,发送给消费者,无论是存储还是传递效率都是最高的。

这里有一个例子(https://github.com/iandow/kafka_junit_tests/blob/master/src/test/java/com/mapr/sample/TypeFormatSpeedTest.java)

原文参考:https://blog.csdn.net/u010721183/article/details/79935300

其他:

kafka客户端Producer和Consumer关于自定义消息序列和反序列

https://blog.csdn.net/fyhailin/article/details/80501390

你可能感兴趣的:(kafka)