Apache Kafka – streaming danych w czasie rzeczywistym

geek.justjoin.it 4 dni temu

Każde kliknięcie w sklepie internetowym, płatność kartą czy odczyt z czujnika w fabryce to zdarzenie. Firmy generują ich miliony na sekundę, a Kafka stała się standardem, jeżeli trzeba je przechwycić, zapisać i przetworzyć niemal natychmiast. Według Apache Software Foundation korzysta z niej większość dużych organizacji z listy Fortune 100, a w Polsce wdrażają ją banki, e-commerce i firmy telekomunikacyjne.

Z tego tekstu dowiesz się, czym jest Apache Kafka, jak działa jej architektura, do czego służy i czym różni się od RabbitMQ. Przejdziemy też przez krótki tutorial, który uruchomisz na własnym laptopie, oraz sprawdzimy, co zmieniło się w Kafce 4.0.

Kafka – co to jest?

Apache Kafka to rozproszona platforma do strumieniowania zdarzeń (ang. event streaming platform). Mówiąc prościej: to bardzo wydajny, odporny na awarie dziennik zdarzeń, do którego jedne aplikacje zapisują dane, a inne je odczytują – w czasie rzeczywistym albo później.

Kafka powstała w LinkedIn. Jej twórcy – Jay Kreps, Neha Narkhede i Jun Rao – potrzebowali systemu, który udźwignie ogromne strumienie danych o aktywności użytkowników. W 2011 roku projekt trafił na licencję open source, a w 2012 roku stał się projektem najwyższego poziomu Apache Software Foundation. Nazwę wybrał Jay Kreps – jako fan twórczości Franza Kafki uznał, iż system zoptymalizowany pod pisanie pasuje do pisarza.

Dziś twórcy Kafki założyli firmę Confluent, która oferuje komercyjną dystrybucję i usługę chmurową. Sama Kafka pozostaje jednak w pełni otwartym projektem.

Czym Kafka różni się od klasycznej bazy danych?

Baza danych przechowuje aktualny stan (np. saldo konta). Kafka przechowuje historię zdarzeń, z których ten stan wynika (wpłata, wypłata, przelew). Zdarzeń nie nadpisujesz – dopisujesz je na końcu logu. Dzięki temu możesz je odtworzyć, przeanalizować lub przetworzyć ponownie innym kodem.

Kafka – streaming: najważniejsze pojęcia

Zanim przejdziesz do kodu, musisz poznać kilka podstawowych pojęć. Cała Kafka opiera się na nich.

  • Event (zdarzenie, rekord) – pojedynczy fakt: klucz, wartość, znacznik czasu i opcjonalne nagłówki. Przykład: „użytkownik 42 kupił produkt X”.
  • Producer – aplikacja, która publikuje zdarzenia do Kafki.
  • Consumer – aplikacja, która je odczytuje.
  • Topic (temat) – nazwana kategoria zdarzeń, np. zamowienia albo platnosci. To odpowiednik tabeli, ale tylko do dopisywania.
  • Partycja – temat dzieli się na partycje, czyli uporządkowane logi. To one odpowiadają za skalowanie.
  • Offset – numer zdarzenia w partycji. Konsument zapamiętuje, dokąd doczytał.
  • Broker – serwer Kafki. Kilka brokerów tworzy klaster.
  • Consumer group (grupa konsumentów) – zestaw konsumentów, które dzielą się partycjami tematu.

Partycje i gwarancja kolejności

To jedna z najważniejszych rzeczy, które musisz zrozumieć. Kafka gwarantuje kolejność zdarzeń tylko w obrębie jednej partycji, a nie całego tematu. jeżeli zdarzenia mają ten sam klucz (np. identyfikator klienta), trafiają do tej samej partycji. Dzięki temu wszystkie operacje jednego klienta zachowają adekwatny porządek.

Więcej partycji oznacza większą równoległość. Trzy partycje pozwalają obsłużyć temat trzem konsumentom z jednej grupy jednocześnie. Czwarty konsument z tej grupy będzie bezczynny.

Jak działa Kafka? Architektura

Kafka zapisuje dane na dysku w sposób sekwencyjny i trzyma je zgodnie z ustawioną retencją – przez określony czas (domyślnie 7 dni) lub do osiągnięcia limitu rozmiaru. Odczyt zdarzenia nie usuwa go z logu. To zasadnicza różnica względem wielu klasycznych kolejek.

Sekwencyjny zapis oraz intensywne wykorzystanie pamięci podręcznej systemu operacyjnego sprawiają, iż Kafka osiąga bardzo wysoką przepustowość choćby na zwykłych dyskach.

Replikacja i odporność na awarie

Każda partycja ma lidera i repliki (followers) rozmieszczone na różnych brokerach. Producent zapisuje do lidera, a repliki kopiują dane. Gdy broker padnie, jedna z zsynchronizowanych replik (ISR, in-sync replicas) przejmuje rolę lidera. W produkcji standardem jest współczynnik replikacji równy 3 oraz ustawienie min.insync.replicas=2.

Koniec ery ZooKeepera: KRaft

Przez lata Kafka potrzebowała zewnętrznego systemu Apache ZooKeeper do zarządzania metadanymi klastra. To komplikowało wdrożenia i operacje. Dziś to historia: nowy mechanizm konsensusu KRaft (Kafka Raft) działa wewnątrz samej Kafki.

Przełom nastąpił w marcu 2025 roku wraz z Kafką 4.0 – to pierwsza wersja działająca wyłącznie w trybie KRaft, bez ZooKeepera. Wersja 4.0 wymaga też Javy 17 po stronie brokerów. jeżeli utrzymujesz starszy klaster z ZooKeeperem, musisz zaplanować migrację do KRaft przed aktualizacją do wersji 4.x.

Apache Kafka – tutorial: pierwsze kroki

Najszybciej uruchomisz Kafkę w Dockerze. Oficjalny obraz apache/kafka startuje jednowęzłowy klaster w trybie KRaft.

docker run -d --name kafka -p 9092:9092 apache/kafka:latest

Na potrzeby tutoriala zakładamy wersję z linii 4.x. Narzędzia wiersza poleceń znajdziesz w kontenerze w katalogu /opt/kafka/bin.

Krok 1: utwórz temat

docker exec -it kafka /opt/kafka/bin/kafka-topics.sh \ --create --topic zamowienia \ --partitions 3 --replication-factor 1 \ --bootstrap-server localhost:9092

Krok 2: wyślij zdarzenia

docker exec -it kafka /opt/kafka/bin/kafka-console-producer.sh \ --topic zamowienia --bootstrap-server localhost:9092

Wpisz kilka linijek tekstu i zatwierdź je Enterem. Każda linijka to osobne zdarzenie.

Krok 3: odczytaj zdarzenia

W drugim terminalu uruchom konsumenta:

docker exec -it kafka /opt/kafka/bin/kafka-console-consumer.sh \ --topic zamowienia --from-beginning \ --bootstrap-server localhost:9092

Flaga –from-beginning odtwarza cały log od początku. To dobra ilustracja tego, iż odczyt nie kasuje danych.

Krok 4: producent w kodzie

W prawdziwych projektach użyjesz biblioteki klienckiej. Przykład w Pythonie z pakietem confluent-kafka:

from confluent_kafka import Producer producer = Producer({"bootstrap.servers": "localhost:9092"}) def raport(err, msg): if err: print(f"Błąd: {err}") else: print(f"Zapisano w partycji {msg.partition()}, offset {msg.offset()}") producer.produce("zamowienia", key="klient-42", value="koszyk opłacony", callback=raport) producer.flush()

Zwróć uwagę na klucz klient-42. To on decyduje o partycji, a więc o zachowaniu kolejności zdarzeń tego klienta.

Ekosystem Kafki: nie tylko brokery

Kafka to coś więcej niż kolejka zdarzeń. Wokół brokerów powstał cały ekosystem narzędzi.

  • Kafka Connect – gotowe konektory do przenoszenia danych między Kafką a bazami danych, S3, Elasticsearch czy systemami chmurowymi. Zwykle nie musisz pisać własnego kodu integracyjnego.
  • Kafka Streams – biblioteka Javy do przetwarzania strumieni: filtrowania, agregacji, łączenia (join) i okien czasowych. Działa w twojej aplikacji, bez osobnego klastra.
  • ksqlDB – przetwarzanie strumieni w składni zbliżonej do SQL (rozwijane przez Confluent).
  • Schema Registry – centralny rejestr schematów (Avro, Protobuf, JSON Schema), który pilnuje zgodności formatów danych między zespołami.
  • Apache Flink – popularny silnik do zaawansowanego przetwarzania strumieni, często łączony z Kafką.

Gwarancje dostarczania

Kafka oferuje trzy poziomy semantyki dostarczania:

  1. At most once – zdarzenie dotrze najwyżej raz, ale możesz je stracić.
  2. At least once – zdarzenie dotrze co najmniej raz, ale mogą pojawić się duplikaty. To domyślny i najczęstszy wybór.
  3. Exactly once – dokładnie raz. Zapewniają je idempotentni producenci i transakcje, wymaga to jednak starannej konfiguracji.

Kafka – zastosowania w praktyce

Do czego służy Kafka? Najczęstsze scenariusze to:

  • Przetwarzanie zdarzeń w czasie rzeczywistym – wykrywanie oszustw w płatnościach, monitoring transakcji, alerty. Banki analizują strumień transakcji w milisekundach, zanim zatwierdzą operację.
  • Architektura mikroserwisów – serwisy komunikują się przez zdarzenia (event-driven architecture), zamiast wołać się wzajemnie synchronicznie. Zmniejsza to zależności między zespołami.
  • Agregacja logów i metryk – zbieranie danych z setek serwerów w jednym miejscu.
  • Śledzenie aktywności użytkowników – dokładnie ten przypadek, dla którego Kafkę stworzono w LinkedIn. Dane trafiają do analityki i systemów rekomendacji.
  • Change Data Capture (CDC) – przechwytywanie zmian z baz danych (np. przez Debezium) i przekazywanie ich do innych systemów.
  • Internet rzeczy (IoT) – telemetria z czujników, pojazdów i maszyn.
  • Zasilanie hurtowni danych i jezior danych – zamiast nocnych procesów wsadowych dane płyną ciągle.
  • AI i uczenie maszynowe – dostarczanie świeżych danych do modeli oraz potoków przetwarzania, w tym systemów opartych o LLM.

Kiedy Kafka to przesada?

Kafka nie jest rozwiązaniem na każdy problem. jeżeli wysyłasz kilkaset wiadomości dziennie, a twój zespół ma dwie osoby, prosta kolejka lub zwykła baza danych wystarczą. Kafka wymaga wiedzy operacyjnej: planowania partycji, monitoringu, strojenia retencji. Możesz oczywiście skorzystać z usług zarządzanych (Confluent Cloud, Amazon MSK, Azure Event Hubs z interfejsem Kafki, Aiven), co znacząco obniża koszty utrzymania.

Kafka vs RabbitMQ: co wybrać?

To najczęstsze pytanie, jakie słyszymy od programistów. Odpowiedź brzmi: zależy od modelu pracy, bo oba systemy rozwiązują nieco inne problemy.

CechaApache KafkaRabbitMQ
ModelRozproszony log zdarzeń (pull)Broker wiadomości z kolejkami (push)
Retencja danychDane zostają po odczycie, możliwy replayKlasycznie wiadomość znika po potwierdzeniu*
PrzepustowośćBardzo wysoka, miliony zdarzeń na sekundę w dużych klastrachWysoka, ale zwykle niższa niż Kafka
RoutingProsty: temat i partycjeElastyczny: exchanges, routing keys, nagłówki
KolejnośćGwarantowana w partycjiGwarantowana w pojedynczej kolejce
SkalowaniePoziome przez partycjeKlastrowanie i kolejki kworum, trudniejsze przy dużej skali
Typowe zastosowaniaStreaming, analityka, CDC, event sourcingZadania w tle, RPC, złożony routing, klasyczna kolejka

* RabbitMQ od wersji 3.9 oferuje też Streams, czyli strukturę logu z możliwością ponownego odczytu, co zaciera część różnic.

Kiedy wybrać Kafkę?

Wybierz Kafkę, gdy potrzebujesz przetwarzać duże strumienie danych, odtwarzać historię zdarzeń, obsługiwać wielu niezależnych konsumentów tych samych danych lub budować architekturę opartą na zdarzeniach.

Kiedy wybrać RabbitMQ?

Wybierz RabbitMQ, gdy masz klasyczny scenariusz kolejki zadań (np. wysyłka e-maili, generowanie raportów), potrzebujesz zaawansowanego routingu albo zależy ci na niskich opóźnieniach pojedynczych wiadomości i prostszym wdrożeniu.

Czy Kafka zastąpi kolejki?

Coraz częściej mówi się, iż Kafka zbliża się do modelu klasycznych kolejek. Propozycja KIP-932 („Queues for Kafka”) wprowadza tzw. share groups, które pozwalają wielu konsumentom współdzielić te same partycje, jak w tradycyjnej kolejce. Funkcja pojawiła się w wersji 4.0 jako wczesny dostęp, a w kolejnych wydaniach przechodzi dalsze etapy dojrzewania. Przed użyciem w produkcji sprawdź jej aktualny status w dokumentacji.

Co nowego w Kafce 4.x?

Kafka 4.0 to największa zmiana architektury od lat. Najważniejsze punkty:

  • Koniec ZooKeepera – wyłącznie tryb KRaft, prostsze wdrożenia i szybsze operacje na dużych klastrach.
  • Nowy protokół rebalansowania konsumentów (KIP-848) – znacznie krótsze przerwy podczas zmian w grupie konsumentów, bo koordynacja przesunęła się na stronę brokera.
  • Wczesny dostęp do kolejek (KIP-932) – opisany wyżej.
  • Wyższe wymagania Javy – Java 17 dla brokerów i Java 11 dla klientów, a także usunięcie wielu przestarzałych API.
  • Tiered Storage – wprowadzone wcześniej, pozwala trzymać starsze segmenty logu w tańszej pamięci obiektowej i znacząco obniża koszt długiej retencji.

Pamiętaj, iż Kafka rozwija się szybko. Zanim zaplanujesz aktualizację lub nowe wdrożenie, sprawdź notatki wydań na stronie kafka.apache.org.

Najczęstsze błędy początkujących

  • Zbyt mało partycji na starcie. Liczbę partycji łatwo zwiększyć, ale zmienia to przypisanie kluczy do partycji. Zaplanuj ją z zapasem.
  • Brak monitoringu opóźnienia konsumentów (consumer lag). To podstawowa metryka zdrowia systemu.
  • Zbyt duże wiadomości. Kafka najlepiej radzi sobie z małymi zdarzeniami. Duże pliki trzymaj w storage, a w Kafce tylko referencję.
  • Ignorowanie schematów danych. Bez Schema Registry zmiana formatu jednego zespołu potrafi zepsuć trzy inne.
  • Traktowanie Kafki jak bazy danych. To log zdarzeń. Do zapytań ad hoc użyj bazy, do której Kafka dostarcza dane.

Podsumowanie

Kafka to dziś fundament nowoczesnych systemów opartych na zdarzeniach. Przechowuje strumienie danych w odpornym na awarie logu, pozwala je odtwarzać i skaluje się niemal liniowo wraz z liczbą partycji. Wersja 4.0 uprościła jej architekturę, usuwając ZooKeepera, a kolejne wydania rozszerzają ją o funkcje znane z klasycznych kolejek.

Jeśli dopiero zaczynasz, uruchom Kafkę w Dockerze, napisz prostego producenta i konsumenta i zobacz, jak zachowują się partycje oraz offsety. jeżeli potrzebujesz tylko prostej kolejki zadań, RabbitMQ może być lepszym wyborem.

Idź do oryginalnego materiału