Современный Фреймворк Spring Boot позволяет писать очень многие вещи писать современным программистам в две-три строчки, просто подключив нужную зависимость, для этого нужно уметь хорошо ориентироваться в возможностях этого Фреймворка, но есть вещи, которые всё же приходится писать руками.

В событийном сегменте сегодня для разработки очень популярна Kafka и Spring Boot её поддерживает, но, если рассматривать формат сериализации сообщений Avro, ключевая особенность которого максимально возможное сжатие и отсутствие ключей в передаваемых сообщениях, а наличие только значений.

Сегодня Spring Boot поддерживает не в полной мере Avro, для корректной работы этой технологи приходится использовать конфигурирование на основе обычного Spring, не Boot. А дело вот в чём:

spring:
  kafka:
    producer:
      bootstrap-servers: localhost:9091
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: io.confluent.kafka.serializers.KafkaAvroSerializer

Здесь можно задать KafkaAvroSerializer, но эта штука не поддерживает одно важное для Avro формата поле – URL до Schema Registry.

Schema Registry – инфраструктурный компонент для хранения схем в формате Avro.

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

config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, localhost:9091);
config.put(ConsumerConfig.GROUP_ID_CONFIG, "group");
config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, KafkaAvroDeserializer.class);
config.put(AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, http://localhost:8081/);

В моём случае требовалось написать потребителя для messaging системы основанной на Kafka с применением Avro  сериализации, и когда описанные выше хитрости были применены и требуемый функционал заработал потребовалось протестировать результат перед деплоем на продакшн.

Функциональную часть я опущу, но в таких задачах на стороне consumer часто требуется записать результат в реляционную базу данных, а это хотелось бы проверить под нагрузкой – как будет работать при получениях сотен тысяч или миллиона событий за N времени. Для этого пришлось написать свой собственный Эмулятор consumer, который бы позволил на тестовых стендах проверить поведение испытуемого приложения.

Конфигурирование бина producer выглядело в моём случае так:

@Bean 
public ProducerFactory<String, byte[]> producerFactory() {  
  Map<String, Object> configProps = new HashMap<>();
  config.put(config.BOOTSTRAP_SERVERS_CONFIG,propertiesKafkaConfig.getBootstrapServers());
  config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class);
  config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);                                        
  return new DefaultKafkaProducerFactory<>(configProps); 
}

Если у вас используется SSL – нужно будет параметризовать значения хранилища ключей и сертификатов, а также паролей к ним.

И тут вот какая тонкость - в этом конфиге не встречается слово Avro! И вот почему: для того чтобы протестировать консьюмера – продюсеру не обязательно знать бизнес-логику и даже не нужно разбираться в формате передаваемых сообщений, для теста может вполне сгодиться не параметризованное сообщение, которое будет направляться в исходном виде.

А для этого нужно две вещи:

  1. перехватить сообщение в виде набора байтов.

  2. отправить нужное количество cообщений в виде набора байтов.

Для решения второй задачи хорошо подходит ByteArraySerializer упомянутый выше в примере кода, всё что остаётся сохранить в файлик нужный набор байт, а затем считать его и отправить его консьюмером цикле нужное количество раз с нужным интервалом.

С отправкой сложностей возникнуть не должно, можно использовать, например, эту https://www.baeldung.com/spring-kafka статью по написанbю Hello, world! продюсера.

Так и считать сообщение не сложно, может пригодиться консольный консьюмер который явит набор байт, но я сторонник графических интерфейсов, что возможно осудят бородатые программисты, и для этой задачи хорошо подошла программа Kafka Tools, которая была переименована в Offset Explorer и доступна по ссылке https://kafkatool.com/download.html

Именно в ней можно легко подключившись к Kafka топику, взять нужное сообщение в виде массива байт и использовать в дальнейшем.

Таких не сложных действий отказывается достаточно для проведения нагрузочного тестирования Kafka Avro консьюмера.

А вот не менее популярное приложение – AKHQ использовать для данных целей не удалось, так как оно не позволяет сохранить нужный набор байт.

Спасибо за прочтение.

Комментарии (0)