Из каких основных компонентов состоит Apache Kafka?

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

Ответ

Архитектура Apache Kafka строится из нескольких взаимосвязанных компонентов:

  1. Брокер (Broker)

    • Что это: Отдельный сервер (нода) в кластере Kafka. Хранит данные, обрабатывает запросы на запись и чтение.
    • Зачем: Кластер состоит из нескольких брокеров для обеспечения масштабируемости, отказоустойчивости и распределения нагрузки. Каждый брокер идентифицируется уникальным ID.
  2. Топик (Topic)

    • Что это: Логическая категория или канал, в который публикуются сообщения. Аналог таблицы в БД или темы в очереди.
    • Зачем: Позволяет разделять данные по типам событий (например, user-registrations, payment-events).
  3. Партиция (Partition)

    • Что это: Топик физически делится на одну или несколько упорядоченных, неизменяемых последовательностей записей — партиций.
    • Зачем: Обеспечивает параллелизм и масштабирование. Разные партиции топика могут обслуживаться разными брокерами. Порядок гарантируется только в пределах одной партиции.
    • Репликация: Каждая партиция реплицируется на несколько брокеров (один лидер для записи/чтения, остальные — follower-ы для отказоустойчивости).
  4. Продюсер (Producer)

    • Что это: Клиентское приложение, публикующее (пишущее) сообщения в топики Kafka.
    • Зачем: Определяет, в какую партицию топика отправить сообщение (по ключу или round-robin).
    • Пример (Java):

      Properties props = new Properties();
      props.put("bootstrap.servers", "broker1:9092,broker2: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)) {
          ProducerRecord<String, String> record = 
              new ProducerRecord<>("my-topic", "user123", "{"event":"login"}");
          producer.send(record); // Асинхронная отправка
      }
  5. Консьюмер (Consumer)

    • Что это: Клиентское приложение, читающее сообщения из топиков.
    • Зачем: Консьюмеры объединяются в группы (Consumer Groups). Каждая партиция топика потребляется только одним консьюмером из группы, что позволяет масштабировать обработку.
  6. ZooKeeper / KRaft (Контроллер)

    • Что это: Служба управления метаданными кластера (до версии Kafka 3.0+ — Apache ZooKeeper, в новых версиях — встроенный Raft-консенсус KRaft).
    • Зачем: Отвечает за выбор лидера партиций, отслеживание состояния брокеров, конфигурацию ACL. Важно: В актуальных версиях Kafka стремится к полному отказу от ZooKeeper в пользу KRaft.

Взаимосвязь: Продюсеры пишут данные в партиции топиков на брокерах. Консьюмеры читают эти данные, отслеживая свою позицию (offset). Координацией всего процесса управляет контроллер (ZooKeeper/KRaft).