Какой у вас опыт тестирования Apache Kafka?

«Какой у вас опыт тестирования Apache Kafka?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Есть опыт тестирования кластеров Apache Kafka, фокусируясь на надежности, производительности и отказоустойчивости.

Основные направления тестирования:

  1. Функциональность Producer/Consumer:

    • Корректность сериализации/десериализации сообщений.
    • Работа с различными типами Acks (all, 1, 0).
    • Обработка ошибок и повторные отправки.
  2. Гарантии доставки: Проверка семантик at-least-once, exactly-once (с использованием транзакций).

  3. Отказоустойчивость и ребалансировка:

    • Поведение Consumer Group при добавлении/удалении консьюмеров.
    • Восстановление после отключения брокера (лидера партиции).
  4. Производительность: Использование kafka-producer-perf-test и kafka-consumer-perf-test для замеров throughput и задержек.

Пример юнит-теста для Producer (Java):

@Test
void shouldProduceMessageToKafka() throws Exception {
    Properties props = new Properties();
    props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    props.put(ProducerConfig.ACKS_CONFIG, "all"); // Ждем подтверждения от всех реплик

    try (KafkaProducer<String, String> producer = new KafkaProducer<>(props)) {
        ProducerRecord<String, String> record = 
            new ProducerRecord<>("test-topic", "test-key", "test-value");
        Future<RecordMetadata> future = producer.send(record);
        RecordMetadata metadata = future.get(5, TimeUnit.SECONDS);
        assertThat(metadata.topic()).isEqualTo("test-topic");
        assertThat(metadata.partition()).isGreaterThanOrEqualTo(0);
    }
}