{"id":35786,"date":"2019-10-31T22:06:19","date_gmt":"2019-10-31T19:06:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\/"},"modified":"2019-10-31T22:06:19","modified_gmt":"2019-10-31T19:06:19","slug":"kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","title":{"rendered":"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/457756\/\"><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/6f8bd2b31b87b0c760c1148515893c43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex> Hallo, Habr-Nutzer! Dieses Buch eignet sich f\u00fcr jeden Entwickler, der sich mit Stream-Processing vertrautmachen m\u00f6chte. Ein Verst\u00e4ndnis des verteilten Programmierens wird Ihnen helfen, Kafka und Kafka Streams besser zu verstehen. Es w\u00e4re von Vorteil, auch mit dem Kafka-Framework vertraut zu sein, ist aber nicht zwingend erforderlich: Ich werde Ihnen alles Notwendige erkl\u00e4ren. Sowohl erfahrene Kafka-Entwickler als auch Anf\u00e4nger werden mit diesem Buch lernen, interessante Anwendungen f\u00fcr die Stream-Verarbeitung mit der Kafka Streams-Bibliothek zu erstellen. Java-Entwickler auf mittlerem und h\u00f6herem Niveau, die mit Konzepten wie Serialisierung bereits vertraut sind, werden lernen, wie sie ihre F\u00e4higkeiten zur Erstellung von Kafka Streams-Anwendungen einsetzen k\u00f6nnen. Der Quellcode des Buches ist in Java 8 geschrieben und nutzt stark die Syntax von Lambda-Ausdr\u00fccken in Java 8, sodass Kenntnisse im Umgang mit Lambda-Funktionen (auch in einer anderen Programmiersprache) n\u00fctzlich sein werden.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Auszug. 5.3. Aggregation und Fensteroperationen<\/h3>\n<p>\nIn diesem Abschnitt werden wir uns mit den vielversprechendsten Teilen von Kafka Streams besch\u00e4ftigen. Bisher haben wir folgende Aspekte von Kafka Streams betrachtet:<\/p>\n<ul>\n<li>Erstellung von Verarbeitungstopologien;<\/li>\n<li>Nutzung von Zust\u00e4nden in Streaming-Anwendungen;<\/li>\n<li>Durchf\u00fchrung von Datenstromverbindungen;<\/li>\n<li>Unterschiede zwischen Ereignisstr\u00f6men (KStream) und Aktualisierungsstr\u00f6men (KTable).<\/li>\n<\/ul>\n<p>\nIn den folgenden Beispielen werden wir all diese Elemente zusammenf\u00fchren. Zudem werden Sie mit Fensteroperationen vertraut gemacht \u2014 einer weiteren gro\u00dfartigen Funktion von Streaming-Anwendungen. Unser erstes Beispiel wird eine einfache Aggregation sein.<\/p>\n<h3>5.3.1. Aggregation des Umsatzvolumens von Aktien nach Branchen<\/h3>\n<p>\nAggregation und Gruppierung sind essentielle Werkzeuge im Umgang mit Streaming-Daten. Die Analyse einzelner Datens\u00e4tze in Echtzeit reicht oft nicht aus. Um zus\u00e4tzliche Informationen aus den Daten zu gewinnen, sind Gruppierung und Kombination notwendig.<\/p>\n<p>In diesem Beispiel werden Sie in die Rolle eines Intraday-Traders schl\u00fcpfen, der die Verkaufsvolumina von Aktien mehrerer Unternehmen in verschiedenen Branchen verfolgen muss. Konkret interessieren Sie sich f\u00fcr f\u00fcnf Unternehmen mit den h\u00f6chsten Verkaufsvolumina in jeder Branche.<\/p>\n<p>F\u00fcr eine solche Aggregation sind einige Schritte zur Umformung der Daten in das ben\u00f6tigte Format erforderlich (um es allgemein zu halten).<\/p>\n<ol>\n<li>Erstellen Sie eine Quelle auf Basis eines Themas, die unverarbeitete Informationen \u00fcber den Aktienhandel ver\u00f6ffentlicht. Wir m\u00fcssen das Objekt vom Typ StockTransaction in ein Objekt vom Typ ShareVolume umwandeln. Das liegt daran, dass das StockTransaction-Objekt Metadaten zu Verk\u00e4ufen enth\u00e4lt, wir jedoch nur die Daten zur Anzahl der verkauften Aktien ben\u00f6tigen.<\/li>\n<li>Die ShareVolume-Daten nach Aktiensymbolen gruppieren. Nach der Gruppierung nach Symbolen k\u00f6nnen diese Daten auf die Zwischensummen der Verkaufsvolumen von Aktien zusammengefasst werden. Es ist erw\u00e4hnenswert, dass die Methode KStream.groupBy eine Instanz vom Typ KGroupedStream zur\u00fcckgibt. Um eine Instanz von KTable zu erhalten, kann die Methode KGroupedStream.reduce aufgerufen werden.<\/li>\n<\/ol>\n<p><\/p>\n<blockquote><p><b>Was ist die Schnittstelle KGroupedStream?<\/b><\/p>\n<p>Die Methoden KStream.groupBy und KStream.groupByKey geben eine Instanz von KGroupedStream zur\u00fcck. KGroupedStream ist eine Zwischenrepr\u00e4sentation des Ereignisstroms nach der Gruppierung nach Schl\u00fcsseln. Es ist nicht daf\u00fcr gedacht, direkt damit zu arbeiten. Stattdessen wird KGroupedStream f\u00fcr Aggregationsoperationen verwendet, deren Ergebnis immer eine KTable ist. Da das Ergebnis dieser Aggregationsoperationen eine KTable ist und ein Zustands-Backend verwendet wird, werden m\u00f6glicherweise nicht alle Aktualisierungen weiter durch die Pipeline gesendet.<\/p>\n<p>Die Methode KTable.groupBy gibt eine \u00e4hnliche KGroupedTable zur\u00fcck \u2013 eine Zwischenrepr\u00e4sentation eines Streams von Aktualisierungen, die nach Schl\u00fcssel neu gruppiert sind.<\/p><\/blockquote>\n<p>\nLassen Sie uns eine kurze Pause machen und einen Blick auf Abb. 5.9 werfen, die zeigt, was wir erreicht haben. Diese Topologie sollte Ihnen bereits gut bekannt sein.<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/9fd61317cde376362adcaeec72908919.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSchauen wir uns nun den Code f\u00fcr diese Topologie an (zu finden in der Datei src\/main\/java\/bbejeck\/chapter_5\/AggregationsAndReducingExample.java) (Listing 5.2).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/f937287e448295fbd467c283ceca316a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDer bereitgestellte Code ist kompakt und f\u00fchrt in wenigen Zeilen viele Aktionen aus. Im ersten Parameter der Methode builder.stream finden Sie etwas Neues f\u00fcr sich: den Wert des Enumerations Typs AutoOffsetReset.EARLIEST (es gibt auch LATEST), der durch die Methode Consumed.withOffsetResetPolicy festgelegt wird. Mit diesem Enumerations Typ k\u00f6nnen Sie die Offset-R\u00fccksetzstrategie f\u00fcr jeden KStream oder KTable angeben, die Priorit\u00e4t \u00fcber den Offset-R\u00fccksetzparameter aus der Konfiguration hat.<\/p>\n<blockquote><p><b>GroupByKey und GroupBy<\/b><\/p>\n<p>Im KStream-Interface gibt es zwei Methoden zum Gruppieren von Datens\u00e4tzen: GroupByKey und GroupBy. Beide geben eine KGroupedTable zur\u00fcck, sodass Sie sich m\u00f6glicherweise fragen: Was ist der Unterschied zwischen ihnen und wann sollten Sie welche verwenden?<\/p>\n<p>Die Methode GroupByKey wird angewendet, wenn die Schl\u00fcssel im KStream bereits nicht leer sind. Au\u00dferdem wurde das Flag \u201eerfordert Wiederpartitionierung\u201c niemals gesetzt.<\/p>\n<p>Die Methode GroupBy geht davon aus, dass Sie die Schl\u00fcssel zum Gruppieren ge\u00e4ndert haben, sodass das Flag f\u00fcr die Wiederpartitionierung auf true gesetzt ist. Ausf\u00fchrungen von Verbindungen, Aggregationen usw. nach der Methode GroupBy f\u00fchren automatisch zu einer Wiederpartitionierung.<br \/>\nZusammenfassung: Es ist ratsam, wann immer m\u00f6glich, GroupByKey anstelle von GroupBy zu verwenden.<\/p><\/blockquote>\n<p>\nWas die Methoden mapValues und groupBy tun, ist klar, also schauen wir uns die Methode sum() an (sie ist in der Datei src\/main\/java\/bbejeck\/model\/ShareVolume.java zu finden) (Listing 5.3).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/8e9a6f873594f9b5fef9a96c42353a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Methode ShareVolume.sum gibt die Zwischensumme des Aktienhandelsvolumens zur\u00fcck, und das Ergebnis der gesamten Berechnungskette ist ein Objekt KTable&lt;String, ShareVolume&gt;. Jetzt verstehen Sie, welche Rolle die KTable spielt. Wenn Objekte ShareVolume eintreffen, wird im entsprechenden Objekt KTable das letzte aktuelle Update gespeichert. Es ist wichtig, sich daran zu erinnern, dass alle Updates im vorhergehenden shareVolumeKTable reflektiert werden, aber nicht alle werden weitergeleitet.<\/p>\n<p>Mit dieser KTable f\u00fchren wir eine Aggregation durch (basierend auf der Anzahl der verkauften Aktien), um die f\u00fcnf Unternehmen mit den h\u00f6chsten Verkaufszahlen in jeder Branche zu ermitteln. Unser Vorgehen wird dabei \u00e4hnlich sein wie beim ersten Aggregieren.<\/p>\n<ol>\n<li>F\u00fchren Sie eine weitere groupBy-Operation durch, um die einzelnen ShareVolume-Objekte nach Branchen zu gruppieren.<\/li>\n<li>Beginnen Sie mit der Summierung der ShareVolume-Objekte. Diesmal stellt das Aggregationsobjekt eine Queue mit fester Priorit\u00e4t dar. In dieser Queue mit fester Gr\u00f6\u00dfe werden nur die f\u00fcnf Unternehmen mit den h\u00f6chsten Verkaufszahlen gespeichert.<\/li>\n<li>Darstellen der Queues aus dem vorherigen Punkt als Zeichenfolge und R\u00fcckgabe der f\u00fcnf am meisten verkauften Aktien in den verschiedenen Branchen.<\/li>\n<li>Die Ergebnisse in Zeichenfolgenform in das Thema schreiben.<\/li>\n<\/ol>\n<p>\nIn Abb. 5.10 ist das Diagramm der Datendatenfluss-Topologie dargestellt. Wie Sie sehen, ist der zweite Verarbeitungszyklus recht einfach.<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/dabd1507eee267038edb7f8d76d8d8ae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNachdem Sie nun die Struktur dieser zweiten Verarbeitungsstufe klar verstanden haben, k\u00f6nnen wir uns dem Quellcode zuwenden (den finden Sie in der Datei src\/main\/java\/bbejeck\/chapter_5\/AggregationsAndReducingExample.java) (Listing 5.4).<\/p>\n<p>In diesem Initialisierer gibt es eine Variable fixedQueue. Dies ist ein benutzerdefiniertes Objekt \u2013 ein Adapter f\u00fcr java.util.TreeSet, der verwendet wird, um die N gr\u00f6\u00dften Ergebnisse in absteigender Reihenfolge der verkauften Aktien zu verfolgen.<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/488b072b0d91b81c925ca72291e69e48.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSie sind bereits mit den Aufrufen groupBy und mapValues vertraut, daher lassen wir diese beiseite (wir rufen die Methode KTable.toStream auf, da die Methode KTable.print als veraltet gilt). Sie haben jedoch noch die KTable-Version der Methode aggregate() nicht gesehen, daher werden wir etwas Zeit darauf verwenden, diese zu besprechen.<\/p>\n<p>Wie Sie sich erinnern, zeichnet sich KTable dadurch aus, dass Eintr\u00e4ge mit denselben Schl\u00fcsseln als Aktualisierungen betrachtet werden. KTable ersetzt den alten Eintrag durch den neuen. Die Aggregation erfolgt auf \u00e4hnliche Weise: Es werden die letzten Eintr\u00e4ge mit einem Schl\u00fcssel aggregiert. Bei Eintreffen eines Eintrags wird dieser mithilfe des Summierers (zweiter Parameter im Methodenaufruf aggregate) in eine Instanz der Klasse FixedSizePriorityQueue eingef\u00fcgt. Besteht bereits ein anderer Eintrag mit demselben Schl\u00fcssel, wird der alte Eintrag mithilfe des Subtrahierers (dritter Parameter im Methodenaufruf aggregate) entfernt.<\/p>\n<p>Das bedeutet, dass unser Aggregator, FixedSizePriorityQueue, nicht alle Werte mit einem Schl\u00fcssel aggregiert, sondern eine gleitende Summe der Mengen der N meistverkauften Aktien speichert. In jedem eingehenden Eintrag befindet sich die Gesamtzahl der bisher verkauften Aktien. KTable gibt Ihnen Aufschluss dar\u00fcber, welche Unternehmen momentan die meisten Aktien verkaufen; eine gleitende Aggregation jedes Updates ist nicht erforderlich.<\/p>\n<p>Wir haben gelernt, zwei wichtige Dinge zu tun:<\/p>\n<ul>\n<li>Werte in KTable nach ihrem gemeinsamen Schl\u00fcssel zu gruppieren;<\/li>\n<li>an diesen gruppierten Werten n\u00fctzliche Operationen wie Reduktion und Aggregation durchzuf\u00fchren.<\/li>\n<\/ul>\n<p>\nDie F\u00e4higkeit, diese Operationen auszuf\u00fchren, ist wichtig, um die Bedeutung der Daten zu verstehen, die durch die Kafka Streams-Anwendung flie\u00dfen, und um herauszufinden, welche Informationen sie tragen.<\/p>\n<p>Wir haben auch einige der Schl\u00fcsselkonzepte zusammengef\u00fchrt, die zuvor in diesem Buch behandelt wurden. In Kapitel 4 haben wir erl\u00e4utert, wie wichtig es f\u00fcr eine Streaming-Anwendung ist, eine ausfallsichere lokale Speicherung zu haben. Das erste Beispiel in diesem Kapitel zeigte, warum lokale Speicherung so entscheidend ist \u2013 sie erm\u00f6glicht es, nachzuvollziehen, welche Informationen Sie bereits gesehen haben. Der lokale Zugriff erm\u00f6glicht es, Netzwerkverz\u00f6gerungen zu vermeiden, wodurch die Anwendung leistungsf\u00e4higer und fehlertoleranter wird.<\/p>\n<p>Bei der Durchf\u00fchrung von Faltungs- oder Aggregationsoperationen muss der Name des Zustandsspeichers angegeben werden. Faltungs- und Aggregationsoperationen geben eine Instanz von KTable zur\u00fcck, wobei KTable den Zustandsspeicher verwendet, um alte Ergebnisse durch neue zu ersetzen. Wie Sie gesehen haben, werden nicht alle Aktualisierungen weiter im Kanal gesendet, was wichtig ist, da Aggregationsoperationen darauf abzielen, endg\u00fcltige Informationen zu liefern. Wenn kein lokaler Zustand angewendet wird, wird KTable alle Ergebnisse der Aggregation und Faltung weiterleiten.<\/p>\n<p>Als N\u00e4chstes werden wir uns mit der Ausf\u00fchrung von Operationen wie Aggregation in einem bestimmten Zeitraum befassen \u2013 den sogenannten Fensteroperationen.<\/p>\n<h3>5.3.2. Fensteroperationen<\/h3>\n<p>\nIm vorherigen Abschnitt haben wir die \u201egleitenden\u201c Faltungen und Aggregationen kennengelernt. Die Anwendung f\u00fchrte eine kontinuierliche Faltung des Handelsvolumens von Aktien mit anschlie\u00dfender Aggregation der f\u00fcnf meistverkauften Aktien an der B\u00f6rse durch.<\/p>\n<p>Manchmal sind kontinuierliche Aggregationen und Zusammenfassungen der Ergebnisse notwendig. In anderen F\u00e4llen m\u00fcssen jedoch Operationen nur f\u00fcr einen bestimmten Zeitraum ausgef\u00fchrt werden. Zum Beispiel, um zu berechnen, wie viele B\u00f6rsentransaktionen mit den Aktien eines bestimmten Unternehmens in den letzten 10 Minuten durchgef\u00fchrt wurden. Oder wie viele Nutzer auf das neue Werbebanner in den letzten 15 Minuten geklickt haben. Die Anwendung kann solche Aktionen wiederholt ausf\u00fchren, jedoch nur mit Ergebnissen, die sich auf die festgelegten Zeitr\u00e4ume (Zeitfenster) beziehen.<\/p>\n<h3>Z\u00e4hlung von B\u00f6rsentransaktionen nach K\u00e4ufer<\/h3>\n<p>\nIm n\u00e4chsten Beispiel werden wir B\u00f6rsentransaktionen f\u00fcr mehrere Trader - entweder gro\u00dfe Unternehmen oder f\u00e4hige Einzelk\u00e4mpfer - verfolgen.<\/p>\n<p>Es gibt zwei m\u00f6gliche Gr\u00fcnde f\u00fcr eine solche \u00dcberwachung. Der erste ist die Notwendigkeit zu wissen, was Marktf\u00fchrer kaufen oder verkaufen. Wenn diese gro\u00dfen Akteure und erfahrenen Investoren attraktive M\u00f6glichkeiten sehen, macht es Sinn, ihrer Strategie zu folgen. Der zweite Grund ist das Bed\u00fcrfnis, m\u00f6gliche Anzeichen f\u00fcr illegale Gesch\u00e4fte mit Insiderinformationen zu erkennen. Dazu m\u00fcssen Sie die Korrelation zwischen gro\u00dfen Verkaufsanstiegen und wichtigen Pressemitteilungen analysieren.<\/p>\n<p>Dieser \u00dcberwachungsprozess besteht aus mehreren Schritten, wie zum Beispiel:<\/p>\n<ul>\n<li>Erstellung eines Leseflusses aus dem Thema stock-transactions;<\/li>\n<li>Gruppierung der eingehenden Datens\u00e4tze nach K\u00e4ufer-ID und B\u00f6rsensymbol. Der Methodenaufruf groupBy gibt eine Instanz der Klasse KGroupedStream zur\u00fcck;<\/li>\n<li>R\u00fcckgabe des Datenstroms durch die Methode KGroupedStream.windowedBy, die auf ein zeitlich begrenztes Fenster beschr\u00e4nkt ist, wodurch die M\u00f6glichkeit zur Durchf\u00fchrung von Fensteraggregationen besteht. Je nach Art des Fensters wird entweder eine TimeWindowedKStream oder eine SessionWindowedKStream zur\u00fcckgegeben;<\/li>\n<li>Z\u00e4hlen der Transaktionen f\u00fcr die Aggregationsoperation. Der Fensterdatenstrom bestimmt, ob ein bestimmter Datensatz in dieser Z\u00e4hlung ber\u00fccksichtigt wird;<\/li>\n<li>Das Protokollieren von Ergebnissen in das Thema oder das Ausgeben auf der Konsole w\u00e4hrend der Entwicklung.<\/li>\n<\/ul>\n<p>\nDie Topologie dieser Anwendung ist einfach, aber eine visuelle Darstellung kann nicht schaden. Schauen wir uns Abbildung 5.11 an.<\/p>\n<p>Im Folgenden werden wir die Funktionalit\u00e4t der Fensteroperationen und den entsprechenden Code betrachten.<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/67d9d8d8acb1370a7c7fe5cd9a8b6aa7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Fenstertypen<\/h3>\n<p>\nIn Kafka Streams gibt es drei Fensterarten:<\/p>\n<ul>\n<li>Sitzungsfenster;<\/li>\n<li>\u201eTumbling\u201c-Fenster;<\/li>\n<li>Gleitende\/\u201eHopping\u201c-Fenster.<\/li>\n<\/ul>\n<p>\nWelche man w\u00e4hlt, h\u00e4ngt von den gesch\u00e4ftlichen Anforderungen ab. \u201eTumbling\u201c- und \u201eHopping\u201c-Fenster sind zeitlich begrenzt, w\u00e4hrend die Einschr\u00e4nkungen der Sitzungsfenster mit Benutzeraktionen verkn\u00fcpft sind \u2013 die Dauer der Sitzung(en) wird ausschlie\u00dflich durch die Aktivit\u00e4t des Benutzers bestimmt. Wichtig ist, dass alle Fenstertypen auf Zeitstempeln der Aufzeichnungen basieren und nicht auf der Systemzeit.<\/p>\n<p>Anschlie\u00dfend werden wir unsere Topologie mit jedem der Fenstertypen implementieren. Der vollst\u00e4ndige Code wird nur im ersten Beispiel angegeben; f\u00fcr andere Fenstertypen \u00e4ndert sich nichts, au\u00dfer dem Typ der Fensteroperation.<\/p>\n<h3>Sitzungsfenster<\/h3>\n<p>\nSitzungsfenster unterscheiden sich grundlegend von allen anderen Fensterarten. Sie sind nicht so sehr zeitlich begrenzt, sondern h\u00e4ngen von der Aktivit\u00e4t des Nutzers (oder der Entit\u00e4t, die Sie verfolgen m\u00f6chten) ab. Sitzungsfenster werden durch Perioden der Inaktivit\u00e4t getrennt.<\/p>\n<p>Abbildung 5.12 veranschaulicht das Konzept der Sitzungsfenster. Eine kleinere Sitzung wird mit der Sitzung links von ihr verschmelzen. Die Sitzung rechts wird hingegen separat sein, da sie auf eine l\u00e4ngere Inaktivit\u00e4tsperiode folgt. Sitzungsfenster basieren auf den Aktivit\u00e4ten der Nutzer, verwenden jedoch Zeitstempel aus den Aufzeichnungen, um zu bestimmen, welcher Sitzung der Datensatz zugeordnet wird.<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/d39a5db7af7d6aa2194802622b2b47fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Verwendung von Sitzungsfenstern zur Verfolgung von B\u00f6rsentransaktionen<\/h3>\n<p>\nNutzen wir Sitzungsfenster, um Informationen \u00fcber B\u00f6rsentransaktionen zu erfassen. Die Implementierung von Sitzungsfenstern ist im Listing 5.5 dargestellt (das Sie in der Datei src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKTableJoinExample.java finden k\u00f6nnen).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/2dcbd9a36baec0e746aad165121451b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie meisten Operationen dieser Topologie haben Sie bereits kennengelernt, sodass wir sie hier nicht erneut betrachten m\u00fcssen. Es gibt jedoch auch einige neue Elemente, die wir jetzt besprechen werden.<\/p>\n<p>Bei jeder groupBy-Operation wird in der Regel eine Art von Aggregation durchgef\u00fchrt (Aggregation, Zusammenfassung oder Z\u00e4hlung). Es kann entweder eine kumulative Aggregation mit fortlaufenden Ergebnissen oder eine Fensteraggregation durchgef\u00fchrt werden, bei der die Datens\u00e4tze innerhalb eines bestimmten Zeitfensters ber\u00fccksichtigt werden.<\/p>\n<p>Der Code aus Listing 5.5 z\u00e4hlt die Anzahl der Transaktionen innerhalb der Sitzungsfenster. In Abbildung 5.13 werden diese Schritte der Analyse schrittweise dargestellt.<\/p>\n<p>Mit dem Aufruf windowedBy(SessionWindows.with(twentySeconds).until(fifteenMinutes)) erstellen wir ein Sitzungsfenster mit einer Inaktivit\u00e4tszeit von 20 Sekunden und einer Speicherdauer von 15 Minuten. Die Inaktivit\u00e4tszeit von 20 Sekunden bedeutet, dass die Anwendung jeden Datensatz einbezieht, der innerhalb von 20 Sekunden nach dem Ende oder dem Beginn der aktuellen Sitzung im aktuellen (aktiven) Fenster eingeht.<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/9bd47b04698086872fd135b4c67eb938.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIm Folgenden geben wir an, welche Aggregationsoperation im Sitzungfenster durchgef\u00fchrt werden soll \u2013 in diesem Fall ein `count`. Wenn der eingehende Datensatz den Inaktivit\u00e4tszeitraum (von einem der Zeitstempel) \u00fcberschreitet, erstellt die Anwendung eine neue Sitzung. Die Speicherdauer bedeutet, dass die Sitzung f\u00fcr einen bestimmten Zeitraum aufrechterhalten wird und versp\u00e4tete Daten zul\u00e4sst, die au\u00dferhalb des Inaktivit\u00e4tszeitraums liegen, aber dennoch angef\u00fcgt werden k\u00f6nnen. Dar\u00fcber hinaus entsprechen der Beginn und das Ende der neuen Sitzung, die durch die Zusammenf\u00fchrung entstanden ist, dem fr\u00fchesten und sp\u00e4testen Zeitstempel.<\/p>\n<p>Lassen Sie uns einige Datens\u00e4tze aus der `count`-Methode betrachten, um zu sehen, wie Sitzungen funktionieren (Tabelle 5.1).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/ec04aae466d88c2d2349474069c8d541.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBei eintreffenden Datens\u00e4tzen suchen wir nach bereits bestehenden Sitzungen mit dem gleichen Schl\u00fcssel, wobei die Endzeit kleiner als der aktuelle Zeitstempel ist \u2014 Inaktivit\u00e4tszeitraum und die Startzeit gr\u00f6\u00dfer als der aktuelle Zeitstempel plus Inaktivit\u00e4tszeitraum. In Anbetracht dessen werden vier Datens\u00e4tze aus Tabelle 5.1 folgenderma\u00dfen zu einer Sitzung zusammengef\u00fchrt.<\/p>\n<p>1. Zuerst kommt Datensatz 1 an, sodass die Startzeit gleich der Endzeit ist und beide 00:00:00 betragen.<\/p>\n<p>2. Dann wird der Eintrag 2 hinzugef\u00fcgt, und wir suchen nach Sitzungen, die nicht vor 23:59:55 enden und nicht sp\u00e4ter als 00:00:35 beginnen. Wir finden den Eintrag 1 und kombinieren die Sitzungen 1 und 2. Wir nehmen die Startzeit der Sitzung 1 (die fr\u00fchere) und die Endzeit der Sitzung 2 (die sp\u00e4tere), sodass unsere neue Sitzung um 00:00:00 beginnt und um 00:00:15 endet.<\/p>\n<p>3. Eintrag 3 wird hinzugef\u00fcgt, wir suchen nach Sitzungen zwischen 00:00:30 und 00:01:10 und finden keine. Der zweite Sitzung f\u00fcr den Schl\u00fcssel 123-345-654,FFBE wird hinzugef\u00fcgt, die um 00:00:50 beginnt und endet.<\/p>\n<p>4. Eintrag 4 wird hinzugef\u00fcgt, und wir suchen nach Sitzungen zwischen 23:59:45 und 00:00:25. Diesmal finden wir beide Sitzungen \u2014 1 und 2. Alle drei Sitzungen werden zu einer zusammengef\u00fchrt, mit einer Startzeit von 00:00:00 und einer Endzeit von 00:00:15.<\/p>\n<p>Aus dem, was in diesem Abschnitt erz\u00e4hlt wurde, sind folgende wichtige Aspekte zu merken:<\/p>\n<ul>\n<li>Sitzungen sind keine Fenster fester Gr\u00f6\u00dfe. Die Dauer einer Sitzung wird durch die Aktivit\u00e4t innerhalb eines festgelegten Zeitraums bestimmt;<\/li>\n<li>Zeitstempel in den Daten bestimmen, ob ein Ereignis in eine bestehende Sitzung oder in einen Zeitraum ohne Aktivit\u00e4t f\u00e4llt.<\/li>\n<\/ul>\n<p>\nAls N\u00e4chstes werden wir die n\u00e4chste Art von Fenstern besprechen \u2014 die \u201ewackelnden\u201c Fenster.<\/p>\n<h3>\u201eWackelnde\u201c Fenster<\/h3>\n<p>\n\u201eKippende\u201c Fenster erfassen Ereignisse, die in einen bestimmten Zeitrahmen fallen. Stellen Sie sich vor, Sie m\u00fcssen alle B\u00f6rsentransaktionen eines Unternehmens alle 20 Sekunden erfassen, damit Sie alle Ereignisse in diesem Zeitraum sammeln. Nach Ablauf des 20-Sekunden-Intervalls \u201ekippt\u201c das Fenster und wechselt zu einem neuen 20-Sekunden-Beobachtungsintervall. Abbildung 5.14 veranschaulicht diese Situation.<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/e90e560d9ddda5e2e524b7c387ad9874.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWie Sie sehen k\u00f6nnen, sind alle in den letzten 20 Sekunden eingegangenen Ereignisse im Fenster enthalten. Nach Ablauf dieses Zeitraums wird ein neues Fenster erstellt.<\/p>\n<p>In Listing 5.6 finden Sie den Code, der die Verwendung von \u201ekippenden\u201c Fenstern zur Erfassung von B\u00f6rsentransaktionen alle 20 Sekunden demonstriert (er ist in der Datei src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java zu finden).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/e055bb1b288c7d500b64372fe3fbf064.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDurch diese kleine \u00c4nderung des Methodenaufrufs TimeWindows.of kann ein \u201ekippendes\u201c Fenster verwendet werden. In diesem Beispiel gibt es keinen Aufruf der Methode until(), was bedeutet, dass das Standard-Speicherintervall von 24 Stunden verwendet wird.<\/p>\n<p>Schlie\u00dflich ist es an der Zeit, zum letzten Fenstertyp \u00fcberzugehen \u2013 den \u201espringenden\u201c Fenstern.<\/p>\n<h3>Gleitende (\u201espringende\u201c) Fenster<\/h3>\n<p>\nGleitende\/\u201espringende\u201c Fenster \u00e4hneln den \u201erollenden\u201c, jedoch mit einem kleinen Unterschied. Gleitende Fenster warten nicht auf das Ende des Zeitintervalls, bevor sie ein neues Fenster zur Verarbeitung der letzten Ereignisse erstellen. Sie starten neue Berechnungen nach einem k\u00fcrzeren Warteintervall als der Dauer des Fensters.<\/p>\n<p>Um die Unterschiede zwischen \u201erollenden\u201c und \u201espringenden\u201c Fenstern zu veranschaulichen, kehren wir zu unserem Beispiel mit der Z\u00e4hlung von B\u00f6rsentransaktionen zur\u00fcck. Unser Ziel bleibt es, die Anzahl der Transaktionen zu z\u00e4hlen, jedoch m\u00f6chten wir nicht den gesamten Zeitabschnitt abwarten, bevor wir den Z\u00e4hler aktualisieren. Stattdessen werden wir den Z\u00e4hler in k\u00fcrzeren Zeitabst\u00e4nden aktualisieren. Zum Beispiel werden wir die Anzahl der Transaktionen weiterhin alle 20 Sekunden z\u00e4hlen, aber den Z\u00e4hler alle 5 Sekunden aktualisieren, wie in Abb. 5.15 gezeigt. Dadurch haben wir drei Ergebnisfenster mit \u00fcberlappenden Daten.<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/415c8cd9f2b60d453a1a01c3bc99331f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIm Listing 5.7 finden Sie den Code zur Definition der gleitenden Fenster (dieser befindet sich in der Datei src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/ab2d1a64380d256d3fb084e16597417c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEin \"rollendes\" Fenster kann durch den Aufruf der Methode advanceBy() in ein \"springendes\" Fenster umgewandelt werden. Im gegebenen Beispiel betr\u00e4gt das Speicherintervall 15 Minuten.<\/p>\n<p>In diesem Abschnitt haben Sie gelernt, wie man die Ergebnisse der Aggregation mit Zeitfenstern einschr\u00e4nkt. Insbesondere sollten Sie sich folgende drei Punkte aus diesem Abschnitt merken:<\/p>\n<ul>\n<li>Die Gr\u00f6\u00dfe der Sitzungsfenster wird nicht durch den Zeitrahmen, sondern durch die Aktivit\u00e4t der Nutzer begrenzt.<\/li>\n<li>\"Rollende\" Fenster geben Einblick in Ereignisse innerhalb eines bestimmten Zeitraums.<\/li>\n<li>Die Dauer von \"springenden\" Fenstern ist festgelegt, aber sie werden h\u00e4ufig aktualisiert und k\u00f6nnen in allen Fenstern \u00fcberlappende Eintr\u00e4ge enthalten.<\/li>\n<\/ul>\n<p>\nAls N\u00e4chstes werden wir lernen, wie man ein KTable zur\u00fcck in einen KStream umwandelt, um eine Verbindung herzustellen.<\/p>\n<h3>5.3.3. Verbindung von KStream- und KTable-Objekten<\/h3>\n<p>\nIn Kapitel 4 haben wir die Verbindung zweier KStream-Objekte besprochen. Jetzt m\u00fcssen wir lernen, KTable und KStream zu verbinden. Dies kann aus folgendem einfachen Grund notwendig sein: KStream ist ein Strom von Eintr\u00e4gen, w\u00e4hrend KTable ein Strom von Aktualisierungen der Eintr\u00e4ge ist. Manchmal ist es jedoch notwendig, dem Strom von Eintr\u00e4gen zus\u00e4tzlichen Kontext durch Aktualisierungen aus KTable hinzuzuf\u00fcgen.<\/p>\n<p>Wir nehmen die Daten \u00fcber die Anzahl der B\u00f6rsentransaktionen und verkn\u00fcpfen sie mit den entsprechenden Branchennews. So erreichen wir dies unter Ber\u00fccksichtigung des bereits vorhandenen Codes.<\/p>\n<ol>\n<li>Das KTable-Objekt mit den Daten \u00fcber die Anzahl der B\u00f6rsentransaktionen in einen KStream umwandeln, wobei der Schl\u00fcssel durch den Schl\u00fcssel ersetzt wird, der die entsprechende Branche f\u00fcr dieses Aktienzeichen bezeichnet.<\/li>\n<li>Ein KTable-Objekt erstellen, das Daten aus dem Topic mit den B\u00f6rsennachrichten liest. Dieses neue KTable wird nach Branchen kategorisiert.<\/li>\n<li>Die Neuigkeiten aktualisieren und mit den Informationen \u00fcber die Anzahl der B\u00f6rsentransaktionen nach Branchen verkn\u00fcpfen.<\/li>\n<\/ol>\n<p>\nNun sehen wir uns an, wie wir diesen Aktionsplan umsetzen k\u00f6nnen.<\/p>\n<h3>Umwandlung von KTable in KStream<\/h3>\n<p>\nUm KTable in KStream umzuwandeln, sind folgende Schritte erforderlich.<\/p>\n<ol>\n<li>Die Methode KTable.toStream() aufrufen.<\/li>\n<li>Durch den Aufruf der Methode KStream.map den Schl\u00fcssel durch den Namen der Branche ersetzen und anschlie\u00dfend aus der Instanz des Windowed-Objekts TransactionSummary extrahieren.<\/li>\n<\/ol>\n<p>\nWir verkn\u00fcpfen diese Operationen in einer Kette folgenderma\u00dfen (der Code ist in der Datei src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java zu finden) (Listing 5.8).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/0d43c2650f6e66e2816ed383da3a29c2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDa wir die Operation KStream.map ausf\u00fchren, wird die Neupartitionierung f\u00fcr die zur\u00fcckgegebene Instanz von KStream automatisch vorgenommen, wenn sie in einer Verbindung verwendet wird.<\/p>\n<p>Wir haben den Umwandlungsprozess abgeschlossen; nun m\u00fcssen wir ein KTable-Objekt f\u00fcr das Lesen von B\u00f6rsennachrichten erstellen.<\/p>\n<h3>Erstellung eines KTable f\u00fcr B\u00f6rsennachrichten<\/h3>\n<p>\nGl\u00fccklicherweise gen\u00fcgt zur Erstellung eines KTable-Objekts eine einzige Codezeile (diesen Code finden Sie in der Datei src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (Listing 5.9).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/6e83a393fdc9ab74fda4cbdddddb5213.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEs ist erw\u00e4hnenswert, dass keine Serde-Objekte angegeben werden m\u00fcssen, da die Konfiguration String-Serde verwendet. Zudem wird durch die Verwendung der Enumeration EARLIEST die Tabelle von Anfang an mit Eintr\u00e4gen gef\u00fcllt.<\/p>\n<p>Jetzt k\u00f6nnen wir zum letzten Schritt \u00fcbergehen \u2013 der Verbindung.<\/p>\n<h3>Verbindung von Nachrichtenaktualisierungen mit Transaktionszahlen<\/h3>\n<p>\nDie Erstellung der Verbindung ist unkompliziert. Wir verwenden einen linken Join f\u00fcr den Fall, dass es in der betreffenden Branche keine B\u00f6rsennachrichten gibt (den ben\u00f6tigten Code finden Sie in der Datei src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (Listing 5.10).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/92ed70f98927d2f778ad14dbc2a5aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDieser leftJoin-Operator ist recht einfach. Im Gegensatz zu den Verkn\u00fcpfungen aus Kapitel 4 wird die Methode JoinWindow nicht verwendet, da bei der Ausf\u00fchrung der KStream-KTable-Verkn\u00fcpfung nur ein Eintrag pro Schl\u00fcssel in der KTable vorhanden ist. Diese Verkn\u00fcpfung ist nicht zeitlich begrenzt: Eintrag ist entweder in der KTable vorhanden oder nicht. Die wichtigste Erkenntnis: Mit KTable-Objekten kann der KStream mit seltener aktualisierten Referenzdaten angereichert werden.<\/p>\n<p>Jetzt betrachten wir eine effizientere Methode zur Anreicherung von Ereignissen aus dem KStream.<\/p>\n<h3>5.3.4. GlobalKTable-Objekte<\/h3>\n<p>\nWie Sie verstanden haben, besteht die Notwendigkeit, die Ereignisstr\u00f6me anzureichern oder ihnen Kontext hinzuzuf\u00fcgen. In Kapitel 4 haben Sie die Verbindung zwischen zwei KStreams gesehen, und im vorherigen Abschnitt wurde die Verbindung zwischen KStream und KTable behandelt. In all diesen F\u00e4llen ist eine Neupartitionierung des Datenstroms erforderlich, wenn die Schl\u00fcssel auf einen neuen Typ oder Wert abgebildet werden. Manchmal erfolgt die Neupartitionierung ausdr\u00fccklich, manchmal \u00fcbernimmt Kafka Streams dies automatisch. Die Neupartitionierung ist notwendig, da sich die Schl\u00fcssel ge\u00e4ndert haben und die Datens\u00e4tze in neuen Partitionen landen m\u00fcssen; andernfalls w\u00e4re eine Verbindung nicht m\u00f6glich (dies wurde in Kapitel 4 im Abschnitt \u201eNeupartitionierung von Daten\u201c unter Punkt 4.2.4 behandelt).<\/p>\n<h3>Neupartitionierung hat ihren Preis<\/h3>\n<p>\nDie erneute Partitionierung erfordert zus\u00e4tzliche Kosten \u2013 es fallen zus\u00e4tzliche Ressourcen f\u00fcr die Erstellung von Zwischenthemen an und es werden doppelte Daten in einem weiteren Thema gespeichert; dies f\u00fchrt auch zu einer erh\u00f6hten Verz\u00f6gerung aufgrund des Schreibens und Lesens aus diesem Thema. Zudem m\u00fcssen bei Bedarf Verbindungen in einer Kette organisiert werden, wenn mehr als ein Aspekt oder Ma\u00dfstab beteiligt ist, um die Datens\u00e4tze mit neuen Schl\u00fcsseln anzuzeigen und den Prozess der erneuten Partitionierung erneut durchzuf\u00fchren.<\/p>\n<h3>Verbindungen zu kleineren Datens\u00e4tzen<\/h3>\n<p>\nIn einigen F\u00e4llen ist das Volumen der Referenzdaten, mit denen eine Verbindung hergestellt werden soll, relativ klein, sodass vollst\u00e4ndige Kopien lokal auf jedem der Knoten gespeichert werden k\u00f6nnen. F\u00fcr solche Situationen bietet Kafka Streams die Klasse GlobalKTable.<\/p>\n<p>GlobalKTable-Instanzen sind einzigartig, da die Anwendung alle Daten auf jedem Knoten repliziert. Da auf jedem Knoten alle Daten vorhanden sind, ist es nicht notwendig, den Datenstrom nach dem Schl\u00fcssel der Referenzdaten zu partitionieren, damit er f\u00fcr alle Abschnitte verf\u00fcgbar ist. Mit GlobalKTable-Objekten k\u00f6nnen Sie auch schl\u00fcsselunabh\u00e4ngige Joins durchf\u00fchren. Lassen Sie uns zu einem der vorherigen Beispiele zur\u00fcckkehren, um diese M\u00f6glichkeit zu demonstrieren.<\/p>\n<h3>Einen KStream mit GlobalKTable-Objekten verbinden<\/h3>\n<p>\nIm Abschnitt 5.3.2 haben wir das fensterbasierte Aggregieren von B\u00f6rsentransaktionen nach K\u00e4ufern durchgef\u00fchrt. Die Ergebnisse dieser Aggregation sahen ungef\u00e4hr so aus:<\/p>\n<pre><code class=\"plaintext\">{customerId='074-09-3705', stockTicker='GUTM'}, 17\n{customerId='037-34-5184', stockTicker='CORK'}, 16<\/code><\/pre>\n<p>\nObwohl diese Ergebnisse den festgelegten Zielen entsprachen, w\u00e4re es praktischer, wenn auch der Name des Kunden und der vollst\u00e4ndige Name des Unternehmens ausgegeben w\u00fcrden. Um den Namen des K\u00e4ufers und den Firmennamen hinzuzuf\u00fcgen, k\u00f6nnen Standard-Joins durchgef\u00fchrt werden, aber es m\u00fcssen zwei Schl\u00fcsselzuordnungen und eine erneute Partitionierung vorgenommen werden. Mit GlobalKTable k\u00f6nnen solche Kosten vermieden werden.<\/p>\n<p>Daf\u00fcr verwenden wir das Objekt countStream aus Listing 5.11 (den entsprechenden Code finden Sie in der Datei src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java) und verbinden es mit zwei Objekten GlobalKTable.<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/fc4d91bbe062ceb94f5650224840b81e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWir haben dies bereits zuvor besprochen, daher werde ich nicht wiederholen. Ich m\u00f6chte jedoch darauf hinweisen, dass der Code in der Funktion toStream().map zur besseren Lesbarkeit in eine Funktionsobjekt abstrahiert wurde, anstelle eines eingebetteten Lambda-Ausdrucks.<\/p>\n<p>Der n\u00e4chste Schritt besteht darin, zwei Instanzen von GlobalKTable zu deklarieren (der entsprechende Code befindet sich in der Datei src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java) (Listing 5.12).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/db3918895f174c8cfb5fc927b55f87a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bitte beachten Sie, dass die Namen der Themen durch enumerierte Typen beschrieben werden.<\/p>\n<p>Nun, da wir alle Komponenten vorbereitet haben, bleibt nur noch der Code f\u00fcr die Verbindung zu schreiben (der in der Datei src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java zu finden ist) (Listing 5.13).<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/799360cc99f1920c190a61fd4685d4ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nObwohl dieser Code zwei Verbindungen aufweist, sind diese als Kette organisiert, da keiner ihrer Ergebnisse einzeln genutzt wird. Die Ergebnisse werden am Ende der gesamten Operation ausgegeben.<\/p>\n<p>Wenn Sie die oben genannte Verbindungsoperation ausf\u00fchren, erhalten Sie Ergebnisse in folgender Form:<\/p>\n<pre><code class=\"plaintext\">{customer='Barney, Smith' company=\"Exxon\", transactions= 17}<\/code><\/pre>\n<p>\nDie Essenz bleibt unver\u00e4ndert, aber diese Ergebnisse sind klarer dargestellt.<\/p>\n<p>Wenn man Kapitel 4 einbezieht, haben Sie bereits mehrere Verbindungstypen in Aktion gesehen. Diese sind in Tabelle 5.2 aufgef\u00fchrt. Diese Tabelle spiegelt die Verbindungsm\u00f6glichkeiten wider, die f\u00fcr die Version 1.0.0 von Kafka Streams relevant sind; in zuk\u00fcnftigen Versionen k\u00f6nnte sich etwas \u00e4ndern.<\/p>\n<p><img decoding=\"async\" alt=\"Das Buch \u201eKafka Streams in Action. Anwendungen und Microservices f\u00fcr die Echtzeitverarbeitung\u201c\" src=\"\/wp-content\/uploads\/8e4cf35c64a8431bda43a5e748de275f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZusammenfassend m\u00f6chte ich das Wesentliche in Erinnerung rufen: Sie k\u00f6nnen Ereignisstr\u00f6me (KStream) und Aktualisierungsstr\u00f6me (KTable) mithilfe des lokalen Zustands verbinden. Dar\u00fcber hinaus kann, wenn die Gr\u00f6\u00dfe der Referenzdaten nicht zu gro\u00df ist, das Objekt GlobalKTable verwendet werden. GlobalKTable repliziert alle Partitionen auf jedem Knoten der Kafka Streams-Anwendung, wodurch alle Daten verf\u00fcgbar sind, unabh\u00e4ngig davon, zu welcher Partition der Schl\u00fcssel geh\u00f6rt.<\/p>\n<p>Als n\u00e4chstes werden wir die Funktionalit\u00e4t von Kafka Streams sehen, mit der \u00c4nderungen des Zustands beobachtet werden k\u00f6nnen, ohne Daten aus dem Kafka-Topic zu konsumieren.<\/p>\n<h3>5.3.5. Abfragbarer Zustand<\/h3>\n<p>\nWir haben bereits mehrere Operationen mit dem Zustand durchgef\u00fchrt und die Ergebnisse immer in die Konsole ausgegeben (zu Entwicklungszwecken) oder in ein Topic geschrieben (f\u00fcr industrielle Anwendungen). Um die Ergebnisse im Topic zu speichern, verwenden wir den Kafka-Client zur Ansicht.<\/p>\n<p>Das Lesen von Daten aus diesen Topics kann als eine Form von materialisierten Sichten angesehen werden. F\u00fcr unsere Zwecke verwenden wir die Definition einer materialisierten Sicht aus der \u201eWikipedia\u201c: \u201e\u2026 ein physisches Objekt der Datenbank, das die Ergebnisse einer Abfrage enth\u00e4lt. Zum Beispiel kann es eine lokale Kopie entfernten Daten, oder eine Teilmenge von Zeilen und\/oder Spalten einer Tabelle oder von Ergebnissen einer Join-Abfrage oder eine Pivot-Tabelle, die durch Aggregation erhalten wurde, sein\u201c (https:\/\/en.wikipedia.org\/wiki\/Materialized_view).<\/p>\n<p>Kafka Streams erm\u00f6glicht auch interaktive Abfragen an den Zustandspeichern, was das direkte Lesen dieser materialisierten Ansichten erlaubt. Es ist wichtig zu beachten, dass die Abfrage an den Zustandspeicher eine \"nur-Lese\"-Operation ist. Dadurch k\u00f6nnen Sie sicher sein, dass der Zustand w\u00e4hrend der Datenverarbeitung durch die Anwendung nicht versehentlich inkonsistent wird.<\/p>\n<p>Die M\u00f6glichkeit, direkte Abfragen an Zustandspeicher durchzuf\u00fchren, ist von gro\u00dfer Bedeutung. Sie bedeutet, dass Anwendungen wie Dashboards erstellt werden k\u00f6nnen, ohne zun\u00e4chst Daten vom Kafka-Consumer abrufen zu m\u00fcssen. Dadurch wird die Effizienz der Anwendung gesteigert, da eine erneute Datenspeicherung entf\u00e4llt:<\/p>\n<ul>\n<li>aufgrund der Lokalit\u00e4t der Daten k\u00f6nnen sie schnell abgerufen werden;<\/li>\n<li>Datenverdopplungen werden ausgeschlossen, da sie nicht in ein externes Lager geschrieben werden.<\/li>\n<\/ul>\n<p>\nDas Wichtigste, was Sie sich merken sollten: Anfragen an den Zustand k\u00f6nnen direkt aus der Anwendung ausgef\u00fchrt werden. Die M\u00f6glichkeiten, die sich daraus ergeben, sind nicht zu untersch\u00e4tzen. Anstatt Daten aus Kafka zu konsumieren und Datens\u00e4tze in einer Datenbank f\u00fcr die Anwendung zu speichern, k\u00f6nnen Sie Anfragen an die Statusspeicher mit demselben Ergebnis stellen. Direkte Anfragen an Statusspeicher bedeuten weniger Code (keine Konsumenten) und weniger Software (kein Bedarf an einer Datenbanktabelle zur Speicherung der Ergebnisse).<\/p>\n<p>Wir haben in diesem Kapitel eine erhebliche Menge an Informationen behandelt, daher werden wir unsere Diskussion \u00fcber interaktive Anfragen an Statusspeicher vor\u00fcbergehend pausieren. Aber keine Sorge: In Kapitel 9 werden wir eine einfache Anwendung erstellen \u2013 ein Dashboard mit interaktiven Anfragen. Zur Demonstration der interaktiven Anfragen und deren Integration in Anwendungen wird es einige Beispiele aus diesem und dem vorherigen Kapitel verwenden.<\/p>\n<h3>Zusammenfassung<\/h3>\n<p><\/p>\n<ul>\n<li>KStream-Objekte repr\u00e4sentieren Ereignisstr\u00f6me, die mit Datenbankeinf\u00fcgungen vergleichbar sind. KTable-Objekte repr\u00e4sentieren Aktualisierungsstr\u00f6me und \u00e4hneln eher Updates in einer Datenbank. Die Gr\u00f6\u00dfe eines KTable-Objekts w\u00e4chst nicht, alte Eintr\u00e4ge werden durch neue ersetzt.<\/li>\n<li>KTable-Objekte sind f\u00fcr Aggregierungsoperationen unerl\u00e4sslich.<\/li>\n<li>Mit Fensteroperationen lassen sich aggregierte Daten in zeitliche Intervalle unterteilen.<\/li>\n<li>Dank GlobalKTable-Objekten kann auf Referenzdaten an jedem Punkt der Anwendung zugegriffen werden, unabh\u00e4ngig von der Partitionierung.<\/li>\n<li>Es sind Verbindungen zwischen KStream-, KTable- und GlobalKTable-Objekten m\u00f6glich.<\/li>\n<\/ul>\n<p>\nBisher haben wir uns auf die Erstellung von Kafka Streams-Anwendungen mit der hochgradigen DSL KStream konzentriert. Dieser Ansatz erm\u00f6glicht zwar die Entwicklung klarer und pr\u00e4gnanter Programme, bringt jedoch gewisse Kompromisse mit sich. Die Arbeit mit der DSL KStream verbesserte zwar die K\u00fcrze des Codes, reduzierte jedoch den Grad der Kontrolle. Im n\u00e4chsten Kapitel werden wir die Low-Level-API f\u00fcr Bearbeitungs-Node betrachten und andere Kompromisse erkunden. Die Programme werden l\u00e4nger sein als bisher, aber wir erhalten die M\u00f6glichkeit, nahezu jede ben\u00f6tigte Bearbeitungs-Node zu erstellen.<\/p>\n<p>\u2192 Weitere Informationen zur Buch finden Sie auf <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/best\/product\/kafka-streams-v-deystvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\">der Verlagswebsite<\/a><\/noindex><\/p>\n<p>\u2192 F\u00fcr Habr-Nutzer gibt es einen Rabatt von 25 % mit dem Gutschein \u2014 <b>Kafka Streams<\/b><\/p>\n<p>\u2192 Nach der Zahlung der gedruckten Buchversion wird das E-Book per E-Mail zugesendet.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/457756\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440\u043e\u0436\u0438\u0442\u0435\u043b\u0438! \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c Kafka \u0438 Kafka Streams. \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0437\u043d\u0430\u0442\u044c \u0438 \u0441\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Kafka, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u041e\u043f\u044b\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Kafka, \u043a\u0430\u043a \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u043e\u0441\u0432\u043e\u044f\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35786","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440\u043e\u0436\u0438\u0442\u0435\u043b\u0438! \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c Kafka \u0438 Kafka Streams. \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0437\u043d\u0430\u0442\u044c \u0438 \u0441\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Kafka, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u041e\u043f\u044b\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Kafka, \u043a\u0430\u043a \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u043e\u0441\u0432\u043e\u044f\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u043d\u0438\u0433\u0430 \u00abKafka Streams \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00bb | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440\u043e\u0436\u0438\u0442\u0435\u043b\u0438! \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c Kafka \u0438 Kafka Streams. \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0437\u043d\u0430\u0442\u044c \u0438 \u0441\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Kafka, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u041e\u043f\u044b\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Kafka, \u043a\u0430\u043a \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u043e\u0441\u0432\u043e\u044f\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:06:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:06:19+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Buch \u201eKafka Streams in Aktion. Anwendungen und Microservices f\u00fcr die Echtzeitbearbeitung\u201c | ProHoster","description":"Hallo, Habr-Nutzer! Dieses Buch ist f\u00fcr jeden Entwickler geeignet, der sich mit der Stream-Verarbeitung vertraut machen m\u00f6chte. Das Verst\u00e4ndnis von verteiltem Programmieren wird Ihnen helfen, Kafka und Kafka Streams besser zu verstehen. Es w\u00e4re vorteilhaft, auch das Kafka-Framework zu kennen, aber das ist nicht zwingend erforderlich: Ich werde Ihnen alles Notwendige erkl\u00e4ren. Sowohl erfahrene Kafka-Entwickler als auch Neulinge werden mit diesem Buch in der Lage sein, interessante Anwendungen zu erstellen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u043d\u0438\u0433\u0430 \u00abKafka Streams \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00bb | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440\u043e\u0436\u0438\u0442\u0435\u043b\u0438! \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c Kafka \u0438 Kafka Streams. \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0437\u043d\u0430\u0442\u044c \u0438 \u0441\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Kafka, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u041e\u043f\u044b\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Kafka, \u043a\u0430\u043a \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u043e\u0441\u0432\u043e\u044f\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:06:19+00:00","article:modified_time":"2019-10-31T19:06:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35786","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 00:45:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:56:32","updated":"2026-01-22 00:45:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/35786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=35786"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/35786\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=35786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=35786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=35786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}