Data publikacji:

29.06.2025

Apache Kafka - Architektura, Wydajność i Wdrożenia Enterprise

Apache Kafka - profesjonalne wdrożenia

Apache Kafka to rozproszona platforma do przesyłania strumieniowego zdarzeń typu open-source, pierwotnie stworzona przez LinkedIn, a obecnie rozwijana przez Apache Software Foundation. Kafka doskonale sprawdza się w obsłudze aplikacji opartych na zdarzeniach i budowaniu niezawodnych potoków danych, oferując niskie opóźnienia i wysoką przepustowość - zdolną do obsługi bilionów rekordów dziennie.

Czym jest Apache Kafka?

Apache Kafka to rozproszony silnik przesyłania strumieniowego zdarzeń, używany do zbierania, przetwarzania, przechowywania i integrowania danych na dużą skalę. Ma liczne przypadki użycia, w tym rozproszone przesyłanie strumieniowe zdarzeń, przetwarzanie strumieni, integrację danych i komunikację typu publish-subscribe.

Kafka bazuje na abstrakcji rozproszonego dziennika commitów. Poprzez podział dziennika na partycje, Kafka jest w stanie skalować systemy. W swojej istocie Kafka modeluje zdarzenia jako pary klucz/wartość.

Kluczowa przewaga: Kafka może obsługiwać petabajty danych z przepustowością sięgającą milionów wiadomości na sekundę, zachowując opóźnienia na poziomie 2 milisekund.

Koncepcja zdarzeń w Kafka

Zdarzenie to dowolny typ akcji, incydentu lub zmiany, która jest identyfikowana lub rejestrowana przez oprogramowanie lub aplikacje. Na przykład płatność, kliknięcie na stronie internetowej lub odczyt temperatury, wraz z opisem tego, co się wydarzyło.

Innymi słowy, zdarzenie to kombinacja powiadomienia - elementu "kiedy", który może być użyty do wywołania innej aktywności - oraz stanu. Ten stan jest zwykle dość mały, powiedzmy mniej niż megabajt, i jest normalnie reprezentowany w jakimś ustrukturyzowanym formacie, jak JSON lub obiekt serializowany za pomocą Apache Avro lub Protocol Buffers.

Architektura Apache Kafka - Kluczowe komponenty

Tematy (Topics)

Podstawową jednostką organizacyjną Kafki jest temat, który jest czymś w rodzaju tabeli w relacyjnej bazie danych. Jako programista używający Kafka, temat to abstrakcja, o której prawdopodobnie myślisz najczęściej.

Temat to dziennik zdarzeń. Dzienniki są łatwe do zrozumienia, ponieważ są prostymi strukturami danych z dobrze znaną semantyką:

  • tylko do dopisywania - nowe wiadomości zawsze trafiają na koniec

  • Można je czytać poprzez przesunięcie do dowolnego offsetu, a następnie skanowanie sekwencyjnych wpisów

  • Zdarzenia w dzienniku są niezmienne - gdy coś się wydarzyło, jest niezwykle trudno to cofnąć

Partycje (Partitions)

Gdyby temat był ograniczony do całkowitego życia na jednej maszynie, nałożyłoby to całkiem radykalne ograniczenie na zdolność Kafka do skalowania. Na szczęście Kafka daje nam możliwość partycjonowania tematów.

Partycjonowanie pobiera pojedynczy dziennik tematu i dzieli go na wiele dzienników, z których każdy może mieszkać na oddzielnym węźle w klastrze Kafka. W ten sposób praca przechowywania wiadomości, pisania nowych wiadomości i przetwarzania istniejących wiadomości może być podzielona między wiele węzłów w klastrze.

Brokerzy (Brokers)

Z perspektywy fizycznej infrastruktury Kafka składa się z sieci maszyn zwanych brokerami. W nowoczesnym wdrożeniu mogą to nie być oddzielne serwery fizyczne, ale kontenery działające na podach na zwirtualizowanych serwerach w fizycznym centrum danych.

Każdy broker hostuje jakiś zestaw partycji i obsługuje przychodzące żądania pisania nowych zdarzeń do tych partycji lub czytania zdarzeń z nich. Brokery obsługują również replikację partycji między sobą.

Replikacja

Nie wystarczyłoby, gdybyśmy przechowywali każdą partycję tylko na jednym brokerze. Niezależnie od tego, czy brokery to serwery bare metal czy zarządzane kontenery, one i ich podstawowa pamięć masowa są podatne na awarie, więc musimy skopiować dane partycji na kilka innych brokerów, aby zachować je w bezpieczeństwie.

Te kopie nazywane są replikami followera, podczas gdy główna partycja nazywana jest repliką lidera.

Producenci i konsumenci

Producenci (Producers)

API powierzchnia biblioteki producenta jest dość lekka: W Javie istnieje klasa o nazwie KafkaProducer, której używasz do połączenia z klastrem. Przekazujesz tej klasie mapę parametrów konfiguracyjnych, w tym adres niektórych brokerów w klastrze, odpowiednią konfigurację bezpieczeństwa i inne ustawienia.

Konsumenci (Consumers)

Używanie API konsumenta jest podobne w zasadzie do producenta. Używasz klasy o nazwie KafkaConsumer do połączenia z klastrem. Następnie używasz tego połączenia do subskrybowania jednego lub więcej tematów.

Kafka różni się od starszych kolejek wiadomości tym, że czytanie wiadomości jej nie niszczy - nadal jest tam do przeczytania przez każdego innego konsumenta, który może być nią zainteresowany. W rzeczywistości jest całkowicie normalne w Kafka, że wielu konsumentów czyta z jednego tematu.

Grupy konsumentów

Konsumenci muszą być w stanie poradzić sobie ze scenariuszem, w którym szybkość konsumpcji wiadomości z tematu w połączeniu z kosztami obliczeniowymi przetwarzania pojedynczej wiadomości są razem zbyt wysokie dla pojedynczej instancji aplikacji. Skalowanie grup konsumentów w Kafka jest mniej więcej automatyczne.

Ekosystem Apache Kafka

Kafka Connect

Kafka Connect to API integracji Apache Kafka. Z jednej strony Kafka Connect to ekosystem podłączalnych łączników, a z drugiej - aplikacja kliencka. Jako aplikacja kliencka Connect to proces serwerowy, który działa na sprzęcie niezależnym od brokerów Kafka.

Przykład konfiguracji łącznika do Elasticsearch:

{ 
  "connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector", 
  "topics": "my_topic", 
  "connection.url": "http://elasticsearch:9200", 
  "type.name": "_doc", 
  "key.ignore": "true", 
  "schema.ignore": "true"

Schema Registry

Confluent Schema Registry istnieje, aby rozwiązać problem ewolucji schematów. To samodzielny proces serwerowy, który działa na maszynie zewnętrznej w stosunku do brokerów Kafka. Jego zadaniem jest utrzymywanie bazy danych wszystkich schematów, które zostały napisane do tematów w klastrze.

Kafka Streams

Kafka Streams to Java API, które daje łatwy dostęp do wszystkich prymitywów obliczeniowych przetwarzania strumieni: filtrowania, grupowania, agregowania, łączenia i więcej. Zapobiega konieczności pisania kodu frameworka na górze API konsumenta, aby wykonać wszystkie te rzeczy.

Przypadki użycia Apache Kafka

Integracja danych

Kafka może łączyć się z niemal każdym innym źródłem danych w tradycyjnych systemach informacyjnych przedsiębiorstw, nowoczesnych bazach danych lub w chmurze. Tworzy wydajny punkt integracji z wbudowanymi łącznikami danych.

Monitoring operacyjny

Kafka jest często używany do monitorowania danych operacyjnych. Obejmuje to agregowanie statystyk z rozproszonych aplikacji w celu wytworzenia scentralizowanych kanałów z metrykami w czasie rzeczywistym.

Centralizacja logów

Nowoczesny system to zazwyczaj system rozproszony, a dane logowania muszą być scentralizowane z różnych komponentów systemu do jednego miejsca. Kafka często służy jako pojedyncze źródło prawdy poprzez centralizację danych ze wszystkich źródeł.

Przetwarzanie strumieni w czasie rzeczywistym

Wykonywanie obliczeń w czasie rzeczywistym na strumieniach zdarzeń to kluczowa kompetencja Kafka. Od przetwarzania danych w czasie rzeczywistym po programowanie przepływu danych.

Publish/Subscribe Messaging

Jako rozproszony system komunikacji pub/sub, Kafka dobrze sprawdza się jako zmodernizowana wersja tradycyjnego brokera wiadomości.

7 najlepszych praktyk optymalizacji wydajności Apache Kafka

1. Optymalizacja sprzętu

Kafka został zaprojektowany do wykorzystywania dużych sekwencyjnych operacji I/O podczas zapisywania danych na dysk. Dla optymalnej wydajności:

  • Używaj SSD - choć Kafka nie wymaga wysokich IOPS, szybsze dyski pomagają

  • Pamięć RAM - minimum 6 GB dla heap space, dla ciężkich obciążeń 32 GB lub więcej

  • Sieć - maksymalizuj przepustowość sieci

  • System plików XFS jest rekomendowany

2. Load balancing i partycje

Zwiększanie liczby partycji i liczby brokerów w klastrze prowadzi do zwiększonej równoległości konsumpcji wiadomości, co z kolei poprawia przepustowość klastra Kafka. Każde zapytanie działa w pojedynczym wątku na partycję, ale wiele partycji może być wykonywanych równolegle.

3. Optymalizacja batching

Batching wielu wiadomości razem przed wysłaniem ich do brokera Kafka znacznie poprawia przepustowość poprzez zmniejszenie narzutu komunikacji sieciowej i operacji I/O.

Kluczowe konfiguracje:

  • batch.size - maksymalny rozmiar batcha w bajtach

  • linger.ms - czas oczekiwania producenta przed wysłaniem batcha

4. Zarządzanie replikacją

Typowy klaster produkcyjny Kafka jest rozprowadzony w trzech strefach dostępności z współczynnikiem replikacji 3 (RF=3) i minimalną liczbą replik w sync wynoszącą 2 (min.isr=2).

5. Konfiguracja tematów i partycji

Przy tworzeniu tematów Kafka ważne jest zrównoważenie liczby partycji i współczynnika replikacji:

  • Wyższa liczba partycji umożliwia więcej równoległości i większą przepustowość

  • Tworzy również dodatkowe obciążenie, zwiększając workload brokera

  • Wyższy współczynnik replikacji zwiększa dostępność danych, ale może zwiększyć użycie dysku i ruch sieciowy

6. Optymalizacja JVM

Dla wysokiej przepustowości używaj Parallel GC (-XX:+UseParallelGC), idealnego dla przetwarzania wsadowego z dłuższymi pauzami. Kafka może działać optymalnie z 6 GB RAM dla heap space.

7. Monitoring i metryki

Kafka udostępnia szczegółowe metryki wydajności przez JMX. Kluczowe metryki do monitorowania:

  • Throughput - liczba wiadomości na sekundę

  • Latency - czas przetwarzania pojedynczej wiadomości

  • Consumer lag - opóźnienie konsumentów

  • Broker health - zdrowie brokerów

Bezpieczeństwo Apache Kafka

Kafka wspiera szyfrowanie dla danych zarówno w tranzycie, jak i w spoczynku, wraz z konfigurowalnymi kontrolami dostępu:

  • TLS/SSL - szyfrowanie komunikacji

  • SASL - uwierzytelnianie (PLAIN, SCRAM, GSSAPI/Kerberos)

  • ACLs - kontrola dostępu oparta na rolach

  • Audit logging - rejestrowanie zdarzeń bezpieczeństwa

Ważne: Włączenie TLS powoduje wpływ na wydajność z powodu narzutu szyfrowania, ale jest niezbędne w środowisku produkcyjnym.

Benchmarking i testowanie wydajności

Apache Kafka znany jest ze swojej wydajności i możliwości dostrojenia dla różnych przypadków użycia. W testach wydajności Kafka może osiągnąć:

  • Przepustowość: Miliony wiadomości na sekundę

  • Latency: Niski poziom 2 milisekund

  • Skalowalność: Obsługa bilionów rekordów dziennie

  • Fault tolerance: Automatyczne failover i recovery

Migracja i modernizacja

ZooKeeper do KRaft

Kafka ewoluuje w kierunku architektury post-ZooKeeper z intencją uproszczenia złożożości operacyjnej i usunięcia potrzeby zewnętrznej zależności. KRaft (Kafka Raft Protocol) został oznaczony jako gotowy do produkcji w wersji 3.3.1.

Skalowanie

Fundamentalną koncepcją skalowania w Apache Kafka jest poprzez partycje i grupy konsumentów:

  • Zwiększanie liczby partycji umożliwia równoległe przetwarzanie danych

  • Grupy konsumentów pozwalają na skalowanie konsumpcji

  • Można dodawać więcej brokerów do klastra w miarę wzrostu danych

Podsumowanie

Apache Kafka to potężna platforma przesyłania strumieniowego zdarzeń, która przekształciła sposób, w jaki organizacje obsługują dane w czasie rzeczywistym. Jego rozproszona architektura, wysoką wydajność i bogate funkcje czynią go idealnym wyborem dla nowoczesnych aplikacji opartych na zdarzeniach.

Kluczowe zalety Kafka:

  • Wysoka przepustowość - miliony wiadomości na sekundę

  • Niska latencja - odpowiedzi w milisekundach

  • Skalowalność - od startupów do dużych firm

  • Fault tolerance - replikacja i automatyczne failover

  • Bogaty ekosystem - Connect, Streams, Schema Registry

  • Elastyczność - wiele przypadków użycia i wzorców integracji