Wann sollten Sie die Einführung von Apache Kafka in Betracht ziehen?
Apache Kafka ist eine verteilte Event-Streaming-Plattform, die sich lohnt, wenn mehrere Systeme dieselben Events unabhängig konsumieren müssen und die Event-Historie für eine gewisse Zeit aufbewahrt werden muss, damit sie später erneut gelesen werden kann. Statt Kafka allein deshalb auszuwählen, weil asynchrone Verarbeitung benötigt wird, sollten Sie bewerten, ob Sie mehrere Subscriptions, Verarbeitung hoher Volumina, erneute Verarbeitung und Fehlertoleranz gemeinsam benötigen. kafka.apache.org
Kafka wird häufig als „Message Queue“ bezeichnet, doch diese Bezeichnung allein erklärt seinen zentralen Nutzen nicht vollständig. Es eignet sich hervorragend dafür, Tatsachen, die in einem System eingetreten sind – etwa das Erstellen einer Bestellung, der Abschluss einer Zahlung, eine Kundenaktion oder ein Systemlog –, als Events aufzuzeichnen und mehreren Anwendungen und Datensystemen zu erlauben, sie im eigenen Tempo zu lesen. Wenn ein kleiner Service hingegen nur eine Art von Hintergrundaufgabe einmalig verarbeiten muss, kann die betriebliche Komplexität von Kafka seinen Nutzen überwiegen.
Dieser Artikel definiert zunächst die Probleme, die Kafka löst, und untersucht anschließend die Signale, die den Nutzen einer Einführung erhöhen, sowie die mit Design und Betrieb verbundenen Kompromisse.
Welche Art von Plattform ist Kafka?
Kafka arbeitet mit Topics, die Events aufzeichnen. Ein Event ist ein Datensatz, der eine Tatsache repräsentiert, die in einem System eingetreten ist, beispielsweise „eine Bestellung wurde erstellt“, „ein Benutzer hat ein Produkt angesehen“ oder „eine Sensortemperatur wurde gemessen“. Anwendungen, die Events schreiben, heißen Producer; Anwendungen, die sie lesen und verarbeiten, heißen Consumer. kafka.apache.org
Producer veröffentlichen Events in Topics, und Consumer abonnieren und lesen die Topics, die sie benötigen. Producer müssen nicht unmittelbar wissen, wer ihre Events liest. Selbst wenn später ein Analytics-Service, ein Benachrichtigungsservice oder ein Service zur Suchindexierung hinzukommt, kann der Bestellservice grundsätzlich weiterhin dasselbe Bestell-Event veröffentlichen, ohne fortlaufend für jedes System separaten Integrationscode hinzufügen zu müssen. Dies ist lose Kopplung zwischen Producern und Consumern. kafka.apache.org
Darüber hinaus verschwinden Kafka-Events nicht unmittelbar, nachdem ein Consumer sie gelesen hat. Sie werden gemäß den Aufbewahrungsrichtlinien auf Topic-Ebene gespeichert, während Consumer Positionen verwalten, die angeben, wie weit sie gelesen haben. Dadurch kann ein neuer Consumer historische Datensätze lesen, oder ein bestehender Consumer kann nach einer Fehlerbehebung ab einem bestimmten Punkt erneut verarbeiten. kafka.apache.org
Deshalb ist es hilfreicher, Kafka als Plattform zu verstehen, die „teilbare Event-Historie vorhält“, und nicht nur als Plattform, die „Nachrichten zustellt“. Aufbewahrung bedeutet jedoch nicht, Daten für immer zu speichern. Die tatsächliche Aufbewahrungsdauer muss anhand der Topic-Richtlinien und der Planung der Speicherkapazität festgelegt werden.
Wie arbeiten die Kernkomponenten zusammen?
Die Unterscheidung der wichtigsten Kafka-Komponenten erleichtert Entscheidungen zur Einführung und die Analyse von Incidents.
| Komponente | Rolle | Was bei der Entscheidung für eine Einführung zu berücksichtigen ist |
|---|---|---|
| Topic | Ein logischer Stream, der Events ähnlicher Art gruppiert | Sie müssen Event-Bedeutung, Aufbewahrungsdauer und Zugriffsberechtigungen definieren. |
| Partition | Eine geordnete Log-Einheit, die ein Topic aufteilt | Sie ist die Einheit für Durchsatz, Parallelität und Garantien zur Reihenfolge. |
| Producer | Eine Anwendung, die Events in ein Topic schreibt | Sie müssen Event-Keys und das Wiederholungsverhalten bei Fehlern festlegen. |
| Consumer | Eine Anwendung, die Events liest und verarbeitet | Sie müssen für doppelte Verarbeitung, Lag und Fehlerwiederherstellung entwerfen. |
| Consumer-Gruppe | Eine Sammlung von Consumern, die die Arbeit aufteilen | Partitionen werden unter Consumern derselben Gruppe aufgeteilt. |
| Broker | Ein Kafka-Server, der Events speichert und bereitstellt | Er ist die Betriebseinheit für Replikation, Fehlerdomänen und Speicherkapazität. |
Ein Topic wird in eine oder mehrere Partitionen aufgeteilt. Eine Partition ist ein geordnetes Event-Log, und Kafka verwendet mehrere Partitionen, um Lese- und Schreibvorgänge zu parallelisieren. Daher ist die Anzahl der Partitionen nicht nur ein Konfigurationswert; sie ist eine Designentscheidung, die angestrebten Durchsatz, Consumer-Parallelität und Anforderungen an die Reihenfolge gemeinsam abbildet. kafka.apache.org
Eine Consumer-Gruppe ist eine Sammlung von Consumer-Instanzen, die dieselbe Aufgabe ausführen. Wenn beispielsweise mehrere Consumer-Instanzen Bestell-Events in ein Data Warehouse laden, können sie eine Gruppe bilden. Innerhalb der Gruppe kann jede Partition einem Consumer zugewiesen werden, um die Verarbeitungslast aufzuteilen. Ein Benachrichtigungsservice und ein Analytics-Service gehören dagegen unterschiedlichen Gruppen an, sodass jeder dieselben Bestell-Events unabhängig lesen kann. kafka.apache.org
Diese Struktur ist günstig für die Skalierung, doch mehr aktive Consumer in einer Gruppe als Partitionen bedeuten nicht, dass alle gleichzeitig mehr Partitionen verarbeiten können. Sie sollten nicht erwarten, dass die Parallelität allein durch Erhöhung der Instanzzahl unbegrenzt wächst. Bereits bei der Planung der Partitionen müssen die tatsächliche Key-Verteilung und künftige Skalierungsanforderungen gemeinsam berücksichtigt werden.
Bei welchen Problemen passt Kafka besonders gut?
Das stärkste Signal für eine Einführung ist eine Situation, in der mehrere Systeme ein Event zu unterschiedlichen Zwecken und mit unterschiedlichen Geschwindigkeiten konsumieren müssen. Entscheidend ist nicht die Anzahl der Consumer selbst, sondern ob sich Consumer unabhängig vom Producer weiterentwickeln müssen.
Betrachten Sie ein E-Commerce-System, in dem eine Bestellung erstellt wird. Zunächst mag es ausreichen, nur die Bestelldatenbank zu aktualisieren. Später können Bestandsreservierung, Zahlungsabläufe, Kundenbenachrichtigungen, Betrugserkennung, Aktualisierungen von Such- und Empfehlungsdaten sowie Analytics-Ladevorgänge hinzukommen. Wenn jede Funktion weiterhin über synchrone Aufrufe an den Bestellservice gekoppelt wird, können Latenz oder Ausfälle einer Funktion den Bestellverarbeitungsweg beeinflussen, und die Integrationsbeziehungen können komplex werden.
In diesem Fall kann der Bestellservice ein order created-Event veröffentlichen, während jedes nachgelagerte System die benötigten Events über eine separate Consumer-Gruppe liest. Ein zentraler Kafka-Anwendungsfall ist die Möglichkeit, neue Consumer hinzuzufügen, ohne den bestehenden Producer direkt zu ändern. kafka.apache.org
Die folgenden Situationen sind besonders prüfenswert:
- Es gibt Kern-Events, etwa Änderungen bei Bestellung, Zahlung oder Mitgliedschaftsstatus, auf die mehrere Geschäftssysteme Bezug nehmen.
- Daten wie Nutzerklicks, Seitenaufrufe, Betriebslogs oder Messwerte fallen kontinuierlich an.
- Analytics, Benachrichtigungen, Indexierung und das Laden in ein Data Warehouse benötigen jeweils dieselben Quell-Events.
- Der Produktionsablauf muss weiterlaufen, auch wenn Consumer unterschiedliche Verarbeitungsgeschwindigkeiten und Wiederherstellungspunkte nach Ausfällen haben.
- Wenn ein neuer Anwendungsfall entsteht, ist die direkte Verbindung des Quellservices mit jedem nachgelagerten System aufwendig.
Keine dieser Bedingungen allein bedeutet zwingend, dass Kafka erforderlich ist. Wenn aber mehrere gleichzeitig zutreffen und jeder Datenfluss voraussichtlich wächst, kann eine Event-Streaming-Architektur größere Vorteile bieten als einfache Punkt-zu-Punkt-Integrationen.
Wie fängt Kafka hohe Volumina und starke Schwankungen ab?
Kafka ist darauf ausgelegt, Lese- und Schreibvorgänge von Events über Partitionen zu verteilen, und kann daher für Datenflüsse eingesetzt werden, die kontinuierlich große Mengen von Events erzeugen. Typische Beispiele sind Log-Aggregation, Tracking von Nutzeraktivitäten, Monitoring-Metriken, IoT-Messwerte und Transaktions-Events. kafka.apache.org
Kafkas Aufgabe besteht hier darin, die Kopplung aufzulockern, die voraussetzt, dass Produktions- und Verbrauchsgeschwindigkeit stets übereinstimmen. Wenn Events beispielsweise in einem bestimmten Zeitraum sprunghaft ansteigen, können Consumer möglicherweise nicht alle sofort verarbeiten. Werden die Events aufbewahrt, können Consumer den Rückstand aufholen. Das gibt Consumern Spielraum, ihre Verarbeitungsgeschwindigkeit unabhängig anzupassen, ohne Producer zu blockieren.
Das bedeutet nicht, dass Lag verschwindet. Vielmehr kann Lag als angesammelter Rückstand aufgezeichneter Events verwaltet werden. Consumer Lag ist eine Betriebsmetrik, die zeigt, wie weit ein Consumer hinter den neuesten Events zurückliegt. Wenn der Lag kontinuierlich zunimmt, sollten Consumer-Leistung, externe Abhängigkeiten, Partitionsverteilung und Fehlerwiederholungen untersucht werden. Kafka stellt JMX-basiertes Monitoring bereit; in Produktionsumgebungen muss auch die Sicherheit der Zugriffswege für das Monitoring berücksichtigt werden. kafka.apache.org
Bei der Bewertung von Durchsatzanforderungen ist es besser, die folgenden Fragen zu trennen, statt vage zu sagen, dass „der Traffic hoch ist“:
- Wie viele Events treten pro Sekunde oder je Zeitraum auf?
- Wie groß sind ein einzelnes Event im Durchschnitt und maximal?
- Wie lange dauern Lastspitzen an?
- Welcher Consumer Lag ist akzeptabel?
- Wie schnell muss der Rückstand nach einem Ausfall verarbeitet werden?
- Wie lange müssen Events aufbewahrt werden?
Die Beantwortung dieser Fragen macht sichtbar, dass Partitionsanzahl, Speicherkapazität, Replikation, Consumer-Skalierung und Zeit für die erneute Verarbeitung zusammenhängende Aspekte sind. Kafka bietet eine Grundlage für hohen Durchsatz, doch tatsächliche Leistung und Kosten hängen von Event-Größe, Key Skew, Aufbewahrungsrichtlinien und Engpässen in der Consumer-Logik ab.
Warum ist die erneute Verarbeitung ein wichtiger Grund für Kafka?
Echtzeitverarbeitung ist Arbeit, die unmittelbar nach dem Eintreffen eines Events ein Ergebnis erzeugt. Beispiele sind die Aktualisierung des Bestands nach einer Bestellung, die Erkennung von Transaktionen, die bestimmte Bedingungen erfüllen, oder die Aggregation von Metriken auf Minutenebene. Doch die erneute Verarbeitung historischer Daten kann genauso wichtig sein wie die Echtzeitverarbeitung.
Eine erneute Verarbeitung wird aus vielen Gründen benötigt. Nach der Behebung eines Fehlers im Consumer-Code können Sie Ergebnisse neu erzeugen, die fehlten oder falsch berechnet wurden. Werden neue Analytics-Regeln eingeführt, können Sie aus der bestehenden Event-Historie abgeleitete Daten erzeugen. Wenn der Konsum aufgrund eines Ausfalls stoppt, können Sie sich erholen, indem Sie ab der zuletzt verarbeiteten Position erneut lesen. In Kafka werden Events nicht unmittelbar nach dem Konsum gelöscht und können innerhalb der Aufbewahrungsrichtlinie erneut gelesen werden. kafka.apache.org
Angenommen, Events zum Kundenverhalten wurden zunächst nur verwendet, um tägliche Besucherzahlen zu aggregieren. Wird später eine Conversion-Analyse nach Akquisekanal benötigt, kann eine separate Consumer-Gruppe historische Events lesen und neue Analyseergebnisse erzeugen – vorausgesetzt, die erforderlichen Felder sind in den Events enthalten und der Aufbewahrungszeitraum ist noch aktiv. Die Arbeit kann isoliert erfolgen, ohne den bestehenden Aggregations-Consumer anzuhalten oder groß angelegte Abfragen gegen die Datenbank des Quellservices auszuführen.
Die Möglichkeit zur erneuten Verarbeitung löst Qualitätsprobleme der Daten jedoch nicht von selbst. Fehlen Events erforderliche Kennungen, Zeitstempel des Auftretens oder Versionsinformationen, oder hat sich die Bedeutung eines Schemas ohne Kompatibilitätsmanagement geändert, sind zuverlässige Ergebnisse schwierig zu erzeugen, selbst wenn historische Daten gelesen werden können. Außerdem kann die Anforderung, Daten zu verarbeiten, die älter als der Aufbewahrungszeitraum sind, nicht allein durch Kafka-Topics erfüllt werden. Wenn die erneute Verarbeitung ein Einführungsgrund ist, bestimmen Sie daher zunächst: „Was wird wie lange und mit welcher Bedeutung erneut abgespielt?“
Kann Kafka auch Datenbanken und externe Systeme verbinden?
Kafka kann nicht nur Events zwischen Services zustellen, sondern auch als zentraler Fluss für Datenpipelines eingesetzt werden. Change Data Capture (CDC) ist ein Ansatz, um Änderungen in einer Datenbank in einen Datenfluss zu senden, und kann erwogen werden, wenn Änderungen an operativen Daten in Analytics, Suche oder anderen Services abgebildet werden müssen. Kafka Connect stellt eine API und ein Connector-Modell für wiederkehrende Integrationen zum Einlesen und Ausgeben von Daten mit externen Systemen bereit. kafka.apache.org
Beispiele, in denen diese Konfiguration nützlich sein kann:
- Änderungen aus einer operativen Datenbank kontinuierlich an einen Analytics-Speicher senden.
- Logs und Metriken aus mehreren Anwendungen in einem gemeinsamen Datenfluss sammeln.
- In einem System erzeugte Daten in einem Index oder einer abgeleiteten Tabelle eines anderen Speichers abbilden.
- Kontinuierliche Datenflüsse zwischen On-Premises- und Cloud-Umgebungen aufbauen.
Die Nutzung von Connectors beseitigt weder Unterschiede in Datenmodellen, Semantik von Löschungen, Probleme mit der Reihenfolge, Zugriffsverwaltung noch die Schreibgrenzen von Zielsystemen. Insbesondere wenn Datenbankänderungen als Events verwendet werden, müssen Sie zwischen der Tatsache „eine Zeile wurde geändert“ und dem Geschäfts-Event „eine Bestellung wurde bestätigt“ unterscheiden. Ersteres liegt näher an einer Speicheränderung, während Letzteres ein Geschäfts-Event mit fachlicher Bedeutung ist. Beide gleichzusetzen, kann dazu führen, dass Consumer zu stark von der Speicherstruktur abhängen.
Die Einführung von Kafka für Datenpipelines ist daher zuverlässiger, wenn sie mehr leistet als die Verringerung der Verbindungsanzahl – nämlich auch Datenverantwortliche, Schemata und Verantwortlichkeiten für Änderungen klärt.
In welchem Umfang ist die Reihenfolge garantiert und warum ist das Key-Design wichtig?
In Kafka ist die Reihenfolge von Events innerhalb einer Partition garantiert, nicht über ein gesamtes Topic hinweg. Mehrere Partitionen ermöglichen parallele Verarbeitung, es gibt jedoch keine einzige globale Reihenfolge über sie hinweg. kafka.apache.org
Wenn beispielsweise ein Bestellstatus in der Reihenfolge created, payment completed und shipping started verarbeitet werden muss, können Sie die Bestell-ID als Key verwenden, damit Events derselben Bestellung in derselben Partition aufgezeichnet werden. So können Sie die Datensatzreihenfolge innerhalb dieser Bestellung als Einheit nutzen. Änderungen des Kundenstatus können ähnlich gestaltet werden, indem die Kunden-ID als Key verwendet wird.
Wenn umgekehrt alle Bestell-Events einzeln in einer übergreifenden chronologischen Reihenfolge verarbeitet werden müssen, kann effektiv eine Entscheidung nahe an einer einzelnen Partition erforderlich sein. In diesem Fall wird die Reihenfolge zwar einfacher, aber die Kapazität für parallele Verarbeitung ist begrenzt. Globale Reihenfolge und hohe Parallelität sind keine Eigenschaften, die Sie gleichzeitig unbegrenzt erhalten können.
Die Auswahl des Keys bringt ein weiteres Problem mit sich. Erzeugt ein bestimmter Kunde oder ein Gerät ungewöhnlich viele Events, kann dieser Key in einer Partition konzentriert werden. Das kann als Key Skew betrachtet werden, und nur einige Consumer können übermäßig stark ausgelastet sein. Keys sollten daher die Geschäftseinheit repräsentieren, für die Reihenfolge erforderlich ist, und zugleich darauf geprüft werden, dass sie in der erwarteten Datenverteilung keinen übermäßigen Skew verursachen.
Bei der Dokumentation von Anforderungen an die Reihenfolge sollten Sie nicht bei der Aussage „Reihenfolge ist wichtig“ stehen bleiben. Besser ist es, sie wie folgt zu konkretisieren:
- Innerhalb welchen Kennungsbereichs ist Reihenfolge erforderlich?
- Ist die Reihenfolge nach Event-Zeit oder die Reihenfolge der Datensatzschreibung erforderlich?
- Wie werden verspätet eintreffende Events behandelt?
- Welcher geschäftliche Fehler entsteht, wenn Events in falscher Reihenfolge eintreffen?
- Ist globale Reihenfolge auch auf Kosten geringerer Parallelität erforderlich?
Die Antworten bestimmen die Trennung von Topics, Keys, Partitionsanzahlen und Consumer-Logik.
Wie sollten doppelte Verarbeitung und Exactly-once-Verarbeitung verstanden werden?
Kafka-Consumer benötigen ein Design, das aufgrund von Fehlern und Wiederholungen standardmäßig von At-least-once-Verarbeitung ausgeht. Wenn ein Consumer beispielsweise die Verarbeitung eines Events abschließt, aber stoppt, bevor er seine Verarbeitungsposition speichert, kann er nach der Wiederherstellung dasselbe Event erneut lesen. Daher ist eine doppelte Verarbeitung desselben Events möglich. kafka.apache.org
Die praktische Lösung besteht darin, die Consumer-Logik idempotent zu gestalten. Idempotenz ist die Eigenschaft, bei mehrfacher Ausführung derselben Operation dasselbe Endergebnis zu erzeugen. Beispielsweise kann eine Operation wie set the status of order 123 to delivered so entworfen werden, dass die Wiederholung desselben Statusupdates das Ergebnis nicht wesentlich verändert. Eine Operation, die unconditionally adds 1,000 points, kann dagegen bei erneutem Empfang desselben Events ein anderes Ergebnis erzeugen. Sie benötigt deshalb eine Deduplizierungsstrategie, etwa durch das Speichern von Event-IDs oder die Verwendung eindeutiger Constraints im Zielspeicher.
Wenn Lesen, Verarbeitung und Schreiben innerhalb von Kafka-Topics verbunden werden, unterstützt Kafka Exactly-once-Verarbeitungskonfigurationen über Transaktionen und die Isolationsstufe read_committed. Dies darf jedoch nicht so verstanden werden, dass jede externe Wirkung automatisch nur einmal eintritt. Nebeneffekte außerhalb von Kafka, beispielsweise externe Datenbankupdates, E-Mail-Zustellung oder Aufrufe von Zahlungs-APIs, erfordern eine Abstimmung mit dem Zielsystem und ein separates Design. kafka.apache.org
Stellen Sie daher vor der Einführung für jeden Consumer folgende Fragen:
- Was passiert, wenn dasselbe Event zweimal verarbeitet wird?
- Hat jedes Event eine ID, die zur Erkennung von Duplikaten verwendet werden kann?
- Verhindert der Ergebnisspeicher Duplikate oder unterstützt er sichere Updates?
- Nach welchen Kriterien wird wiederholt, wenn ein externer Aufruf fehlschlägt oder seine Antwort unklar ist?
- Wie werden bereits ausgeführte Nebeneffekte bei der erneuten Verarbeitung behandelt?
Wird Kafka eingeführt, ohne diese Fragen zu beantworten, kann der Transport selbst zuverlässig sein, während doppelte oder inkonsistente Geschäftsergebnisse weiterhin schwer zu erkennen sind.
Sind Fehlertoleranz und Dauerhaftigkeit automatisch garantiert?
Kafka kann so konfiguriert werden, dass es durch die Replikation von Topic-Partitionen auf Broker-Ausfälle vorbereitet ist. Dies kann ein großer Vorteil für Datenflüsse sein, bei denen replizierte Partitionen, fortgesetzter Betrieb bei Broker-Ausfällen und Lastverteilung auf viele Consumer wichtig sind. kafka.apache.org
Die Schlussfolgerung „Daten können nicht verloren gehen, weil wir Kafka einsetzen“ ist jedoch nicht korrekt. Die tatsächliche Dauerhaftigkeit und Verfügbarkeit hängen vom Replikationsfaktor, den Producer-Quittierungseinstellungen, dem Umfang gleichzeitig möglicher Ausfälle, den Aufbewahrungsrichtlinien und Betriebsverfahren ab. Selbst mit Replikaten können die Ergebnisse von den Erwartungen abweichen, wenn Replikate in derselben Fehlerdomäne platziert sind, wichtige Einstellungen nicht dem erforderlichen Niveau entsprechen oder Wiederherstellungsverfahren nicht von den Betreibern validiert wurden. kafka.apache.org
Es hilft, Anforderungen an die Fehlertoleranz explizit aufzuschreiben. Beispielsweise: „Die Produktion und der Konsum von Bestell-Events müssen bei Ausfall eines Brokers fortgesetzt werden“, „Duplikate nach einem Consumer-Ausfall sind akzeptabel, Auslassungen jedoch nicht“ oder „Events innerhalb eines festgelegten Zeitraums müssen erneut verarbeitbar sein“. Diese Anforderungen bestimmen nicht nur Replikation und Quittierungen, sondern auch Consumer-Idempotenz, Monitoring, Speicherkapazität und Wiederherstellungsübungen.
Da erneut verarbeitbare Historie zu einem wichtigen Datenwert werden kann, sollten Sie gesondert bewerten, ob Topics personenbezogene Informationen oder sensible Geschäftsdaten enthalten. Zugriffskontrolle und die Sicherheit betrieblicher Schnittstellen sind keine nachträglichen Aufgaben, die vom Design des Datenflusses getrennt sind. Der Kafka-Betrieb erfordert zudem Sicherheitseinstellungen für administrativen Zugriff, einschließlich Monitoring. kafka.apache.org
Ist Kafka immer besser als eine einfache Work Queue oder eine synchrone API?
Nein. Kafka ist kein automatischer Ersatz für jede asynchrone Anforderung. Wenn die Anforderung eher lautet „ein Bild einmal konvertieren“, „einen Bericht erzeugen und nur das Ergebnis zurückgeben“ oder „ein Consumer soll einen Job abholen und verarbeiten“, und lange Aufbewahrung, mehrere Subscriptions und erneute Verarbeitung nicht zentral sind, kann eine einfachere Work Queue oder ein Managed Service hinsichtlich Kosten und Betriebsaufwand besser passen. Kafkas Hauptstärken treten hervor, wenn großskalige Event-Flüsse, mehrere unabhängige Consumer und die Wiederverwendung aufbewahrter Historie zusammenkommen. kafka.apache.org
Auch synchrone APIs haben eine andere Rolle. Eine Anfrage, bei der ein Nutzer auf eine Schaltfläche klickt und ein unmittelbares Erfolgs- oder Fehlerergebnis benötigt, passt naturgemäß zu einer Request-Response-API. Nach Abschluss dieser Anfrage kann der Ablauf, nachgelagerte Systeme über die Tatsache zu informieren, in Events getrennt werden. Anders gesagt: Statt ausschließlich zwischen synchronen Aufrufen und Kafka zu wählen, ist es oft angemessener, APIs für Nutzerinteraktionen und Events für die asynchrone Verteilung an nachgelagerte Systeme zu verwenden.
Der folgende Vergleich kann die Entscheidung vereinfachen:
| Primärer Bedarf | Zuerst zu bewertender Ansatz | Bedingungen, unter denen Kafka besonders vorteilhaft wird |
|---|---|---|
| Einen Job einmal verarbeiten | Einfache Work Queue oder verwalteter asynchroner Service | Wenn mehrere unabhängige Systeme dasselbe Jobergebnis oder Event lesen müssen |
| Anfrage, die ein unmittelbares Ergebnis benötigt | Synchrone API | Wenn sich vielfältige nachgelagerte Arbeit nach Abschluss der Anfrage asynchron verteilen muss |
| Daten zwischen Systemen übertragen | Direkte Integration oder Datei-/Batch-Ansatz | Wenn kontinuierlicher Fluss, mehrere Ziele und Anforderungen an erneute Verarbeitung zusammen bestehen |
| Log-, Verhaltens- oder Messdaten erfassen | Erfassungstools und Speicher | Wenn mehrere Consumer Datenströme mit hohem Volumen unabhängig verarbeiten müssen |
| Die Historie von Zustandsänderungen verwalten | Geschäftsdatenbank | Wenn Events erneut abgespielt werden müssen, um Zustand oder abgeleitete Daten zu rekonstruieren |
Diese Tabelle ist keine absolute Regel für die Produktauswahl. Die bestehende Plattform eines Teams, die Verfügbarkeit verwalteter Services, Sicherheitsrichtlinien und das für den Betrieb verfügbare Personal beeinflussen die Entscheidung ebenfalls. Entscheidend ist die Natur des zu lösenden Datenflusses und nicht eine Funktionsliste.
Was muss für Betrieb und Governance vorbereitet werden?
Die Einführung von Kafka beschränkt sich nicht auf das Hinzufügen einer Anwendungsbibliothek. Sie erfordert auch ein Betriebsmodell für die kontinuierliche Verwaltung von Topics, Partitionen, Replikation, Aufbewahrung, Zugriffsberechtigungen, Monitoring und Kapazität. Kafka stellt JMX-Metriken bereit, doch Betriebsinformationen schaffen nur dann echten Nutzen, wenn Sie festlegen, welche Metriken Warnungen auslösen, wer reagiert und wie die Wiederherstellung erfolgt. kafka.apache.org
Zunächst müssen Event-Verträge verwaltet werden. Ein Event-Vertrag umfasst nicht nur Feldnamen und Datentypen, sondern auch die fachliche Bedeutung jedes Feldes, ob es optional ist, wie Versionsänderungen behandelt werden und die Unterscheidung zwischen Produktionszeit und Eintrittszeit. Kompatibilitätsstandards sind notwendig, damit Consumer nicht unbemerkt falsch arbeiten, wenn ein Producer ein Feld löscht oder dessen Bedeutung verändert.
Als Nächstes müssen Topic-Richtlinien klar sein. Für jedes Topic müssen Sie Folgendes entscheiden:
- Welche Events es enthält und wer dafür verantwortlich ist.
- Wie Aufbewahrungszeitraum und Kriterien für Speicherkapazität aussehen.
- Welche Anforderungen an Reihenfolge und Durchsatz die Partitionsanzahl und den Key bestimmt haben.
- Welches Fehlerniveau Replikation und Producer-Quittierungen erreichen sollen.
- Wer produzieren und konsumieren darf und wie sensible Daten geschützt werden.
- Ab welchem Consumer-Lag eine Untersuchung und Reaktion beginnt.
Auch Kapazitätsplanung ist wichtig. Längere Aufbewahrungszeiträume oder stärkere Replikation erhöhen den Speicherbedarf. Wenn Consumer nach einem langen Stillstand erneut verarbeiten können müssen, muss die Historie möglicherweise entsprechend lange aufbewahrt werden. Umgekehrt kann eine kurze Aufbewahrung Kosten senken, schränkt aber den Umfang historischer Daten ein, die für Ausfallwiederherstellung oder das Hinzufügen neuer Consumer verfügbar sind. Diese Entscheidung bestimmt nicht nur Kosten, sondern auch den Umfang der Produktfunktionen und die Wiederherstellbarkeit.
In Organisationen mit unklarer Betriebsverantwortung kann eine gemeinsame Kafka-Plattform stattdessen Abhängigkeitsprobleme verstärken. Eine Vereinbarung darüber, welche Änderungen und Incidents in der Verantwortung von Topic-Verantwortlichen, Plattformbetreibern, Sicherheitsverantwortlichen und Consumer-Entwicklungsteams liegen, ist ebenso wichtig wie die technische Konfiguration.
Welche Fragen sollten Sie vor der Einführung zur Entscheidung nutzen?
Die Frage, die am besten zwischen einer Einführung und einem Verzicht auf Kafka unterscheidet, lautet nicht: „Benötigen wir asynchrone Nachrichten?“ Eine präzisere Frage lautet: Müssen mehrere unabhängige Consumer kontinuierlich eine großskalige Event-Historie lesen und sie nach Lag oder Ausfall erneut verarbeiten? Wenn die Antwort eindeutig ja lautet, stimmen Ihre Anforderungen wahrscheinlich mit den Kernmerkmalen von Kafka überein. kafka.apache.orgkafka.apache.org
Für den Beginn von Einführungsdiskussionen können Sie die folgende Checkliste verwenden:
- Mehrere Consumer: Müssen mehrere Systeme derzeit oder in naher Zukunft dasselbe Event unabhängig nutzen?
- Wert der Historie: Müssen Events nach dem Konsum aufbewahrt und für Fehlerbehebungen, Audits oder neue Analysen erneut gelesen werden?
- Verarbeitungsskalierung: Erfordern anhaltend große Eingangsvolumina oder Lastspitzen eine Entkopplung von Produktion und Konsum?
- Umfang der Reihenfolge: Kann das Problem mit Reihenfolge nach einem Key wie Kunde oder Bestellung statt globaler Reihenfolge gelöst werden?
- Behandlung von Duplikaten: Kann jeder Consumer doppelte Events sicher verarbeiten oder identifizieren?
- Vertragsmanagement: Gibt es Verantwortliche und Prozesse für die Verwaltung von Änderungen an Event-Schemata und -Bedeutungen?
- Betriebsbereitschaft: Gibt es einen verantwortlichen Owner, der Lag, Speicherkapazität, Broker-Ausfälle, Berechtigungen und erneute Verarbeitung beobachten und darauf reagieren kann?
- Vergleich von Alternativen: Könnte die Anforderung durch die Verteilung von Jobs an einen einzelnen Consumer oder durch Request-Response allein einfacher erfüllt werden?
Nicht jeder Punkt muss zu Beginn für die Einführung von Kafka perfekt erfüllt sein. Wenn jedoch die Anforderungen in den Punkten 1 bis 5 stark sind, während die Vorbereitung in den Punkten 6 und 7 fehlt, kann eine große Lücke zwischen technischer Möglichkeit und einem betreibbaren System entstehen. Es kann hilfreich sein, zunächst Event-Verträge, Duplikatbehandlung, Lag-Beobachtung und erneute Verarbeitung in einem Datenfluss mit kleinem Umfang zu validieren.
Fazit: Kafka ist leistungsstark, wenn Event-Historie geteilt werden muss
Apache Kafka ist nicht nur ein Werkzeug, um Nachrichten asynchron zu verschieben; es ist eine Plattform, die von mehreren Systemen gemeinsam genutzte Event-Flüsse aufbewahrt und ihnen erlaubt, diese Flüsse unabhängig zu konsumieren. Sein Einführungswert steigt in Umgebungen, die mehrere Subscriptions auf dieselben Events, parallele Verarbeitung großer Datenflüsse, das Aufholen nach Lag und die erneute Verarbeitung historischer Datensätze gemeinsam benötigen. kafka.apache.orgkafka.apache.org
Umgekehrt können einfachere Alternativen besser für Anforderungen geeignet sein, bei denen einmalige Arbeit an einen einzelnen Consumer übergeben wird, unmittelbare Antworten im Mittelpunkt stehen oder bei kleinen Flüssen der Betriebsaufwand minimiert werden muss. Bewerten Sie bei der Auswahl von Kafka nicht nur den Durchsatz, sondern auch, ob Sie bereit sind, Reihenfolge auf Partitionsebene, doppelte Verarbeitung, Aufbewahrungsrichtlinien, Event-Verträge, Sicherheit und Beobachtbarkeit zu verwalten. Je stärker diese Bedingungen erfüllt sind, desto eher kann Kafka zu einer Grundlage werden, um die Kopplung zwischen Services zu verringern und die Nutzung von Daten auszubauen.