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

aru*_*nan 3 json apache-kafka apache-kafka-streams

我在 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);
Run Code Online (Sandbox Code Playgroud)

为了衡量性能,我删除了所有逻辑以及从 IN 主题收到的所有内容,我只是将其推送到 OUT 主题。处理35万条记录需要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);` 
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:在 Streams 应用程序中使用 JSON 会影响性能吗?请澄清。

Div*_*mmy 7

注意:对于 Confluence 的架构注册表,架构首先通过 HTTP 发送,如评论中所述。

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

在 AVRO 的情况下,数据和模式(以 JSON 形式)始终在一起,因此在反序列化期间数据类型信息的大小变得更小,更好地处理静态数据类型并减少代码生成。

这在 JSONSerializer 的情况下不存在。