{"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\/nl\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Niet alleen verwerking: Hoe we van Kafka Streams een gedistribueerde database hebben gemaakt, en wat daaruit voortkwam","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, Habr!<\/p>\n<p>We remind you that following the book on <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> we have released another fascinating work about the library <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=\"Niet alleen verwerking: Hoe we van Kafka Streams een gedistribueerde database hebben gemaakt, en wat daaruit voortkwam\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWhile the community is still exploring the boundaries of this powerful tool, a new article has been published that we want to introduce you to. The author shares from their own experience how to create a distributed data storage using Kafka Streams. Enjoy reading!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nThe Apache library <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> is used worldwide in enterprises for distributed stream processing over Apache Kafka. One of the underrated aspects of this framework is that it allows for the storage of local state generated based on stream processing.<\/p>\n<p>In this article, I will explain how our company successfully utilized this feature in developing a cloud application security product. Using Kafka Streams, we created microservices with shared state, each serving as a fault-tolerant and highly available source of reliable information about the state of objects in the system. This represents a step forward in both reliability and ease of maintenance for us.<\/p>\n<p>If you are interested in an alternative approach that allows for a single central database to maintain the formal state of your objects \u2013 read on, it will be interesting\u2026 <\/p>\n<p><b>Why we felt it was time to change our approaches to working with shared state <\/b><\/p>\n<p>We needed to maintain the state of various objects based on agent reports (for example: was the site under attack?). Before transitioning to Kafka Streams, we often relied on a single central database (+ service API) for state management. This approach has its drawbacks: in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">data-intensive situations<\/a><\/noindex> maintaining consistency and synchronization becomes a real challenge. The database can become a bottleneck or end up in <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">a race condition<\/a><\/noindex> and suffer from unpredictability.<\/p>\n<p><img decoding=\"async\" alt=\"Niet alleen verwerking: Hoe we van Kafka Streams een gedistribueerde database hebben gemaakt, en wat daaruit voortkwam\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 1: a typical state separation scenario encountered before switching to <br \/>\nKafka and Kafka Streams: agents communicate their representations via the API, and the updated state is calculated through the central database <\/i><\/p>\n<p><b>Meet Kafka Streams \u2013 it has now become easy to create microservices with shared state. <\/b><\/p>\n<p>Ongeveer een jaar geleden besloten we onze scenario's voor het werken met gedeelde toestand grondig te herzien om enkele problemen aan te pakken. We besloten direct Kafka Streams uit te proberen \u2013 het is immers bekend hoe schaalbaar, hoog beschikbaar en fouttolerant het is, en hoe rijk de streamingfunctionaliteit is (inclusief transformaties met behoud van toestand). Het was precies wat we nodig hadden, om nog maar te zwijgen over hoe volwassen en betrouwbaar het berichtenuitwisselingssysteem van Kafka is.<\/p>\n<p>Elk van de door ons gemaakte microservices met behouden toestand werd gebouwd op basis van een Kafka Streams-instantie met een vrij eenvoudige topologie. Deze bestond uit 1) een bron 2) een processor met een permanente opslag voor sleutels en waarden 3) een sink:<\/p>\n<p><img decoding=\"async\" alt=\"Niet alleen verwerking: Hoe we van Kafka Streams een gedistribueerde database hebben gemaakt, en wat daaruit voortkwam\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustratie 2: de standaard topologie van onze streaminginstanties voor microservices met behouden toestand. Merk op: hier is ook een opslag aanwezig, waarin metadata over planning zich bevindt. <\/i><\/p>\n<p>Met deze nieuwe benadering stellen agents berichten op die naar de oorspronkelijke topic worden gestuurd, en consumenten \u2013 laten we zeggen, de service voor e-mailmeldingen \u2013 ontvangen de berekende gedeelde toestand via de sink (de uitgangstopic).<\/p>\n<p><img decoding=\"async\" alt=\"Niet alleen verwerking: Hoe we van Kafka Streams een gedistribueerde database hebben gemaakt, en wat daaruit voortkwam\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustratie 3: een nieuw voorbeeld van een takenstroom voor een scenario met gedeelde microservices: 1) een agent genereert een bericht dat binnenkomt in de oorspronkelijke Kafka-topic; 2) de microservice met gedeelde toestand (die Kafka Streams gebruikt) verwerkt het en schrijft de berekende toestand naar de eindtopic van Kafka; waarna 3) de consumenten de nieuwe toestand ontvangen.<\/i><\/p>\n<p><b>H\u00e9, en deze ingebouwde opslag voor sleutels en waarden is echt heel nuttig!<\/b><\/p>\n<p>Zoals hierboven vermeld, bevat onze topologie met gedeelde toestand een opslag voor sleutels en waarden. We hebben verschillende toepassingsmogelijkheden gevonden, waarvan er twee hieronder worden beschreven.<\/p>\n<p><i><b>Optie #1: gebruik van de opslag voor sleutels en waarden bij berekeningen<\/b><\/i><\/p>\n<p>Onze eerste key-value store bevatte de helperdata die we nodig hadden voor berekeningen. Bijvoorbeeld, in sommige gevallen werd de gedeelde toestand bepaald op basis van het 'meerderheidsstem'-principe. In de opslag konden we alle laatste rapporten van agenten over de toestand van een bepaald object bewaren. Vervolgens, wanneer we een nieuw rapport van een bepaalde agent kregen, konden we dit opslaan, rapporten van alle andere agenten over dezelfde toestand van dat object uit de opslag ophalen en de berekening herhalen.<br \/>\nHieronder in illustratie 4 wordt weergegeven hoe we toegang verleenden tot de key-value store voor de verwerkende methode van de processor, zodat we een nieuw bericht konden verwerken.<\/p>\n<p><img decoding=\"async\" alt=\"Niet alleen verwerking: Hoe we van Kafka Streams een gedistribueerde database hebben gemaakt, en wat daaruit voortkwam\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustratie 4: toegang verlenen tot de key-value store voor de verwerkende methode van de processor (daarna moet in elk scenario dat met gedeelde toestand werkt, de methode worden ge\u00efmplementeerd) <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Optie #2: een CRUD API bovenop Kafka Streams maken<\/b><\/i><\/p>\n<p>Nadat we onze basis taakstroom hadden opgezet, gingen we proberen een RESTful CRUD API te schrijven voor onze microservices met gedeelde toestand. We wilden de mogelijkheid hebben om de toestand van bepaalde of alle objecten op te halen, evenals de toestand van een object in te stellen of te verwijderen (dit is handig voor de ondersteuning van de serverzijde).<\/p>\n<p>Voor ondersteuning van alle API Get State, telkens wanneer we de toestand opnieuw moesten berekenen tijdens de verwerking, legden we deze lange tijd vast in de ingebouwde key-value store. In dit geval wordt het vrij eenvoudig om zo'n API te implementeren met een enkele instantie van Kafka Streams, zoals in de onderstaande listing wordt weergegeven:<\/p>\n<p><img decoding=\"async\" alt=\"Niet alleen verwerking: Hoe we van Kafka Streams een gedistribueerde database hebben gemaakt, en wat daaruit voortkwam\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustratie 5: gebruik van de ingebouwde key-value store voor het verkrijgen van de vooraf berekende toestand van een object. <\/i><\/p>\n<p>Het bijwerken van de toestand van een object via de API is ook niet moeilijk te implementeren. In principe is het voldoende om een Kafka producer te cre\u00ebren en hiermee een opname te maken waarin de nieuwe toestand is opgenomen. Dit garandeert dat alle berichten die via de API worden gegenereerd, op dezelfde manier worden verwerkt als die van andere producers (bijvoorbeeld agenten).<\/p>\n<p><img decoding=\"async\" alt=\"Niet alleen verwerking: Hoe we van Kafka Streams een gedistribueerde database hebben gemaakt, en wat daaruit voortkwam\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustratie 6: de toestand van een object kan worden ingesteld met behulp van een Kafka producer. <\/i><\/p>\n<p><b>Een kleine complicatie: Kafka heeft veel partitionen.<\/b><\/p>\n<p>Vervolgens wilden we de verwerking load verdelen en de beschikbaarheid verbeteren door voor elk scenario een cluster van microservices met een gedeelde status te bieden. De configuratie ging ons als vanzelf af: nadat we alle instanties zo hadden ingesteld dat ze met dezelfde app-ID werkten (en met dezelfde opstartservers), werd vrijwel alles automatisch afgehandeld. We hebben ook vastgesteld dat elke bron-topic uit meerdere partities zou bestaan, zodat elke instantie een subset van die partities kon toegewezen krijgen.<\/p>\n<p>Ik wil ook vermelden dat het gebruikelijk is om een back-up van de statusopslag te maken, zodat in het geval van een herstel na een storing deze kopie naar een andere instantie kan worden overgebracht. Voor elke statusopslag in Kafka Streams wordt een repliceerbare topic met een wijzigingslog gemaakt (waarbij lokale updates worden bijgehouden). Zo biedt Kafka voortdurend een back-up voor de statusopslag. Daarom kan de statusopslag van een bepaalde Kafka Streams-instantie snel worden hersteld op een andere instantie, waar de bijbehorende partities naartoe gaan. Onze tests hebben aangetoond dat dit in enkele seconden kan worden gedaan, zelfs als er miljoenen records in de opslag staan.<\/p>\n<p>Bij de overgang van \u00e9\u00e9n microservice met een gedeelde status naar een cluster van microservices wordt het iets minder triviaal om de Get State API te implementeren. In deze nieuwe situatie bevat de statusopslag van elke microservice slechts een deel van het totale beeld (de objecten waarvan de sleutels op een specifieke partitie waren geprojecteerd). We moesten bepalen op welke instantie de status van het object dat we nodig hadden zich bevond, en dit deden we op basis van de metadata van de streams, zoals hieronder weergegeven:<\/p>\n<p><img decoding=\"async\" alt=\"Niet alleen verwerking: Hoe we van Kafka Streams een gedistribueerde database hebben gemaakt, en wat daaruit voortkwam\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustratie 7: met behulp van de streammetadata bepalen we van welke instantie we de status van het benodigde object moeten opvragen; een dergelijke aanpak werd toegepast met de GET ALL API.<\/i><\/p>\n<p><b>Belangrijkste bevindingen<\/b><\/p>\n<p>Statusopslag in Kafka Streams kan de facto fungeren als een gedistribueerde database, <\/p>\n<ul>\n<li>die continu wordt gerepliceerd in Kafka.<\/li>\n<li>Boven een dergelijk systeem is het eenvoudig om een CRUD API op te bouwen. <\/li>\n<li>Het verwerken van meerdere partities wordt iets ingewikkelder. <\/li>\n<li>Het is ook mogelijk om een of meerdere state stores aan de streaming topologie toe te voegen voor het opslaan van hulpparameters. Deze optie kan worden gebruikt voor:<\/li>\n<li>Langdurige opslag van gegevens die nodig zijn voor berekeningen tijdens streaming verwerking. <\/li>\n<li>Langdurige opslag van gegevens die nuttig kunnen zijn bij de volgende initialisatie van de streaming instance. <\/li>\n<li>veel andere dingen\u2026<\/li>\n<\/ul>\n<p>Dankzij deze en andere voordelen is Kafka Streams uitstekend geschikt voor het ondersteunen van globale staten in een gedistribueerd systeem zoals het onze. Kafka Streams heeft zich als zeer betrouwbaar bewezen in productie (sinds de implementatie hebben we vrijwel geen berichten verloren), en we zijn ervan overtuigd dat de mogelijkheden hiervan niet beperkt zijn!<br \/>\n<br \/>Bron: <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.3 - 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\/nl\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Niet alleen verwerking: Hoe we van Kafka Streams een gedistribueerde database maakten, en wat daaruit voortkwam | ProHoster","description":"Hallo, Habr! We herinneren jullie eraan dat we na het boek over Kafka ook een minstens even interessant werk over de bibliotheek hebben uitgebracht.","canonical_url":"https:\/\/prohoster.info\/nl\/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":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}