Современный Фреймворк 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! И вот почему: для того чтобы протестировать консьюмера – продюсеру не обязательно знать бизнес-логику и даже не нужно разбираться в формате передаваемых сообщений, для теста может вполне сгодиться не параметризованное сообщение, которое будет направляться в исходном виде.
А для этого нужно две вещи:
перехватить сообщение в виде набора байтов.
отправить нужное количество cообщений в виде набора байтов.
Для решения второй задачи хорошо подходит ByteArraySerializer упомянутый выше в примере кода, всё что остаётся сохранить в файлик нужный набор байт, а затем считать его и отправить его консьюмером цикле нужное количество раз с нужным интервалом.
С отправкой сложностей возникнуть не должно, можно использовать, например, эту https://www.baeldung.com/spring-kafka статью по написанbю Hello, world! продюсера.
Так и считать сообщение не сложно, может пригодиться консольный консьюмер который явит набор байт, но я сторонник графических интерфейсов, что возможно осудят бородатые программисты, и для этой задачи хорошо подошла программа Kafka Tools, которая была переименована в Offset Explorer и доступна по ссылке https://kafkatool.com/download.html
Именно в ней можно легко подключившись к Kafka топику, взять нужное сообщение в виде массива байт и использовать в дальнейшем.
Таких не сложных действий отказывается достаточно для проведения нагрузочного тестирования Kafka Avro консьюмера.
А вот не менее популярное приложение – AKHQ использовать для данных целей не удалось, так как оно не позволяет сохранить нужный набор байт.
Спасибо за прочтение.