Apache Kafka – Wprowadzenie

Czas na powrót po wakacyjnej przerwie. Wracamy do pisania, czytania i… aktywnej nauki.

Definicja i zastosowanie

Na rozgrzewkę zajmiemy się kolejną technologią, o której osoby pracujące z danymi słyszały na pewno nie raz. Omówimy podstawowe koncepcje dotyczące platformy Apache Kafka. Nie będziemy wchodzić w zagadnienia szczegółowe – jeżeli temat okaże się dla Was ciekawy, zajmiemy się dokładniejszymi wyjaśnieniami w kolejnym wpisie.

Czym właściwie jest Kafka i jakie są jej zastosowania? Zgodnie z definicją jest to platforma przeznaczona głównie do przetwarzania danych strumieniowo. Ciekawostką jest, że projekt zapoczątkowano w LinkedIn, a w późniejszym etapie stał się open-source’owy. W LinkedIn platforma ta jest wykorzystywana m.in. podczas śledzenia aktywności, wymiany wiadomości między użytkownikami i zbierania metryk. Już w roku 2019 serwis ten przetwarzał przy użyciu Kafki ponad 7 bilionów wiadomości dziennie, wykorzystując przy tym ponad 100 klastrów obliczeniowych.

W oficjalnej dokumentacji projektu możemy dowiedzieć się, że wykorzystanie platformy nie kończy się na przetwarzaniu strumieniowym. Inne przypadki użycia to:

  • Metryki – zbieranie statystyk z rozproszonych aplikacji
  • Agregacja logów – polega zwykle na kolekcjonowaniu logów serwerów i przesyłanie ich do scentralizowanego magazynu danych (np. serwera plików lub HDFS)
  • Event sourcing – sposób działania systemu, w którym zmiany są przechowywane przy pomocy rekordów uporządkowanych chronologicznie
  • Commit log – Kafka może służyć jako zewnętrzny dziennik zmian (transakcji) dla systemu rozproszonego. Takie rozwiązanie usprawnia replikację między węzłami i pomaga w odzyskaniu danych.
Architektura Apache Kafka

Na rysunku powyżej widzimy podstawowe elementy wchodzące w skład klastra Apache Kafka, na ogólnym poziomie architektury. Możemy wyróżnić następujące składowe:

  • Broker – Pojedyncza instancja Apache Kafka, odpowiedzialna za przetwarzanie zapytań
  • Cluster – Kilka brokerów działających razem, zwykle w celu realizacji wspólnego celu
  • ZooKeeper – Serwis działający w celu zarządzania i koordynacji brokerów w klastrze. W przypadku dodania nowego brokera lub awarii istniejącego, ZooKeeper odpowiedzialny jest za powiadomienie o tym fakcie producentów i konsumentów.
  • Producer – Aplikacja klienta, której zamiarem jest wysyłanie nowych rekordów do brokerów.
  • Consumer – Zgodnie z nazwą, aplikacja konsumująca rekordy pojawiające się w brokerach.

Zanim prześledzimy funkcjonowanie ekosystemu Kafki, zobaczmy jak zbudowany jest pojedynczy broker:

Budowa brokera Kafka

Wyżej mamy broker składający się z 3 topiców. O topicach możemy myśleć jak o osobnych kategoriach, dzięki którym możemy posegregować rekordy w brokerze. Producent, wysyłając rekord do brokera, decyduje do jakiego topic chce przypisać dany rekord. Kiedy konsument pobiera rekord z brokera, również przegląda jedynie interesujące go topic (W szczególności może być zainteresowany jedynie jednym z wielu). Przykładem topic mogą być gatunki filmów: Filmy akcji, Science fiction, Komedie. Producenci mogą dodawać filmy do różnych gatunków, a konsument może być zainteresowany wyłącznie jednym z nich. Koncepcja topic w Kafce pozwala na organizację takiego rozróżnienia.

Każdy topic zawiera partycje. Na rysunku powyżej każdy z nich złożony jest z 6 partycji. Partycje pozwalają na równoległe przetwarzanie topic poprzez podział ich rekordów między wiele brokerów. Rekordy partycji są uporządkowane i numerowane sekwencyjnie przy pomocy tzw. offsetu:

Offset partycji

Jak widzimy wyżej, najnowsze rekordy mają najwyższe wartości offsetu – dodawane są na koniec partycji. Dzięki uporządkowanej numeracji konsumenci partycji są w stanie rozpoznać, które rekordy zostały już przez nich odczytane.

Przepływ danych

Omówiliśmy już podstawowe struktury, które wchodzą w skład Apache Kafka. Przyjrzyjmy się teraz jaką drogę musi przebyć wiadomość wysłana od producenta do konsumenta:

  1. Producent (np. aplikacja webowa) wysyła nową wiadomość. Treścią wiadomości jest informacja o tym, że użytkownik aplikacji dodał nowy film do gatunku Science fiction. Producent wysyła więc zatem rekord do topic „Science-fiction”.
  2. Jak widzieliśmy wcześniej, topic składa się partycji. Producent może mieć też wpływ na to, do jakiej partycji trafi jego wiadomość:
    – Jeżeli podany zostanie numer partycji, wiadomość zostanie wysłana właśnie do tej partycji.
    – Jeżeli numer partycji nie został określony, producent mógł wskazać klucz, według którego wiadomość zostanie przydzielona. Przykładem takiego klucza może być użycie pierwszej litery tytułu filmu i zastosowanie operacji „modulo ilość partycji”.
    – Jeżeli nie został określony ani numer partycji, ani klucz, wówczas partycja zostanie przydzielona przy pomocy algorytmu round-robin.
  3. Wiadomość zostaje dodana na koniec przydzielonej partycji oraz otrzymuje wartość offset.
  4. Następuje replikacja danych – pamiętajmy, że nasz klaster przeważnie składa się z wielu brokerów. Każda partycja ma swojego lidera na jednym brokerze. Lider odpowiedzialny jest za operacje odczytu i zapisu danej partycji. Kiedy więc wiadomość dociera do lidera, kopia wiadomości wysyłana jest do pozostałych replik partycji:


  5. Konsumenci przypisani do danej partycji rozpoznają, że pojawił się rekord o nowym offsecie. Przetwarzają nową wiadomość, ale nie usuwają jej z partycji.

Poznaliśmy podstawowy przepływ danych w Apache Kafka. Warto też dodać, że unikalną cechą Kafki jest możliwość kontrolowania czasu retencji wiadomości. Dla zainteresowanych tym tematem odsyłam do poczytania o Log Compaction.

Jeżeli obszar Apache Kafka wydaje się Wam ciekawy – dajcie znać lub zostawcie komentarz. Z całą pewnością jest jeszcze kilka wątków, które można poruszyć, takich jak Kafka Streams, czy porównanie Kafki z innymi brokerami. Wszelkie pomysły są bardzo mile widziane 🙂

One thought on “Apache Kafka – Wprowadzenie

  1. Pingback: dotnetomaniak.pl

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *