Ответ
Apache Kafka — это распределенная, отказоустойчивая, высокопроизводительная платформа потоковой передачи событий (event streaming platform), работающая по принципу публикации-подписки (pub/sub). Она используется для построения реальных потоковых данных (real-time data pipelines) и приложений.
Основные компоненты архитектуры Kafka:
- Топик (Topic): Именованный канал или категория, в которую публикуются сообщения. Сообщения в топике упорядочены.
- Партиция (Partition): Топик делится на одну или несколько партиций для параллельной обработки и масштабирования. Каждое сообщение в партиции имеет уникальный offset (смещение).
- Producer (Продюсер): Клиентское приложение, которое публикует (пишет) сообщения в топик Kafka.
- Consumer (Консьюмер): Клиентское приложение, которое подписывается на топик(и) и читает сообщения.
- Consumer Group: Группа консьюмеров, совместно обрабатывающих сообщения из топика. Каждое сообщение в партиции доставляется только одному консьюмеру в группе, что обеспечивает балансировку нагрузки.
- Broker (Брокер): Сервер Kafka, который хранит данные и обслуживает запросы клиентов. Кластер Kafka состоит из нескольких брокеров.
- 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).