【发布时间】:2020-02-21 15:05:29
【问题描述】:
我在我的 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。我会在启动流应用程序时决定。
我的问题是:在 Streams 应用程序中使用 JSON 是否会影响性能?请澄清。
【问题讨论】:
-
除了我的回答之外,我建议您只坚持使用 AVRO,因为它已经为您提供了类似于 JSON 的数据模式表示以及性能!
-
对于 AVRO,我们需要专门设置一个单独的主题,但在我的情况下,在单个主题中我需要支持多种格式,这就是我们使用 JSON 的主要原因。有什么方法可以提高性能。将序列化器和反序列化器保持为字符串并在流应用程序内转换为 JSON?我迫切需要提高性能。任何帮助将不胜感激!
-
您可以拥有一个包装类,并使用杰克逊或类似库将您的对象转换为逻辑层中的字符串。使用 AVRO 发布包装对象,并在消费者端使用 jackson 将字符串值转换为对象。对于正确的转换,您可以在包装器对象中保存一个类名。另外,我建议您针对相同的问题发布不同的问题。
-
如果任何一个答案给出了你的答案,请标记它。
标签: json apache-kafka apache-kafka-streams