Что такое Apache Kafka и его основные компоненты?

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

Ответ

Apache Kafka — это распределенная, отказоустойчивая, высокопроизводительная платформа потоковой передачи событий (event streaming platform), работающая по принципу публикации-подписки (pub/sub). Она используется для построения реальных потоковых данных (real-time data pipelines) и приложений.

Основные компоненты архитектуры Kafka:

  1. Топик (Topic): Именованный канал или категория, в которую публикуются сообщения. Сообщения в топике упорядочены.
  2. Партиция (Partition): Топик делится на одну или несколько партиций для параллельной обработки и масштабирования. Каждое сообщение в партиции имеет уникальный offset (смещение).
  3. Producer (Продюсер): Клиентское приложение, которое публикует (пишет) сообщения в топик Kafka.
  4. Consumer (Консьюмер): Клиентское приложение, которое подписывается на топик(и) и читает сообщения.
  5. Consumer Group: Группа консьюмеров, совместно обрабатывающих сообщения из топика. Каждое сообщение в партиции доставляется только одному консьюмеру в группе, что обеспечивает балансировку нагрузки.
  6. Broker (Брокер): Сервер Kafka, который хранит данные и обслуживает запросы клиентов. Кластер Kafka состоит из нескольких брокеров.
  7. ZooKeeper (до версии 3.x): Координировал кластер (выбор лидера, конфигурация). В Kafka 3.0+ используется встроенный механизм KRaft (Kafka Raft).

Простой пример Producer на Java:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

try (Producer<String, String> producer = new KafkaProducer<>(props)) {
    // Создание записи для топика "orders"
    ProducerRecord<String, String> record = 
        new ProducerRecord<>("orders", "order-123", "{"item":"book"}");
    // Асинхронная отправка
    producer.send(record, (metadata, exception) -> {
        if (exception == null) {
            System.out.printf("Сообщение отправлено в топик %s, партиция %d, offset %d%n",
                metadata.topic(), metadata.partition(), metadata.offset());
        } else {
            exception.printStackTrace();
        }
    });
}

Типичные сценарии использования:

  • Обмен сообщениями между микросервисами (Event-Driven Architecture).
  • Сбор и агрегация логов и метрик.
  • Трансформация и обработка потоков данных в реальном времени (Kafka Streams).
  • Трансляция событий от источника к хранилищу (CDC).