{"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 geworden ist","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, Habra!<\/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 geworden ist\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas Community erkundet erst die Grenzen der M\u00f6glichkeiten dieses leistungsstarken Instruments. K\u00fcrzlich erschien ein Artikel, mit dessen \u00dcbersetzung wir Sie bekannt machen m\u00f6chten. Der Autor berichtet aus eigener Erfahrung, wie man mit Kafka Streams ein verteiltes Datenspeicher erstellt. 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 Stream-Verarbeitung \u00fcber Apache Kafka eingesetzt. Ein oft untersch\u00e4tzter Aspekt dieses Frameworks ist, dass es erm\u00f6glicht, einen lokalen Zustand zu speichern, der auf der Stream-Verarbeitung basiert.<\/p>\n<p>In diesem Artikel erkl\u00e4re ich, wie es uns in unserem Unternehmen gelungen ist, diese Funktion gewinnbringend bei der Entwicklung eines Produkts zur Sicherheit von Cloud-Anwendungen zu nutzen. Mit Kafka Streams haben wir Mikrodienste mit gemeinsamem Zustand erstellt, die uns als ausfallsichere und hochverf\u00fcgbare Informationsquelle \u00fcber den Zustand der Objekte im System dienen. Dies ist ein Fortschritt in Bezug auf Zuverl\u00e4ssigkeit und Wartungsfreundlichkeit.<\/p>\n<p>Wenn Sie an einem alternativen Ansatz interessiert sind, der es erm\u00f6glicht, eine zentrale Datenbank zur Unterst\u00fctzung des formalen Zustands Ihrer Objekte zu verwenden \u2013 lesen Sie weiter, das wird interessant... <\/p>\n<p><b>Warum wir der Meinung sind, dass es an der Zeit war, unsere Ans\u00e4tze zum Umgang mit gemeinsamem Zustand zu \u00e4ndern <\/b><\/p>\n<p>Wir mussten den Zustand verschiedener Objekte im Hinblick auf Agentenberichte aufrechterhalten (z.B.: Wurde die Website angegriffen?). Vor dem Wechsel zu Kafka Streams waren wir oft auf eine zentrale Datenbank (+ Service API) zur Verwaltung des Zustands angewiesen. Dieser Ansatz hat seine Nachteile: In <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">datenintensiven Situationen<\/a><\/noindex> wird die Aufrechterhaltung von Konsistenz und Synchronisation zur echten Herausforderung. Die Datenbank kann zum Engpass werden oder sich in <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">Wettbewerbszust\u00e4nden<\/a><\/noindex> befinden und unter Unvorhersehbarkeiten leiden.<\/p>\n<p><img decoding=\"async\" alt=\"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus geworden 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 Wechsel zu <br \/>\nKafka und Kafka Streams vorkam: Agenten berichten ihre Ansichten \u00fcber die API, der aktualisierte Zustand wird \u00fcber eine zentrale Datenbank berechnet. <\/i><\/p>\n<p><b>Lernen Sie Kafka Streams kennen \u2013 es ist jetzt einfach, Mikrodienste mit gemeinsamem Zustand zu erstellen. <\/b><\/p>\n<p>Vor etwa einem Jahr haben wir beschlossen, unsere Arbeitsabl\u00e4ufe mit gemeinsamem Zustand gr\u00fcndlich zu \u00fcberarbeiten, um einige Probleme zu l\u00f6sen. Sofort haben wir Kafka Streams ausprobiert \u2013 bekannt daf\u00fcr, wie skalierbar, hochverf\u00fcgbar und fehlertolerant sie ist, und welchen reichen Streaming-Funktionsumfang sie bietet (unter anderem auch Berechnungen mit Zustandsbewahrung). Genau das, was wir ben\u00f6tigten, ganz zu schweigen von der Reife und Zuverl\u00e4ssigkeit des Nachrichtenaustauschs, die sich in Kafka entwickelt hat.<\/p>\n<p>Jeder unserer entwickelten Microservices zur Zustandsbewahrung basierte auf einer Instanz von Kafka Streams mit einer recht einfachen Topologie. Diese bestand aus 1) einer Quelle 2) einem Prozessor mit persistentem Key-Value-Speicher 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 geworden 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 Stream-Instanzen f\u00fcr die Microservices mit Zustandsbewahrung. Beachten Sie, dass es hier auch einen Speicher gibt, der Metadaten zur Planung enth\u00e4lt. <\/i><\/p>\n<p>Mit diesem neuen Ansatz erstellen Agenten Nachrichten, die in das urspr\u00fcngliche Thema eingespeist werden, w\u00e4hrend Verbraucher \u2013 sagen wir, der Dienst f\u00fcr E-Mail-Benachrichtigungen \u2013 den berechneten gemeinsamen Zustand \u00fcber den Strom (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 geworden 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 Aufgabestrom f\u00fcr das Szenario mit gemeinsamen Microservices: 1) der Agent erzeugt eine Nachricht, die in das urspr\u00fcngliche Kafka-Thema gelangt; 2) der Microservice mit gemeinsamem Zustand (der Kafka Streams verwendet) verarbeitet sie und schreibt den berechneten Zustand in das Endthema von Kafka; anschlie\u00dfend 3) empfangen die Verbraucher den neuen Zustand.<\/i><\/p>\n<p><b>Hey, und dieser eingebaute Key-Value-Speicher ist wirklich sehr n\u00fctzlich!<\/b><\/p>\n<p>Wie oben erw\u00e4hnt, enth\u00e4lt unsere Topologie mit gemeinsamem Zustand einen Key-Value-Speicher. Wir haben mehrere Verwendungsm\u00f6glichkeiten gefunden, und zwei davon sind unten beschrieben.<\/p>\n<p><i><b>Option #1: Verwendung des Key-Value-Speichers bei Berechnungen<\/b><\/i><\/p>\n<p>Unser erstes Schl\u00fcssel-Wert-Speicher enthielt Hilfsdaten, die wir f\u00fcr unsere Berechnungen ben\u00f6tigten. Beispielsweise wurde in einigen F\u00e4llen der geteilte Zustand nach dem Prinzip der \"Mehrheit der Stimmen\" bestimmt. Im Speicher konnten wir alle letzten Berichte der Agenten \u00fcber den Zustand eines bestimmten Objekts aufbewahren. Anschlie\u00dfend konnten wir, nachdem wir einen neuen Bericht von einem der Agenten erhalten hatten, diesen speichern, die Berichte aller anderen Agenten \u00fcber den Zustand desselben Objekts aus dem Speicher abrufen und die Berechnung wiederholen.<br \/>\nIn der Abbildung 4 unten wird gezeigt, wie wir den Zugriff auf den Schl\u00fcssel-Wert-Speicher f\u00fcr die verarbeitende Methode des Prozessors ge\u00f6ffnet haben, sodass anschlie\u00dfend eine neue Nachricht 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 geworden 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 \u00f6ffnen (nachdem in jedem Szenario, das mit dem geteilten Zustand arbeitet, die Methode implementiert werden musste. <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Variante #2: Erstellen einer CRUD-API \u00fcber Kafka Streams<\/b><\/i><\/p>\n<p>Nachdem wir unseren grundlegenden Aufgabenstrom eingerichtet hatten, fingen wir an, eine RESTful CRUD-API f\u00fcr unsere Mikrodienste mit geteiltem Zustand zu schreiben. Wir wollten es erm\u00f6glichen, den Zustand einiger oder aller Objekte abzurufen sowie den Zustand eines Objekts festzulegen oder zu l\u00f6schen (dies ist n\u00fctzlich f\u00fcr die Unterst\u00fctzung der Backend-Seite).<\/p>\n<p>Um alle API Get State zu unterst\u00fctzen, haben wir jedes Mal, wenn wir den Zustand bei der Verarbeitung neu berechnen mussten, diesen langfristig im integrierten Schl\u00fcssel-Wert-Speicher abgelegt. In diesem Fall ist es ausreichend, eine solche API mit einer einzelnen Instanz von Kafka Streams zu implementieren, wie im folgenden 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 geworden ist\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Abbildung 5: Verwendung des integrierten Schl\u00fcssel-Wert-Speichers zur Abfrage des vorcomputierten Zustands eines Objekts <\/i><\/p>\n<p>Die Aktualisierung des Zustands eines Objekts \u00fcber die API ist ebenfalls nicht schwer zu realisieren. Prinzipiell muss man daf\u00fcr nur einen Kafka-Producer erstellen und damit einen Eintrag vornehmen, der den neuen Zustand enth\u00e4lt. So wird sichergestellt, dass alle \u00fcber die API generierten Nachrichten genau so verarbeitet werden, wie die von anderen Produzenten (z. B. Agenten) eintreffenden Nachrichten.<\/p>\n<p><img decoding=\"async\" alt=\"Nicht nur Verarbeitung: Wie wir aus Kafka Streams eine verteilte Datenbank gemacht haben und was daraus geworden ist\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Abbildung 6: Den Zustand eines Objekts kann man mit einem Kafka-Producer festlegen <\/i><\/p>\n<p><b>Eine kleine Komplikation: Kafka hat viele Partitionen<\/b><\/p>\n<p>Anschlie\u00dfend wollten wir die mit der Verarbeitung verbundene Last verteilen und die Verf\u00fcgbarkeit verbessern, indem wir f\u00fcr jedes Szenario einen Cluster von Mikrodiensten mit gemeinsamem Zustand bereitstellen. Die Einrichtung fiel uns leicht: nachdem wir alle Instanzen konfiguriert hatten, damit sie mit derselben Anwendungs-ID (und denselben Bootservern) arbeiten, geschah praktisch alles andere automatisch. Wir haben auch festgelegt, dass jedes Ausgangsthema aus mehreren Partitionen bestehen sollte, sodass jeder Instanz ein Teilmenge dieser Partitionen zugewiesen werden konnte.<\/p>\n<p>Ich m\u00f6chte auch erw\u00e4hnen, dass es hier \u00fcblich ist, ein Backup des Zustandspeichers zu erstellen, um beispielsweise im Falle einer Wiederherstellung nach einem Ausfall dieses Backup auf eine andere Instanz zu \u00fcbertragen. F\u00fcr jeden Zustandsspeicher in Kafka Streams wird ein replizierbares Thema mit einem \u00c4nderungsprotokoll erstellt (in dem lokale Aktualisierungen verfolgt werden). Auf diese Weise sch\u00fctzt Kafka st\u00e4ndig den Zustandsspeicher. Daher kann der Zustandsspeicher von Kafka Streams im Falle eines Ausfalls einer bestimmten Instanz schnell auf einer anderen Instanz wiederhergestellt werden, wo die entsprechenden Partitionen hin\u00fcbergehen. Unsere Tests haben gezeigt, dass dies in wenigen Sekunden geschieht, selbst wenn Millionen von Datens\u00e4tzen im Speicher sind.<\/p>\n<p>Der \u00dcbergang von einem Mikrodienst mit gemeinsamem Zustand zu einem Cluster von Mikrodiensten gestaltet sich nicht so trivial, wenn es darum geht, die Get State API zu implementieren. In der neuen Situation enth\u00e4lt der Zustandsspeicher jedes Mikrodienstes nur einen Teil des Gesamtbildes (die Objekte, deren Schl\u00fcssel auf eine bestimmte Partition abgebildet sind). Wir mussten bestimmen, auf welcher Instanz sich der Zustand des ben\u00f6tigten Objekts befand, und dies geschah anhand der Metadatenstr\u00f6me, 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 geworden ist\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Abbildung 7: Mithilfe von Metadatenstr\u00f6men bestimmen wir, von welcher Instanz wir den Zustand des ben\u00f6tigten Objekts anfordern; ein solcher Ansatz wurde mit der GET ALL API angewendet.<\/i><\/p>\n<p><b>Wichtigste Ergebnisse<\/b><\/p>\n<p>Zustandsspeicher in Kafka Streams k\u00f6nnen de facto als verteilte Datenbank dienen, <\/p>\n<ul>\n<li>die st\u00e4ndig in Kafka repliziert wird.<\/li>\n<li>Auf solch einem System l\u00e4sst sich leicht eine CRUD API aufbauen. <\/li>\n<li>Die Verarbeitung mehrerer Partitionen gestaltet sich etwas komplexer. <\/li>\n<li>Es ist auch m\u00f6glich, einen oder mehrere Statusspeicher in die Streaming-Topologie hinzuzuf\u00fcgen, um Hilfsdaten zu speichern. Diese Option kann verwendet werden f\u00fcr:<\/li>\n<li>Langfristige Speicherung von Daten, die f\u00fcr Berechnungen bei der Stream-Verarbeitung erforderlich sind <\/li>\n<li>Langfristige Speicherung von Daten, die bei der n\u00e4chsten Initialisierung der Streaming-Instanz n\u00fctzlich sein k\u00f6nnten <\/li>\n<li>vieles mehr\u2026<\/li>\n<\/ul>\n<p>Dank dieser und anderer Vorteile eignet sich Kafka Streams hervorragend zur Unterst\u00fctzung des globalen Status in einem verteilten System wie dem unseren. Kafka Streams hat sich in der Produktion als \u00e4u\u00dferst zuverl\u00e4ssig erwiesen (seit ihrer Bereitstellung haben wir praktisch keine Nachrichten verloren), und wir sind zuversichtlich, dass dies nicht die einzigen M\u00f6glichkeiten sind!<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 5.0.1.1 - 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\" \/>\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) 5.0.1.1\" \/>\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\" \/>\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 gemacht haben und was dabei herausgekommen ist | ProHoster","description":"Hallo, Habr! Wir erinnern daran, dass wir nach dem Buch \u00fcber Kafka auch ein nicht weniger interessantes Werk \u00fcber die Bibliothek ver\u00f6ffentlicht haben","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","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}