{"id":32632,"date":"2019-10-31T21:48:08","date_gmt":"2019-10-31T18:48:08","guid":{"rendered":"https:\/\/prohoster.info\/blog\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\/"},"modified":"2019-10-31T21:48:08","modified_gmt":"2019-10-31T18:48:08","slug":"ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus entstanden ist","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, Habr!<\/p>\n<p>Wir erinnern daran, dass wir nach dem Buch \u00fcber <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> ein ebenso interessantes Werk \u00fcber die Bibliothek <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/new\/product\/kafka-streams-v-deystvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\">Kafka Streams API<\/a><\/noindex>. <\/p>\n<p><img decoding=\"async\" alt=\"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus entstanden ist\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW\u00e4hrend die Community gerade die Grenzen der M\u00f6glichkeiten dieses leistungsstarken Werkzeugs entdeckt, ist k\u00fcrzlich ein Artikel erschienen, mit dessen \u00dcbersetzung wir Sie bekannt machen m\u00f6chten. Der Autor berichtet aus eigener Erfahrung, wie man aus Kafka Streams ein verteiltes Datenspeicher erstellen kann. Viel Spa\u00df beim Lesen!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nDie Apache-Bibliothek <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> wird weltweit in Unternehmen f\u00fcr die verteilte Echtzeitverarbeitung \u00fcber Apache Kafka eingesetzt. Einer der oft untersch\u00e4tzten Aspekte dieses Frameworks ist, dass es erm\u00f6glicht, einen lokalen Zustand zu speichern, der auf der Grundlage der Streamverarbeitung erzeugt wird.<\/p>\n<p>In diesem Artikel erkl\u00e4re ich, wie es unserem Unternehmen gelungen ist, diese Gelegenheit gewinnbringend zu nutzen, w\u00e4hrend wir ein Produkt zur Sicherheit von Cloud-Anwendungen entwickelt haben. Mithilfe von Kafka Streams haben wir Microservices mit gemeinsamem Zustand erstellt, die jeweils als fehlertolerante und hochverf\u00fcgbare Quelle zuverl\u00e4ssiger Informationen \u00fcber den Status der Objekte im System dienen. Dies ist f\u00fcr uns ein Schritt nach vorn in Bezug auf Zuverl\u00e4ssigkeit und Wartungsfreundlichkeit.<\/p>\n<p>Falls Sie an einem alternativen Ansatz interessiert sind, der es erm\u00f6glicht, eine zentrale Datenbank zur Unterst\u00fctzung des formalen Zustands Ihrer Objekte zu nutzen \u2013 lesen Sie weiter, es k\u00f6nnte interessant sein... <\/p>\n<p><b>Warum wir der Meinung waren, dass es an der Zeit ist, unsere Ans\u00e4tze zum Management des gemeinsamen Zustands zu \u00fcberdenken <\/b><\/p>\n<p>Wir mussten den Zustand verschiedener Objekte basierend auf den Berichten von Agenten aufrechterhalten (zum Beispiel: Wurde die Website angegriffen?). Vor der Umstellung auf Kafka Streams waren wir oft auf eine zentrale Datenbank (+ Service-API) angewiesen, um den Zustand zu verwalten. Dieser Ansatz hat jedoch seine Nachteile: in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">datenintensiven Situationen<\/a><\/noindex> Die Unterst\u00fctzung von Konsistenz und Synchronisierung wird zu einer echten Herausforderung. Die Datenbank kann zum Engpass werden oder sich in <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">einem Zustand der Race Conditions befinden<\/a><\/noindex> und unter Unberechenbarkeit leiden.<\/p>\n<p><img decoding=\"async\" alt=\"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus entstanden ist\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Abbildung 1: Ein typisches Szenario mit Zustandsteilung, das vor dem \u00dcbergang zu <br \/>\nKafka und Kafka Streams auftrat: Die Agenten berichten ihre Zust\u00e4nde \u00fcber eine API, und der aktualisierte Zustand wird \u00fcber eine zentrale Datenbank berechnet. <\/i><\/p>\n<p><b>Lernen Sie Kafka Streams kennen \u2013 es ist jetzt einfach, Mikroservices mit gemeinsamem Zustand zu erstellen. <\/b><\/p>\n<p>Vor etwa einem Jahr haben wir beschlossen, unsere Szenarien f\u00fcr die Arbeit mit gemeinsamem Zustand gr\u00fcndlich zu \u00fcberdenken, um diese Probleme zu l\u00f6sen. Wir haben uns sofort entschieden, Kafka Streams auszuprobieren \u2013 bekannt f\u00fcr seine Skalierbarkeit, hohe Verf\u00fcgbarkeit und Fehlertoleranz sowie seinen umfangreichen Streaming-Funktionalit\u00e4ten (einschlie\u00dflich Statusbehalten). Genau das, was wir ben\u00f6tigten, ganz zu schweigen von der Reife und Zuverl\u00e4ssigkeit des Messaging-Systems, das in Kafka entstanden ist.<\/p>\n<p>Jeder von uns erstellte zustandsbehaftete Mikroservice wurde auf der Grundlage einer Kafka Streams-Instanz mit einer relativ einfachen Topologie aufgebaut. Diese bestand aus 1) einer Quelle, 2) einem Prozessor mit persistentem Schl\u00fcssel-Wert-Speicher und 3) einem Strom:<\/p>\n<p><img decoding=\"async\" alt=\"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus entstanden ist\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Abbildung 2: Die standardm\u00e4\u00dfige Topologie unserer Streaming-Instanzen f\u00fcr zustandsbehaftete Mikroservices. Beachten Sie, dass es hier auch einen Speicher gibt, der Metadaten zur Planung enth\u00e4lt. <\/i><\/p>\n<p>Bei diesem neuen Ansatz erstellen die Agenten Nachrichten, die in das urspr\u00fcngliche Thema eingegeben werden, w\u00e4hrend die Verbraucher \u2013 beispielsweise der Benachrichtigungsdienst \u2013 den berechneten gemeinsamen Zustand \u00fcber den Strom (das Ausgangsthema) empfangen.<\/p>\n<p><img decoding=\"async\" alt=\"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus entstanden ist\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Abbildung 3: Ein neues Beispiel f\u00fcr einen Aufgabenfluss f\u00fcr ein Szenario mit gemeinsamen Mikroservices: 1) Der Agent erzeugt eine Nachricht, die in das urspr\u00fcngliche Kafka-Thema gelangt; 2) der zustandsbehaftete Mikroservice (der Kafka Streams verwendet) verarbeitet sie und schreibt den berechneten Zustand in das endg\u00fcltige Kafka-Thema; danach 3) empfangen die Verbraucher den neuen Zustand.<\/i><\/p>\n<p><b>Hey, und dieser eingebaute Schl\u00fcssel-Wert-Speicher ist tats\u00e4chlich sehr n\u00fctzlich!<\/b><\/p>\n<p>Wie bereits erw\u00e4hnt, enth\u00e4lt unsere Topologie mit gemeinsamem Zustand einen Schl\u00fcssel-Wert-Speicher. Wir haben mehrere Verwendungsm\u00f6glichkeiten gefunden, von denen zwei im Folgenden beschrieben werden.<\/p>\n<p><i><b>Option #1: Verwendung des Schl\u00fcssel-Wert-Speichers bei Berechnungen<\/b><\/i><\/p>\n<p>Unser erster Schl\u00fcssel-Wert-Speicher enthielt Hilfsdaten, die wir f\u00fcr Berechnungen ben\u00f6tigten. Zum Beispiel wurde in einigen F\u00e4llen der gemeinsame Zustand nach dem Prinzip \u201eMehrheitsentscheid\u201c bestimmt. Im Speicher konnten alle neuesten Berichte der Agenten \u00fcber den Zustand eines bestimmten Objekts aufbewahrt werden. Wenn wir dann einen neuen Bericht von einem Agenten erhielten, konnten wir ihn speichern, die Berichte aller anderen Agenten \u00fcber den Zustand desselben Objekts aus dem Speicher abrufen und die Berechnung wiederholen.<br \/>\nIn Abbildung 4 unten ist zu sehen, wie wir den Zugriff auf den Schl\u00fcssel-Wert-Speicher f\u00fcr die verarbeitende Methode des Prozessors er\u00f6ffneten, sodass eine neue Nachricht anschlie\u00dfend verarbeitet werden konnte.<\/p>\n<p><img decoding=\"async\" alt=\"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus entstanden ist\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Abbildung 4: Zugriff auf den Schl\u00fcssel-Wert-Speicher f\u00fcr die verarbeitende Methode des Prozessors gew\u00e4hren (danach muss in jedem Szenario, das mit gemeinsam genutztem Zustand arbeitet, die Methode implementiert werden) <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Option #2: Erstellung eines CRUD-API \u00fcber Kafka Streams<\/b><\/i><\/p>\n<p>Nachdem wir unseren grundlegenden Aufgabenstrom eingerichtet hatten, versuchten wir, ein RESTful CRUD-API f\u00fcr unsere Mikrodienste mit gemeinsam genutztem Zustand zu schreiben. Wir wollten in der Lage sein, den Zustand bestimmter oder aller Objekte abzurufen sowie den Zustand eines Objekts festzulegen oder zu entfernen (dies ist n\u00fctzlich f\u00fcr die Unterst\u00fctzung der Server-Seite).<\/p>\n<p>Um alle API Get State zu unterst\u00fctzen, lagerten wir den Zustand jedes Mal, wenn wir ihn bei der Verarbeitung neu berechnen mussten, f\u00fcr l\u00e4ngere Zeit im eingebetteten Schl\u00fcssel-Wert-Speicher. In diesem Fall wird es recht einfach, ein solches API mit einer einzigen Instanz von Kafka Streams zu implementieren, wie im unten stehenden Listing gezeigt:<\/p>\n<p><img decoding=\"async\" alt=\"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus entstanden ist\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Abbildung 5: Nutzung des eingebetteten Schl\u00fcssel-Wert-Speichers zur Abfrage des vorab berechneten Objektzustands <\/i><\/p>\n<p>Die Aktualisierung des Objektstatus \u00fcber die API l\u00e4sst sich ebenfalls unkompliziert umsetzen. Im Grunde genommen muss daf\u00fcr lediglich ein Kafka-Producer erstellt werden, der dann eine Aufzeichnung vornimmt, die den neuen Status enth\u00e4lt. Auf diese Weise wird sichergestellt, dass alle \u00fcber die API generierten Nachrichten genau wie die von anderen Produzenten (z.B. Agents) verarbeitet werden.<\/p>\n<p><img decoding=\"async\" alt=\"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus entstanden ist\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Abbildung 6: Den Objektstatus k\u00f6nnen Sie mithilfe eines Kafka-Producers festlegen. <\/i><\/p>\n<p><b>Eine kleine Komplikation: Kafka hat zahlreiche Partitionen.<\/b><\/p>\n<p>Im weiteren Verlauf hatten wir das Ziel, die mit der Verarbeitung verbundene Last zu verteilen und die Verf\u00fcgbarkeit zu verbessern, indem wir f\u00fcr jedes Szenario ein Cluster von Mikrodiensten mit gemeinsamem Status bereitstellen. Die Einrichtung war erstaunlich einfach: Nachdem wir alle Instanzen konfiguriert hatten, sodass sie mit derselben Anwendungs-ID (und denselben Boot-Servern) arbeiteten, geschah fast alles automatisch. Wir hatten zudem festgelegt, dass jedes urspr\u00fcngliche Thema aus mehreren Partitionen bestehen wird, damit jeder Instanz eine Teilmenge dieser Partitionen zugewiesen werden kann.<\/p>\n<p>Ich m\u00f6chte auch erw\u00e4hnen, dass es hier \u00fcblich ist, ein Zustandsspeicher-Backup zu erstellen, um beispielsweise im Falle einer Wiederherstellung nach einem Ausfall diese Kopie auf eine andere Instanz zu \u00fcbertragen. F\u00fcr jeden Zustandsspeicher in Kafka Streams wird ein replizierbares Topic mit einem \u00c4nderungsprotokoll erstellt (in dem lokale Updates verfolgt werden). Dadurch sichert Kafka kontinuierlich den Zustandsspeicher ab. Daher kann im Falle eines Ausfalls einer bestimmten Kafka Streams-Instanz der Zustandsspeicher schnell auf eine andere Instanz wiederhergestellt werden, wo die entsprechenden Partitionen \u00fcbertragen werden. Unsere Tests haben gezeigt, dass dies innerhalb von Sekunden erfolgt, selbst wenn Millionen von Eintr\u00e4gen im Zustandsspeicher vorhanden sind.<\/p>\n<p>Der \u00dcbergang von einem Mikroservice mit gemeinsamem Zustand zu einem Cluster von Mikroservices macht die Implementierung der Get State API nicht trivial. In der neuen Situation enth\u00e4lt der Zustandsspeicher jedes Mikroservices nur einen Teil des Gesamtbildes (n\u00e4mlich die Objekte, deren Schl\u00fcssel einer bestimmten Partition zugeordnet waren). Wir mussten feststellen, auf welchem Instanz der Zustand des ben\u00f6tigten Objekts gespeichert war, und das geschah anhand der Metadaten der Streams, wie unten gezeigt:<\/p>\n<p><img decoding=\"async\" alt=\"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus entstanden ist\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Abbildung 7: Mithilfe von Metadaten der Streams bestimmen wir, von welcher Instanz wir den Zustand des ben\u00f6tigten Objekts abfragen; ein \u00e4hnlicher Ansatz wurde auch beim GET ALL API angewendet.<\/i><\/p>\n<p><b>Wesentliche Erkenntnisse<\/b><\/p>\n<p>Zustandsspeicher in Kafka Streams k\u00f6nnen de facto als verteilte Datenbank fungieren, <\/p>\n<ul>\n<li>die kontinuierlich in Kafka repliziert wird.<\/li>\n<li>Auf ein solches System l\u00e4sst sich leicht ein CRUD API aufbauen. <\/li>\n<li>Die Verarbeitung mehrerer Partitionen gestaltet sich etwas komplexer. <\/li>\n<li>Es ist auch m\u00f6glich, ein oder mehrere Zustandsspeicher in die Stream-Topologie aufzunehmen, um Hilfsdaten zu speichern. Diese Option kann verwendet werden f\u00fcr:<\/li>\n<li>Langfristige Speicherung von Daten, die f\u00fcr Berechnungen w\u00e4hrend der Streamverarbeitung ben\u00f6tigt werden. <\/li>\n<li>Langfristige Datenspeicherung, die bei der n\u00e4chsten Initiierung einer Stream-Instanz von Nutzen sein kann. <\/li>\n<li>und vieles mehr \u2026<\/li>\n<\/ul>\n<p>Dank dieser und weiterer Vorteile eignet sich Kafka Streams hervorragend zur Unterst\u00fctzung des globalen Zustands in einem verteilten System wie unserem. Kafka Streams hat sich in der Produktion als sehr zuverl\u00e4ssig erwiesen (seit der Bereitstellung haben wir praktisch keine Nachrichten verloren), und wir sind uns sicher, dass sich ihre M\u00f6glichkeiten nicht darauf beschr\u00e4nken!<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/449928\/\">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! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Kafka Streams API. \u041f\u043e\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0422\u0430\u043a, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u044b\u0448\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0430\u0441 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c. \u041d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f! [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24423,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32632","post","type-post","status-publish","format-standard","has-post-thumbnail","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! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Kafka Streams API. \u041f\u043e\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0422\u0430\u043a, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u044b\u0448\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0430\u0441 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c. \u041d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f!\" \/>\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\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\" \/>\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\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u041a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Kafka Streams API. \u041f\u043e\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0422\u0430\u043a, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u044b\u0448\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0430\u0441 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c. \u041d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\" \/>\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-31T18:48:08+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:48:08+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\udd47Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank erschufen und was daraus wurde | ProHoster","description":"Hallo, Habr! Wir erinnern daran, dass wir nach dem Buch \u00fcber Kafka auch ein ebenso interessantes Werk \u00fcber die Kafka Streams API ver\u00f6ffentlicht haben. Die Community befindet sich noch im Prozess, die Grenzen dieses leistungsstarken Werkzeugs auszutesten. K\u00fcrzlich wurde ein Artikel ver\u00f6ffentlicht, mit dessen \u00dcbersetzung wir Sie vertraut machen m\u00f6chten. Aus eigener Erfahrung berichtet der Autor, wie man mit Kafka Streams ein verteiltes Datenspeicher schafft. Viel Spa\u00df beim Lesen!","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","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\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u041a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Kafka Streams API. \u041f\u043e\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0422\u0430\u043a, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u044b\u0448\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0430\u0441 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c. \u041d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f!","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","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-31T18:48:08+00:00","article:modified_time":"2019-10-31T18:48:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32632","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-21 11:51:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:55:24","updated":"2026-01-21 11:51:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32632","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=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}