Коротко: Apache Kafka — це розподілена платформа для потокової передачі та обробки подій у реальному часі, яка дозволяє передавати великі обсяги повідомлень між сервісами з високою пропускною здатністю та відмовостійкістю. Kafka зберігає події як append-only лог і підходить для real-time аналітики, інтеграції мікросервісів та побудови data pipeline. Для простих черг завдань або невеликих проєктів операційні витрати на Kafka, як правило, не виправдані.
Вступ
Уявіть: банківська система має перевірити транзакцію на фрод за частки секунди. Або платформа електронної комерції обробляє тисячі кліків на секунду під час розпродажу. Batch-обробка раз на ніч тут не допоможе — потрібна інфраструктура, яка працює в реальному часі.
Apache Kafka з’явилась у LinkedIn як внутрішній інструмент для обробки логів і стала одним із ключових компонентів у стеку сучасних data-команд. Сьогодні її використовують у фінтеху, ритейлі, телекомі та IoT — скрізь, де важлива швидкість і масштаб.
Ця стаття пояснює, як влаштована Kafka зсередини, де вона справді корисна, а де додасть зайвої складності — і дає мінімальний практичний старт для тих, хто хоче спробувати її в дії.
Як влаштована Apache Kafka і що відбувається всередині
Kafka як message broker: основна ідея за 2 хвилини
Kafka — це розподілена платформа для потокової передачі подій. Якщо спростити до метафори: уявіть центральну поштову систему між сервісами. Відправники (producers) кладуть повідомлення у пронумеровані скриньки (topics), а отримувачі (consumers) забирають їх у власному темпі — кожен незалежно від інших.
Ключова відмінність від традиційних черг: Kafka не видаляє повідомлення після прочитання. Вона зберігає їх як append-only лог із налаштованим retention — за часом або розміром. Це дозволяє кільком споживачам читати одні й ті самі події незалежно та повторно обробляти дані за потреби.
Ключові компоненти: Producer, Consumer, Topic, Partition, Broker
П’ять понять, які треба знати з першого дня:
- Producer — сервіс або застосунок, який публікує події у Kafka.
- Consumer — сервіс, який читає події з Kafka.
- Topic — іменований канал для певного типу подій (наприклад,
user-clicksабоpayment-transactions). - Partition — одиниця паралелізму всередині topic. Topic ділиться на N партицій, кожна з яких — окремий лог.
- Broker — вузол кластера Kafka, який зберігає партиції та обслуговує запити.
Producer → Topic [Partition 0] → Consumer Group A (Consumer 1)
[Partition 1] → Consumer Group A (Consumer 2)
[Partition 2] → Consumer Group A (Consumer 3)
→ Consumer Group B (Consumer 4) ← читає незалежно
Як Kafka зберігає повідомлення: лог як основна абстракція
Кожна партиція — це впорядкований, незмінний лог. Нові повідомлення дописуються в кінець. Кожне повідомлення отримує унікальний порядковий номер — offset.
Consumer сам відстежує, який offset він вже прочитав. Це дає гнучкість: можна перечитати події з певного моменту, що критично для відновлення після збоїв або повторної обробки даних.
Kafka гарантує порядок повідомлень у межах однієї партиції. Між різними партиціями порядок не гарантується — це важливо враховувати при проєктуванні.
Consumer Groups і паралельна обробка: чому це важливо
Consumer Group — це група консюмерів, які разом читають один topic. Kafka розподіляє партиції між ними: кожен консюмер у групі отримує свій набір партицій. Це горизонтальне масштабування читання.
Різні Consumer Groups читають один topic незалежно — кожна зі своїм offset. Це дозволяє, наприклад, одночасно відправляти події в аналітичну систему, ML-пайплайн і систему сповіщень без будь-якої координації між ними.
Щодо інфраструктури: до Kafka 4.0 управління метаданими кластера залежало від ZooKeeper як зовнішнього компонента. З Kafka 2.8 з’явився режим KRaft (Kafka Raft Metadata) — вбудований механізм консенсусу без ZooKeeper. У Kafka 3.3 KRaft став production-ready. У Kafka 4.0, випущеній у березні 2025 року, ZooKeeper повністю видалений — KRaft є єдиним підтримуваним режимом. Якщо ваш кластер досі працює на ZooKeeper, перед оновленням до 4.x необхідно спочатку мігрувати на KRaft у версії 3.9.
Де і коли використовують Apache Kafka: реальні сценарії застосування
Event streaming та real-time аналітика
Найпоширеніший сценарій — збір та обробка потоків подій у реальному часі. Типові кейси: аналітика поведінки користувачів на сайті, моніторинг фінансових транзакцій, збір даних з IoT-сенсорів, агрегація логів з мікросервісів.
Kafka Streams та ksqlDB дозволяють обробляти потоки в екосистемі Kafka: фільтрувати, агрегувати й джойнити стріми без потреби одразу підключати окремий зовнішній processing stack.
Що нового в Kafka 4.0
У березні 2025 року вийшла Kafka 4.0 — перший major release без ZooKeeper. Окрім архітектурних змін, версія принесла дві важливі новинки для практичного використання.
KIP-848: новий протокол ребалансування consumer groups. Попередній протокол зупиняв обробку повідомлень на час ребалансу («stop-the-world»). Новий протокол усуває цю проблему: брокер сам координує призначення партицій, що суттєво зменшує затримки при перезапусках і деплоях у великих кластерах. У Kafka 4.0 цей протокол досяг статусу GA і доступний через конфігурацію group.protocol=consumer на стороні клієнта.
KIP-932: черги у Kafka (Early Access). Kafka традиційно відрізнялася від класичних брокерів черг: у межах однієї consumer group кожну партицію обробляв один активний consumer. У Kafka 4.0 з’явилися share groups — рання функція для queue-like сценаріїв, де повідомлення з однієї партиції можуть розподілятися між кількома споживачами. Функція поки в статусі Early Access і не рекомендована для продакшену, але вона розширює роль Kafka в порівняннях із класичними message queue системами.
Інтеграція мікросервісів через event-driven архітектуру
У мікросервісній архітектурі сервіси часто комунікують через прямі API-виклики. Це створює щільну залежність: якщо один сервіс впав — ланцюжок зупиняється.
Kafka як шина подій вирішує цю проблему. Сервіс публікує подію в topic і не знає, хто її прочитає. Споживачі обробляють події незалежно та у своєму темпі. Це зменшує coupling між сервісами та підвищує стійкість системи до часткових відмов.
При побудові event-driven архітектури в enterprise-середовищі варто одразу закладати Data Governance — контроль схем даних, якість подій і відстеження лінії даних стають критичними при масштабуванні.
Real-time data pipeline: від джерела до сховища
Kafka часто виступає буфером між джерелами даних і їхніми споживачами. Дані з баз даних, API та логів потрапляють у Kafka, а звідти — в Data Warehouse, ElasticSearch, ML-системи або інші сховища.
Kafka Connect — окремий фреймворк для побудови таких інтеграцій без написання коду. Готові конектори є для PostgreSQL, MySQL, S3, Elasticsearch, Snowflake та десятків інших систем.
Kafka входить до стандартного стеку сучасного дата-інженера — поряд з Airflow, dbt та хмарними сховищами. Детальніше про весь інструментарій — у Must-have інструменти Data Engineer у 2026.
Kafka vs традиційні бази даних: де проходить межа
Kafka зберігає дані, але не є базою даних у класичному розумінні. Ядро Kafka не є SQL-рушієм і не замінює OLTP або OLAP сховища; для SQL-подібної роботи з потоками в її екосистемі використовують окремі інструменти, зокрема ksqlDB.
| Сценарій | Kafka підходить | Kafka надлишкова |
|---|---|---|
| Обробка мільйонів подій на секунду | High-throughput streaming | — |
| Інтеграція 10+ мікросервісів | Event bus між сервісами | — |
| Збір логів з продакшен-систем | Centralized log aggregation | — |
| Real-time аналітика поведінки | User activity tracking | — |
| Простий task queue (надіслати email) | — | Достатньо Celery + Redis |
| CRUD-операції з даними | — | Потрібна реляційна БД |
| Невелике й просте навантаження без складних streaming-вимог | — | RabbitMQ або Redis Streams |
| Команда без досвіду з розподіленими системами | — | Overhead не виправданий |
Як почати працювати з Apache Kafka: мінімальний практичний старт
Мета цього розділу — перший дотик, а не повноцінний туторіал. Показати, що старт простіший, ніж здається.
Запуск Kafka локально: Docker Compose за 5 хвилин
Перед запуском переконайтеся у відповідності версій Java: Kafka Clients і Kafka Streams вимагають Java 11+, тоді як Kafka Brokers, Connect і інструменти командного рядка — Java 17+. Це обов’язкова вимога починаючи з Kafka 4.0.
Для локального dev/demo-запуску найшвидший спосіб — Docker Compose з KRaft-режимом (без ZooKeeper):
version: '3.8'
services:
kafka:
image: confluentinc/cp-kafka:8.0.0
hostname: kafka
container_name: kafka
ports:
- "9092:9092"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
CLUSTER_ID: "MkU3OEVBNTcwNTJENDM2Qk"
Запуск (Kafka буде доступна на localhost:9092):
docker compose up -dДля візуального моніторингу топіків під час розробки — підніміть Kafka UI або Kafdrop: обидва мають Docker-образи і дають зручний веб-інтерфейс для перегляду повідомлень, партицій та consumer groups.
Простий Producer і Consumer на Python
Встановлення бібліотеки: pip install confluent-kafka
Producer:
from confluent_kafka import Producer
import json
producer = Producer({'bootstrap.servers': 'localhost:9092'})
def delivery_report(err, msg):
if err is not None:
print(f'Помилка доставки: {err}')
else:
print(f'Повідомлення доставлено: {msg.topic()} [{msg.partition()}] offset {msg.offset()}')
event = {
'user_id': 'u_123',
'action': 'page_view',
'page': '/products',
'timestamp': '2024-01-15T10:30:00Z'
}
producer.produce(
topic='user-events',
key='u_123',
value=json.dumps(event).encode('utf-8'),
callback=delivery_report
)
producer.flush() # Чекаємо підтвердження доставки перед завершенням
Consumer:
from confluent_kafka import Consumer
import json
consumer = Consumer({
'bootstrap.servers': 'localhost:9092',
'group.id': 'analytics-service',
'auto.offset.reset': 'earliest',
# За замовчуванням enable.auto.commit=True (at-least-once)
# Для ручного контролю: 'enable.auto.commit': False
})
consumer.subscribe(['user-events'])
try:
while True:
msg = consumer.poll(timeout=1.0)
if msg is None:
continue
if msg.error():
print(f'Помилка консюмера: {msg.error()}')
continue
event = json.loads(msg.value().decode('utf-8'))
print(f'Отримано подію: {event}')
# При enable.auto.commit=False — комітимо вручну після обробки
# consumer.commit(msg)
# Це важливо для at-least-once: якщо обробка впала до коміту,
# повідомлення буде прочитано повторно при перезапуску
finally:
consumer.close()
Типові помилки при роботі з Kafka та її реальні обмеження
Помилки архітектурного рівня
1. Kafka як сховище стану. Kafka зберігає події, але не є key-value сховищем. Якщо потрібно читати поточний стан об’єкта за ID — це завдання для Redis або PostgreSQL, а не для Kafka.
2. Один великий topic на всі події. У реальних проєктах це виглядає так: один topic all-events з десятками типів подій, різними схемами і різними consumer groups. Результат — складність фільтрації, проблеми з масштабуванням і плутанина при дебазі. Логічне розбиття на топіки за доменом або типом події — стандартна практика.
Помилки на рівні конфігурації та коду
3. Неправильний replication factor. replication.factor=1 означає, що дані зберігаються тільки на одному брокері. При його відмові дані можуть бути втрачені. Для продакшен-сценаріїв типовою рекомендацією є replication.factor=3 і min.insync.replicas=2, але конкретні значення залежать від вимог до доступності, бюджету та топології кластера.
4. Ігнорування offset management. At-least-once delivery — це норма в Kafka. Якщо consumer впав після читання, але до коміту offset, він перечитає повідомлення при перезапуску. Consumer має бути ідемпотентним: повторна обробка одного повідомлення не повинна спричиняти побічних ефектів.
5. Retention period без бізнес-вимог. Занадто короткий retention — і дані зникають раніше, ніж consumer їх обробив. Занадто довгий — диск переповнюється. Retention треба визначати виходячи з реальних потреб: скільки часу потрібно для відновлення після збою? Чи потрібне повторне відтворення подій?
6. Відсутність Schema Registry. Без контролю схем повідомлень зміна формату події в producer ламає consumers. Schema Registry (наприклад, Confluent Schema Registry з Avro або Protobuf) вирішує цю проблему і є стандартом у серйозних продакшен-системах.
Коли Kafka — це занадто
Kafka додає реальну складність: управління кластером, моніторинг брокерів, балансування партицій, оновлення версій. Ця складність виправдана при відповідному масштабі та вимогах.
Якщо у вас простий task queue, навантаження кілька сотень подій на хвилину або команда без досвіду з розподіленими системами — RabbitMQ або Redis Streams вирішать задачу з меншими операційними витратами.
Kafka — це інструмент із конкретним профілем застосування. Вибір на її користь має спиратися на технічні вимоги, а не на популярність технології.
FAQ: питання про Apache Kafka
Питання: Що таке Apache Kafka?
Відповідь: Apache Kafka — це розподілена платформа для потокової передачі та обробки подій у реальному часі. Вона дозволяє публікувати, зберігати та споживати потоки повідомлень між різними сервісами з високою пропускною здатністю та відмовостійкістю. Kafka зберігає повідомлення як append-only лог із налаштованим retention, що дає змогу кільком споживачам читати одні й ті самі події незалежно та повторно обробляти їх за потреби.
Питання: Як почати роботу з Apache Kafka?
Відповідь: Для старту достатньо підняти Kafka локально через Docker Compose — це займає кілька хвилин. Далі створюєте topic, запускаєте producer для відправки повідомлень і consumer для їх читання. Перший робочий pipeline можна зібрати за 15–20 хвилин. Офіційна документація на kafka.apache.org та практичні курси від Confluent Developer — хороші точки входу для подальшого заглиблення.
Питання: Apache Kafka vs RabbitMQ — що краще обрати?
Відповідь: Kafka і RabbitMQ вирішують різні задачі. Kafka оптимальна для великих обсягів даних, довготривалого зберігання подій і потокової аналітики — вона лог-орієнтована і добре масштабується горизонтально. RabbitMQ краще підходить для класичних черг завдань зі складною маршрутизацією та низькою затримкою. Для real-time стрімінгу і масштабованості обирайте Kafka; для простих task-queue сценаріїв RabbitMQ буде простішим у підтримці рішенням.
Питання: Чи є безкоштовна версія Apache Kafka?
Відповідь: Apache Kafka — open-source проєкт під ліцензією Apache 2.0, тому базову версію можна розгорнути самостійно без ліцензійних витрат. Хмарні керовані рішення на кшталт Confluent Cloud, Amazon MSK або Aiven for Kafka працюють за платною моделлю, але окремі провайдери можуть мати безкоштовні кредити, trial або free tier для старту. Перед вибором варто перевіряти актуальні умови конкретного сервісу.
Питання: Коли Apache Kafka не підходить для проєкту?
Відповідь: Kafka надмірна для невеликих проєктів із низьким навантаженням — операційна складність і ресурсні вимоги не виправдані. Вона також не є найкращим вибором, якщо потрібна складна маршрутизація повідомлень, або якщо команда не має досвіду з розподіленими системами. Для простих task-queue сценаріїв Celery з Redis або RabbitMQ дадуть той самий результат із меншими витратами на підтримку.
Підсумок: Apache Kafka — коли варто, а коли ні
Apache Kafka — зріла і потужна платформа для event streaming, яка вирішує конкретний клас задач: high-throughput обробка подій, decoupled мікросервіси, real-time data pipeline. У цих сценаріях вона важко замінна.
Перед тим як додавати Kafka в стек, варто відповісти на три питання: чи є реальна потреба в обробці потоків подій у реальному часі? чи є в команді досвід із розподіленими системами? чи виправдовує масштаб задачі операційні витрати на підтримку кластера?
Якщо відповідь на всі три — так, Kafka буде правильним вибором. Якщо ні — є простіші інструменти, які вирішать задачу з меншими витратами.
Для тих, хто хоче опанувати побудову data pipeline, ETL та сучасну інфраструктуру даних на практиці рекомендуємо звернути увагу на спеціалізацію Analytics & Data Engineer у Data Lab, що охоплює весь цей стек за 5 місяців з нуля.