Apache Kafka: Messaging- und Streaming-Plattform für hochskalierbare Systeme
Das Betreiben von Apps, Web-Services, Serveranwendungen und Co. stellt die Verantwortlichen vor eine Vielzahl an Herausforderungen. Eine der häufigsten besteht beispielsweise darin, den reibungslosen Transport sowie eine möglichst schnelle und effiziente Verarbeitung von Datenströmen zu gewährleisten. Eine Software, die beides erheblich vereinfacht, ist die Messaging- und Streaming-Anwendung Apache Kafka. Ursprünglich als Nachrichten-Warteschlangendienst für die Plattform LinkedIn entwickelt, liefert die Open-Source-Lösung mittlerweile ein Komplettpaket für die Speicherung, Übertragung und Weiterverarbeitung von Daten.
Was ist Apache Kafka?
Die Software Apache Kafka ist eine plattformunabhängige Open-Source-Anwendung der Apache Software Foundation, deren Fokus auf der Verarbeitung von Datenströmen liegt. Das Projekt wurde ursprünglich im Jahr 2011 von LinkedIn, dem Unternehmen hinter dem gleichnamigen Business-Netzwerk, ins Leben gerufen. Dabei stand die Entwicklung einer Nachrichten-Queue (dt. Nachrichtenwarteschlange) im Vordergrund. Seit der Veröffentlichung unter freier Lizenz (Apache 2.0) wurde die Software stark erweitert, sodass aus der einfachen Queue-Anwendung eine leistungsstarke Streaming-Plattform mit großem Funktionsumfang geworden ist, die auch von bekannten Unternehmen wie Netflix, Microsoft oder Airbnb genutzt wird.
2014 gründeten die ursprünglichen Entwickler aus dem LinkedIn-Team die Firma Confluent, die seitdem mit Confluent Platform die umfangreichste Version von Apache Kafka anbietet. Diese ergänzt das Programm um zusätzliche Funktionen, die teils ebenfalls Open Source, teils kommerziell sind.
Welche Grundfunktionen bietet Apache Kafka?
Apache Kafka ist vor allem darauf ausgelegt, die Übertragung und Verarbeitung von Datenströmen zu optimieren, die per Direktverbindung zwischen Datenempfänger und Datenquelle ausgetauscht werden. Kafka agiert dabei als Messaging-Instanz zwischen Sender und Empfänger und bietet Lösungen für die typischen Schwierigkeiten, die mit einer solchen Verbindung einhergehen:
So löst die Apache-Plattform unter anderem das Problem, dass ein Zwischenspeichern von Daten bzw. Nachrichten unmöglich ist, wenn der Empfänger (beispielsweise aufgrund von Netzwerkproblemen) nicht verfügbar ist. Zudem verhindert eine gut eingerichtete Kafka-Queue, dass der Sender den Empfänger überlastet. Das ist immer dann der Fall, wenn die Informationen bei der Direktverbindung schneller gesendet werden, als diese empfangen und verarbeitet werden können. Schließlich ist die Kafka-Software auch für solche Szenarios geeignet, in denen das Zielsystem die Nachricht zwar erhält, während des Verarbeitungsprozesses jedoch abstürzt. Während der Sender normalerweise trotz des Absturzes davon ausgehen würde, dass die Verarbeitung erfolgt ist, erhält er durch Apache Kafka Rückmeldung über den Fehlschlag.
Im Gegensatz zu reinen Nachrichtenwarteschlangen-Diensten wie in Datenbanken arbeitet Apache Kafka fehlertolerant, wodurch die Software die Voraussetzung für eine kontinuierliche Verarbeitung von Nachrichten bzw. Daten schafft. In Kombination mit der hohen Skalierbarkeit und der Möglichkeit, transportierte Informationen auf beliebig viele Systeme zu verteilen (verteiltes Transaktions-Log) macht dieser Umstand Apache Kafka zu einer exzellenten Lösung für alle Dienste, die eine schnelle Speicherung und Verarbeitung von Daten sowie eine hohe Verfügbarkeit gewährleisten sollen.
Die Apache-Kafka-Architektur im Überblick
Apache Kafka wird als Cluster (Rechnerverbund) auf einem oder mehreren Servern, die verschiedene Rechenzentren umfassen können, ausgeführt. Die einzelnen Knoten des Clusters, die man als Broker bezeichnet, speichern und kategorisieren eingehende Datenströme in sogenannte Topics. Dabei werden die Daten in Partitionen aufgeteilt und im Cluster repliziert und verteilt sowie mit einem Zeitstempel versehen. Auf diese Weise sorgt die Streaming-Plattform für eine hohe Verfügbarkeit und einen schnellen Lesezugriff. Die Topics differenziert Apache Kafka in „Normal Topics“ und „Compacted Topics“. In Normal Topics kann Kafka die Nachrichten löschen, sobald Speicherzeitraum oder Speicherlimit überzogen wurden, während die Einträge in Compacted Topics weder einer Zeit- noch einer Platzlimitierung unterliegen.
Anwendungen, die Daten in einen Kafka-Rechnerverbund schreiben, werden als Producer bezeichnet, während alle Anwendungen, die Daten eines Kafka-Clusters lesen, die Bezeichnung Consumer tragen. Die zentrale Komponente, auf die Producer und Consumer bei der Verarbeitung von Datenströmen zugreifen, ist eine Java-Bibliothek mit dem Namen Kafka Streams. Die Unterstützung von transaktionalem Schreiben garantiert dabei, dass Nachrichten immer nur ein einziges Mal (ohne Doppelung) übertragen werden, was auch als „exactly-once delivery“ (dt. „genau einmal“-Lieferung) bezeichnet wird.
Die Java-Bibliothek Kafka Streams ist zwar die empfohlene Standardlösung für die Datenverarbeitung in Kafka-Clustern. Sie können Apache Kafka aber auch mit anderen Systemen zur Stream-Verarbeitung nutzen!
Technische Grundlagen: Die Kafka-Schnittstellen
Um Anwendungen den Zugriff auf Apache Kafka zu gewähren, bietet die Software fünf verschiedene Kern-Schnittstellen an:
- Kafka Producer: Das Producer-API ermöglicht Anwendungen, Datenströme an den bzw. die Broker eines Apache-Cluster zu senden, um diese zu kategorisieren und zu speichern (in den bereits erwähnten Topics).
- Kafka Consumer: Über die Consumer-API erhalten Apache-Kafka-Consumer Lesezugriff auf Daten, die in den Topics des Clusters gespeichert sind.
- Kafka Streams: Das Streams-API erlaubt es einer Anwendung, als Stream-Prozessor zu fungieren, um eingehende Datenströme in ausgehende Datenströme umzuwandeln.
- Kafka Connect: Dank des Connect-API ist es möglich, wiederverwendbare Producer und Consumer einzurichten, die Kafka-Topics mit existierenden Applikationen oder Datenbanksystemen verbinden.
- Kafka AdminClient: Die Schnittstelle „AdminClient“ dient der einfachen Administration und Inspektion des Kafka-Clusters.
Die Kommunikation zwischen Clientanwendungen und einzelnen Servern des Apache-Clusters erfolgt über ein simples, leistungsstarkes und sprachenunabhängiges Protokoll auf Grundlage von TCP. Standardmäßig stellen die Entwickler einen Java-Client für Apache Kafka zur Verfügung – es existieren aber auch Clients in verschiedenen anderen Sprachen wie PHP, Python, C/C++, Ruby, Perl oder Go.
Einsatzszenarios für Apache Kafka
Apache Kafka ist von Beginn an für einen hohen Schreib- und Lesedurchsatz konzipiert worden. In Kombination mit den aufgezählten APIs sowie der hohen Flexibilität, Skalierbarkeit und Fehlertoleranz macht dies die Open-Source-Software für die verschiedensten Anwendungsfälle interessant. Dabei eignet sich Apache Kafka insbesondere für folgende Bereiche:
- Datenströme veröffentlichen und abonnieren: Damit, Apache Kafka als Messaging-System zu nutzen, hat die Geschichte des Open-Source-Projekts begonnen. Auch nach der Erweiterung der Software ist diese bestens für die direkte Nachrichtenübertragung via Warteschlangensystem, aber auch für Broadcast-Nachrichtenaussendung geeignet.
- Datenströme weiterverarbeiten: Applikationen, die in Echtzeit auf bestimmte Events reagieren sollen und zu diesem Zweck möglichst schnell und effektiv Datenströme weiterverarbeiten müssen, finden in Apache Kafka dank der Stream-API einen leistungsstarken Partner.
- Datenströme speichern: Auch als verteiltes, fehlertolerantes Speichersystem lässt sich Apache Kafka einsetzen. Dabei spielt es keine Rolle, ob Sie 50 Kilobyte oder 50 Terabyte an konsistenten Daten auf dem bzw. den Servern speichern wollen.
Alle aufgezeigten Elemente lassen sich natürlich beliebig kombinieren, sodass Apache Kafka beispielsweise als komplexe Streaming-Plattform Daten nicht nur speichert und jederzeit verfügbar macht, sondern auch in Echtzeit verarbeitet und mit allen gewünschten Anwendungen und Systemen verknüpft.
Typische Use Cases für Apache Kafka im Überblick:
- Messaging-System
- Web-Analytics
- Speichersystem
- Stream-Prozessor
- Event Sourcing
- Logfile-Analyse/-Management
- Monitoring-Lösungen
- Transaktions-Log