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

Ответ

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).

Ответ 18+ 🔞

Давайте разберем эту вашу Кафку, чтобы стало понятно, как она работает, а не просто набор умных слов, от которых мозг вскипает, как чайник у бабки на плите.

Представьте себе огромную, блядь, конвейерную ленту на заводе. Это и есть Apache Kafka — платформа, которая гоняет события (event streaming) туда-сюда, не останавливаясь. Не просто гоняет, а делает это так, что если половина завода сгорит, вторая половина будет дальше тащить эти ящики с сообщениями. Отказоустойчивость, ёпта!

Теперь по полочкам, а то вы уже глазами хлопаете.

Из чего эта штука состоит, или Кто есть кто в этом цирке:

  1. Топик (Topic). Это как тематический канал в телеге, только для роботов. Хотите слать заказы — топик orders. Хотите слать логи — топик application-logs. Все сообщения по теме идут в свою очередь. Проще пареной репы, блядь.

  2. Партиция (Partition). А вот тут начинается магия. Чтобы одна очередь не превратилась в пробку на МКАДе, её делят на несколько полос — партиций. Сообщения раскидываются по ним, и их можно параллельно обрабатывать. В каждой партиции у каждого сообщения свой порядковый номер — offset. Потеряться не даст, хуле.

  3. Producer (Продюсер). Это тот мудак, который подъезжает к конвейеру и начинает сгружать на него ящики. То есть приложение, которое пишет сообщения в топик. «На, блядь, держи новый заказ!» — и кладет запись в orders.

  4. Consumer (Консьюмер). А это работяга на другом конце ленты, который эти ящики снимает и тащит на склад. Приложение, которое читает сообщения из топика. «О, новый заказ пришел, ща его в базу запихну».

  5. Consumer Group (Группа консьюмеров). А что, если ящики такие тяжелые, что один работяга не справляется? Нанимаем бригаду! Группа консьюмеров — это и есть бригада. Каждому работяге дают свою полосу конвейера (партицию), и они не мешают друг другу. Одно сообщение из партиции читает только один консьюмер из группы. Балансировка нагрузки, ебать её в сраку! Красота.

  6. Broker (Брокер). Это сам сервер Кафки, на котором всё это безобразие крутится. Один брокер — это как один цех с конвейером. А чтобы завод был большой, цехов делают много. Это и есть кластер.

  7. ZooKeeper (до версии 3.x). Это был такой надзиратель-бухгалтер, который следил, чтобы все цеха работали слаженно, а начальники (лидеры партиций) не перепились. Но он был отдельной головной болью. Сейчас, слава богу, в новых версиях от него избавились (KRaft), и Кафка сама всем управляет. Упростили, мать их, наконец-то.

Вот смотри, как продюсер выглядит в коде. Ничего сложного:

// Настраиваем свойства, как чайник — кнопку нажать
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", ключ "order-123", значение JSON
    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();
        }
    });
}
// Всё, поехали. Producer сам закроется благодаря try-with-resources.

А где эту Кафку, спрашивается, применять? Да везде, блядь!

  • Общение микросервисов. Один сервис крикнул в топик «Пользователь зарегался!», а десяток других подхватили это событие и сделали кто уведомление, кто бонус начислил, кто в CRM записал. Event-Driven Architecture, ёбушки-воробушки!
  • Сбор логов. Все приложения плюются своими логами не каждый в свою помойку, а в общую Кафку. А оттуда уже можно и в ElasticSearch, и в мониторинг, и куда душа пожелает.
  • Обработка в реальном времени (Kafka Streams). Приехали данные — сразу их фильтруй, агрегируй, обогащай и отправляй дальше. Прямо на лету, без остановки конвейера.
  • Копирование данных из БД (CDC). База данных чихнула — в Кафку сразу летит событие «В таблице users новая запись». И все подписчики сразу в курсе. Никакого опроса базы каждые 5 секунд, ебать мои старые костыли!

Вот и вся магия. Не боги горшки обжигают, а админы Кафку настраивают. Главное — начать.