In den heutigen Datenverarbeitungsarchitekturen wird Apache Kafka häufig in der Ingress-Phase verwendet. Normalerweise wird dieser Schritt verwendet, um die eingehenden Nachrichtendaten anzureichern und zu filtern; es ist jedoch erst zu einem späteren Zeitpunkt in der Datenverarbeitungspipeline möglich, interaktive Abfragen durchzuführen. Dies liegt daran, dass, obwohl jede Nachricht in einem Kafka-Thema standardmäßig beibehalten wird, noch kein Mechanismus verfügbar ist, der eine schnelle Suche nach einer bestimmten Nachricht in einem Thema ermöglicht.Dennoch würde die Möglichkeit, neue Daten in diesem frühen Stadium der Pipeline abzufragen, die Verzögerungen herkömmlicher Verarbeitungspipelines vermeiden, die normalerweise langwierige Batch-Vorverarbeitungsschritte umfassen, und den Endbenutzern einen nahezu sofortigen Zugriff auf eingehende Daten ermöglichen.
Zum Erstellen von Datenverarbeitungsanwendungen mit Kafka wird häufig die Kafka Streams-Bibliothek verwendet, die als Teil des Kafka-Projekts verwaltet wird, um Datentransformationen und -analysen zu definieren. Ein wichtiges Merkmal von Kafka Streams sind State Stores, die eine Abstraktion eines schnellen lokalen Schlüssel-Wert-Speichers bieten, in den gelesen und geschrieben werden kann, wenn Nachrichten mit Kafka Streams verarbeitet werden. Diese Schlüssel-Wert-Speicher können kontinuierlich mit neuen Nachrichten aus einem Kafka-Thema gefüllt werden, indem ein geeigneter Stream-Prozessor definiert wird, so dass es jetzt möglich ist, Nachrichten aus dem zugrunde liegenden Thema schnell abzurufen.
Aufbauend auf dieser Kafka Streams-Funktionalität erstellen wir eine einheitliche REST-API, die einen einzigen Abfrageendpunkt für ein bestimmtes Kafka-Thema bereitstellt.Zusammenfassend lässt sich sagen, dass die Kombination von Kafka-Streams-Prozessoren mit Statusspeichern und einem HTTP-Server jedes Kafka-Thema effektiv in einen schnellen schreibgeschützten Schlüsselwertspeicher verwandeln kann.
Kafka Streams ist als Bibliothek aufgebaut, die in eine eigenständige Java- oder Scala-Anwendung eingebettet werden kann. Es ermöglicht Entwicklern, Stream-Prozessoren zu definieren, die Datentransformationen oder Aggregationen für Kafka-Nachrichten durchführen, um sicherzustellen, dass jede Eingabenachricht genau einmal verarbeitet wird. Mit dem Kafka Streams DSL, das von der Java Stream API inspiriert ist, können Stream-Prozessoren und Statusspeicher flexibel verkettet werden.Darüber hinaus bilden die Prozesse beim Starten mehrerer Instanzen einer Kafka Streams-basierten Anwendung automatisch einen lastausgleichenden, hochverfügbaren Verarbeitungscluster, ohne von anderen externen Systemen als Kafka abhängig zu sein.Stellen Sie sich folgendes Szenario vor, um die Architektur einer Kafka Streams-Anwendung zu veranschaulichen, die State Stores verwendet: Als Eisenbahnbetreiber wird jedes Mal, wenn ein Kunde eine Reise auf unserer Website bucht, eine neue Nachricht bestehend aus der Kunden-ID und einem Zeitstempel in ein Kafka-Thema eingefügt. Insbesondere fügen ein oder mehrere Kafka-Produzenten diese Nachrichten in ein Thema mit neun Partitionen ein. Da die Kunden-ID als Schlüssel für jede Nachricht ausgewählt wird, werden Daten, die zu einem bestimmten Kunden gehören, immer in dieselbe Partition des Themas eingefügt. Implizit verwenden Kafka-Produzenten die DefaultPartitioner , um Partitionen Nachrichten zuzuweisen.Angenommen, wir haben eine Kafka Streams-Anwendung, die Nachrichten aus diesem Thema liest und in einem Statusspeicher beibehält. Da der Schlüssel jeder Nachricht nur aus der Kunden-ID besteht, ist der entsprechende Wert im Statusspeicher immer der Zeitstempel der letzten Buchung des Kunden. Um den maximalen Grad der parallelen Verarbeitung zu erreichen, können wir bis zu neun Instanzen der Kafka Streams-Anwendung starten. In diesem Fall wird jeder Anwendungsinstanz genau eine der Themenpartitionen zugewiesen. Für jede Eingabepartition erstellt Kafka Streams einen separaten Statusspeicher, der wiederum nur die Daten der Kunden enthält, die zu dieser Partition gehören.
Die resultierende Anwendungsarchitektur ist im folgenden Diagramm dargestellt.