Какие основные API и сервисы предоставляет Apache Kafka?

Ответ

Apache Kafka — это распределенная потоковая платформа, которая предоставляет несколько ключевых API для разных сценариев работы с данными:

  1. Producer API — позволяет приложениям (продюсерам) публиковать потоки записей в топики Kafka.

    • Ключевые концепции: ключ сообщения (для партиционирования), значение, acknowledgment (acks), retry-логика.
  2. Consumer API — позволяет приложениям (консьюмерам) подписываться на топики и обрабатывать потоки записей.

    • Ключевые концепции: consumer groups, offset management (автоматическое или ручное), балансировка нагрузки между консьюмерами в группе.
  3. Kafka Streams API — библиотека для построения потоковых приложений и микросервисов, которые занимаются обработкой данных прямо в Kafka.

    • Что позволяет: выполнять операции в реальном времени — фильтрацию, трансформацию, агрегацию, соединение потоков.
    • Пример: подсчет событий в окне времени.
  4. Kafka Connect API — фреймворк для надежной и масштабируемой интеграции Kafka с внешними системами (базами данных, облачными хранилищами, legacy-системами).

    • Компоненты: Connectors (Source — для импорта данных в Kafka, Sink — для экспорта из Kafka).
  5. Admin API — позволяет программно управлять и инспектировать топики, брокеры и другие объекты Kafka.

    • Примеры использования: создание топиков, изменение конфигураций, мониторинг метрик кластера.

Пример создания простого продюсера на Java:

import org.apache.kafka.clients.producer.*;
import java.util.Properties;

public class SimpleProducer {
    public static void main(String[] args) {
        // 1. Конфигурация продюсера
        Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
                  "org.apache.kafka.common.serialization.StringSerializer");
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
                  "org.apache.kafka.common.serialization.StringSerializer");
        // Гарантия доставки
        props.put(ProducerConfig.ACKS_CONFIG, "all");

        // 2. Создание экземпляра продюсера
        try (Producer<String, String> producer = new KafkaProducer<>(props)) {
            // 3. Создание и отправка записи
            ProducerRecord<String, String> record =
                new ProducerRecord<>("my-orders", "order-123", "{"status":"paid"}");

            // 4. Асинхронная отправка с callback для обработки результата
            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();
                }
            });
        }
    }
}

Ответ 18+ 🔞

А, вот ты где, Кафка, сука! Ну что, разберём, что это за зверь такой, на котором пол-интернета держится, а половина разработчиков плачет.

Это, блядь, распределённая потоковая платформа, не просто очередной брокер сообщений, а целая ебаная экосистема. У неё там целый зоопарк API на разные случаи жизни.

Producer API — это для тех, кто хочет что-то в Кафку засунуть. Продюсеры, блядь. Кидают записи в топики. Главное тут не обосраться с настройками: ключ сообщения (чтобы в одну партицию летело), само значение, подтверждения (acks) — если поставить acks=0, то это как крикнуть в лес и надеяться, что эхо донесёт, и логика повторных попыток, а то сеть — она такая, сука, ненадёжная.

Consumer API — это уже для вытаскивания. Консьюмеры подписываются на топики и жрут данные. Тут главная магия — consumer groups. Все консьюмеры в одной группе делят топик между собой, как голодные псы миску. И offset management, управление смещением — либо Кафка сама запомнит, что ты прочитал, либо ты сам ручками ковыряешь, если хочешь поумничать.

Kafka Streams API — это уже для крутых ребят, которые хотят данные прямо в потоке обрабатывать. Не просто читать-писать, а фильтровать, трансформировать, агрегировать. Например, посчитать, сколько заказов за последнюю минуту прилетело. Библиотека, блядь, целая, для построения микросервисов, которые прямо внутри Кафки мозги включают.

Kafka Connect API — это вообще отдельная песня. Фреймворк для того, чтобы Кафку со всем подряд соединить. С базой данных, с облачным хранилищем, с каким-нибудь legacy-монстром, который на COBOL написан. Есть коннекторы Source — они тащат данные в Кафку, и Sink — которые выливают данные из Кафки куда надо. Надёжно и масштабируемо, чтоб не разъебаться на ровном месте.

Admin API — это для админов и всяких автоматизаторов. Позволяет из кода управлять всей этой кухней: топики создавать, конфиги менять, метрики смотреть. Удобно, когда руками в консоли уже заёбываешься.

А вот, смотри, как это выглядит в коде, когда ты хочешь что-то отправить. Простой продюсер на Java:

import org.apache.kafka.clients.producer.*;
import java.util.Properties;

public class SimpleProducer {
    public static void main(String[] args) {
        // 1. Конфигурация продюсера
        Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
                  "org.apache.kafka.common.serialization.StringSerializer");
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
                  "org.apache.kafka.common.serialization.StringSerializer");
        // Гарантия доставки
        props.put(ProducerConfig.ACKS_CONFIG, "all");

        // 2. Создание экземпляра продюсера
        try (Producer<String, String> producer = new KafkaProducer<>(props)) {
            // 3. Создание и отправка записи
            ProducerRecord<String, String> record =
                new ProducerRecord<>("my-orders", "order-123", "{"status":"paid"}");

            // 4. Асинхронная отправка с callback для обработки результата
            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();
                }
            });
        }
    }
}

Видишь? acks="all" — это чтобы брокеры все подтвердили получение, надёжно, мать его. А callback — это чтобы понять, улетело твоё сообщение или, как обычно, всё накрылось медным тазом где-то в сети. Вот так, блядь, вкратце. А если вдаваться в детали — это на неделю рассказов, ёпта.