Вызывает ли использование сериализатора JSON в потоках kafka снижение производительности по сравнению с AVRO? - PullRequest
2 голосов
/ 25 октября 2019

Я использую следующую конфигурацию для JSON в своем приложении Kafka Streams,

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, я просто подталкиваю ее кВне темы. Обработка 350 000 записей

занимает 3 минуты. Но когда я использую AVRO, то же потоковое приложение обрабатывает 3 миллиона записей всего за 1 минуту. Вот моя конфигурация 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 снижает производительность в приложении Streams? Пожалуйста, уточните.

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

По сравнению с AVRO, JSON в целом может быть медленнее, потому что JSON - это текстовый формат, тогда как AVRO - это двоичный формат. Это не зависит от потоков Кафки.

Размер данных, закодированных в JSON, обычно больше, что влияет на пропускную способность сети. Обычно AVRO может быть де-сериализован быстрее, чем JSON.

Для получения дополнительной информации см. Следующее сравнение с 2017 годом: https://labs.criteo.com/2017/05/serialization/

2 голосов
/ 25 октября 2019

Примечание. В случае реестра схем Confluent схема сначала отправляется по HTTP, как описано в комментариях.

AVRO, очевидно, работает быстро, поскольку обеспечивает компактный двоичный формат данных. Существует концепция динамической типизации и тегирования данных во время сериализации.

В случае AVRO данные и схема (в форме JSON) всегда вместе, поэтому размер информации о типе данных при десериализации уменьшается, улучшается обработка статических типов данных и меньше генерируется код.

Это отсутствует в случае JSONSerializer.

...