与 AVRO 相比,在 kafka 流中使用 JSON 序列化程序是否会导致性能下降?

Does using JSON serializer in kafka streams cause a performance hit compared to AVRO?

我在我的 Kafka Streams 应用程序中为 JSON 使用以下配置,

properties.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG,
            Serdes.String().getClass());
properties.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG,
            GenericJSONSerde.class);
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
            com.buy.json.JsonSerializer.class);
properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
            com.buy.json.JsonDeserializer.class);
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
            com.buy.json.JsonSerializer.class);

为了衡量性能,我删除了所有逻辑以及我从 IN 主题收到的所有内容,我只是将其推送到 OUT 主题。处理350,000条记录需要3分钟

但是当我使用 AVRO 时,同一个流应用程序在 1 分钟内处理了 300 万条记录。这是我的 AVRO 配置,

  `properties.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG,
            Serdes.String().getClass());
    properties.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG,
            GenericAvroSerde.class);
    properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
            io.confluent.kafka.serializers.KafkaAvroSerializer.class);
    properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
            io.confluent.kafka.serializers.KafkaAvroSerializer.class);
    properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
            io.confluent.kafka.serializers.KafkaAvroDeserializer.class);
    properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
            io.confluent.kafka.serializers.KafkaAvroDeserializer.class);` 

我正在编写的流应用程序应该支持两者AVRO/JSON。我将在启动流应用程序时决定。

我的问题是:使用 JSON 是否会影响 Streams 应用程序的性能?请说明。

注意:对于 Confluent 的模式注册表,模式首先通过 HTTP 发送,如评论中所述。

AVRO 显然很快,因为它提供了一种紧凑的二进制数据格式。在序列化期间有一个动态类型和数据标记的概念。

在 AVRO 的情况下,数据和模式(以 JSON 的形式)总是在一起,因此在反序列化过程中数据类型信息的大小变得更小,更好地处理静态数据类型和更少的代码生成.

在 JSONSerializer 的情况下不存在。

与 AVRO 相比,JSON 通常可能更慢,因为 JSON 是一种基于文本的格式,而 AVRO 是一种二进制格式。这与 Kafka Streams 无关。

JSON编码的数据量一般较大,影响网络传输吞吐量。 AVRO 通常 de-/serialized 可能比 JSON 快。

有关更多信息,请参阅以下 2017 年的比较:https://labs.criteo.com/2017/05/serialization/