Ответ
Apache Kafka — это распределенная потоковая платформа, которая предоставляет несколько ключевых API для разных сценариев работы с данными:
-
Producer API — позволяет приложениям (продюсерам) публиковать потоки записей в топики Kafka.
- Ключевые концепции: ключ сообщения (для партиционирования), значение, acknowledgment (
acks), retry-логика.
- Ключевые концепции: ключ сообщения (для партиционирования), значение, acknowledgment (
-
Consumer API — позволяет приложениям (консьюмерам) подписываться на топики и обрабатывать потоки записей.
- Ключевые концепции: consumer groups, offset management (автоматическое или ручное), балансировка нагрузки между консьюмерами в группе.
-
Kafka Streams API — библиотека для построения потоковых приложений и микросервисов, которые занимаются обработкой данных прямо в Kafka.
- Что позволяет: выполнять операции в реальном времени — фильтрацию, трансформацию, агрегацию, соединение потоков.
- Пример: подсчет событий в окне времени.
-
Kafka Connect API — фреймворк для надежной и масштабируемой интеграции Kafka с внешними системами (базами данных, облачными хранилищами, legacy-системами).
- Компоненты: Connectors (Source — для импорта данных в Kafka, Sink — для экспорта из Kafka).
-
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 — это чтобы понять, улетело твоё сообщение или, как обычно, всё накрылось медным тазом где-то в сети. Вот так, блядь, вкратце. А если вдаваться в детали — это на неделю рассказов, ёпта.