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

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

Ответ

Опыт работы с Apache Kafka включает разработку, настройку и эксплуатацию в production-среде в течение 2+ лет.

Ключевые области опыта

  1. Развертывание и администрирование

    • Настройка Kafka-кластера из 3 брокеров (Zookeeper ensemble из 3 узлов).
    • Конфигурация репликации (factor=3) и партиционирования для отказоустойчивости и параллелизма.
    • Мониторинг через JMX-метрики, интеграция с Prometheus/Grafana.
  2. Разработка Producer и Consumer на Java

    • Использование как нативного Kafka Client API, так и Spring Kafka.
    • Настройка критических параметров для надежности и производительности.

    Пример Producer с гарантией доставки:

    @Configuration
    public class KafkaProducerConfig {
        @Bean
        public ProducerFactory<String, OrderEvent> producerFactory() {
            Map<String, Object> config = new HashMap<>();
            config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka1:9092,kafka2:9092");
            config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
            config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
            // Гарантии доставки
            config.put(ProducerConfig.ACKS_CONFIG, "all"); // Ждем подтверждения от всех реплик
            config.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true); // Идемпотентность
            config.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, 5); // При включенной идемпотентности
            return new DefaultKafkaProducerFactory<>(config);
        }
    }

    Пример Consumer с ручным управлением offset:

    @KafkaListener(topics = "orders", groupId = "order-processor")
    public void listen(OrderEvent event, Acknowledgment ack) {
        try {
            processOrder(event); // Обработка
            ack.acknowledge(); // Ручное подтверждение после успешной обработки
        } catch (Exception e) {
            // Отправка в dead-letter topic или повторная обработка
            sendToDlt(event, e);
        }
    }
  3. Обеспечение семантики Exactly-Once (EOS)

    • Использование Kafka Transactions API для атомарной записи в несколько топиков.
    • Паттерн «Consumer-Transform-Producer» в рамках одной транзакции.
  4. Обработка потоков данных

    • Использование Kafka Streams для построения приложений реального времени (агрегации, соединения потоков).
    • Понимание таких концепций, как KTable vs KStream, состояние (state stores), оконные операции.
  5. Решение практических проблем

    • Оптимизация пропускной способности: настройка batch.size, linger.ms, compression.type.
    • Обработка ребалансировки потребителей (rebalance) без потерь данных.
    • Работа со схемами данных через Apache Avro и Confluent Schema Registry.

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