{"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\/pl\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Nie tylko przetwarzanie: Jak zrobili\u015bmy z Kafka Streams rozproszon\u0105 baz\u0119 danych i co z tego wynik\u0142o","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107, Habr!<\/p>\n<p>Przypominamy, \u017ce po ksi\u0105\u017cce o <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> opublikowali\u015bmy nie mniej interesuj\u0105c\u0105 prac\u0119 o bibliotece <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=\"Nie tylko przetwarzanie: Jak zrobili\u015bmy z Kafka Streams rozproszon\u0105 baz\u0119 danych i co z tego wynik\u0142o\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa razie spo\u0142eczno\u015b\u0107 dopiero odkrywa granice mo\u017cliwo\u015bci tego pot\u0119\u017cnego narz\u0119dzia. Niedawno ukaza\u0142 si\u0119 artyku\u0142, z t\u0142umaczeniem kt\u00f3rego chcemy Pa\u0144stwa zapozna\u0107. Autor opisuje na swoim do\u015bwiadczeniu, jak stworzy\u0107 z Kafka Streams rozproszone magazyn danych. Mi\u0142ej lektury!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nBiblioteka Apache <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> jest u\u017cywana na ca\u0142ym \u015bwiecie w przedsi\u0119biorstwach do rozproszonego przetwarzania strumieniowego na bazie Apache Kafka. Jednym z niedocenianych aspekt\u00f3w tego frameworka jest to, \u017ce pozwala na utrzymywanie lokalnego stanu, generowanego na podstawie przetwarzania strumieniowego.<\/p>\n<p>W tym artykule opowiem, jak w naszej firmie uda\u0142o si\u0119 efektywnie wykorzysta\u0107 t\u0119 mo\u017cliwo\u015b\u0107 przy opracowywaniu produktu dotycz\u0105cego bezpiecze\u0144stwa aplikacji w chmurze. Przy pomocy Kafka Streams stworzyli\u015bmy mikroserwisy z dzielonym stanem, z kt\u00f3rych ka\u017cdy jest dla nas odporno\u015bci\u0105 na awarie oraz wysoko dost\u0119pnym \u017ar\u00f3d\u0142em wiarygodnych informacji o stanie obiekt\u00f3w w systemie. To krok naprz\u00f3d zar\u00f3wno pod wzgl\u0119dem niezawodno\u015bci, jak i wygody wsparcia.<\/p>\n<p>Je\u015bli interesuje Pa\u0144stwa alternatywne podej\u015bcie, kt\u00f3re umo\u017cliwia wykorzystanie jednego centralnego bazy danych do wsparcia formalnego stanu Pa\u0144stwa obiekt\u00f3w \u2013 przeczytajcie, warto\u2026 <\/p>\n<p><b>Dlaczego uznali\u015bmy, \u017ce nadszed\u0142 czas na zmian\u0119 naszych podej\u015b\u0107 do pracy z dzielonym stanem <\/b><\/p>\n<p>Musieli\u015bmy utrzymywa\u0107 stan r\u00f3\u017cnych obiekt\u00f3w, opieraj\u0105c si\u0119 na raportach agent\u00f3w (np. czy strona by\u0142a atakowana?). Przed przej\u015bciem na Kafka Streams cz\u0119sto polegali\u015bmy na zarz\u0105dzaniu stanem za pomoc\u0105 jednej centralnej bazy danych (+ API us\u0142ugowe). Takie podej\u015bcie ma swoje wady: w <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">sytuacjach intensywnych danych<\/a><\/noindex> utrzymanie sp\u00f3jno\u015bci i synchronizacji staje si\u0119 prawdziwym wyzwaniem. Baza danych mo\u017ce sta\u0107 si\u0119 w\u0105skim gard\u0142em lub znajdowa\u0107 si\u0119 w <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">stanie wy\u015bcigu<\/a><\/noindex> i cierpie\u0107 z powodu nieprzewidywalno\u015bci.<\/p>\n<p><img decoding=\"async\" alt=\"Nie tylko przetwarzanie: Jak zrobili\u015bmy z Kafka Streams rozproszon\u0105 baz\u0119 danych i co z tego wynik\u0142o\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustracja 1: typowy scenariusz z podzia\u0142em stanu, kt\u00f3re wyst\u0119powa\u0142y przed przej\u015bciem na <br \/>\nKafka i Kafka Streams: agenci przekazuj\u0105 swoje reprezentacje przez API, zaktualizowany stan jest obliczany za pomoc\u0105 centralnej bazy danych. <\/i><\/p>\n<p><b>Poznajcie Kafka Streams \u2013 tworzenie mikroserwis\u00f3w z dzielonym stanem sta\u0142o si\u0119 proste. <\/b><\/p>\n<p>Oko\u0142o rok temu postanowili\u015bmy dok\u0142adnie przeanalizowa\u0107 nasze scenariusze pracy z dzielonym stanem, aby rozwi\u0105za\u0107 pewne problemy. Od razu postanowili\u015bmy wypr\u00f3bowa\u0107 Kafka Streams \u2013 wiadomo, jak bardzo jest skalowalna, wysoko dost\u0119pna i odporna na b\u0142\u0119dy oraz jak bogate ma funkcjonalno\u015bci strumieniowe (przekszta\u0142cenia, w tym z zachowaniem stanu). Dok\u0142adnie to, czego potrzebowali\u015bmy, nie wspominaj\u0105c o tym, jak dojrza\u0142ym i niezawodnym systemem wymiany wiadomo\u015bci jest Kafka.<\/p>\n<p>Ka\u017cdy z naszych stworzonych mikroserwis\u00f3w z zachowaniem stanu oparty by\u0142 na instancji Kafka Streams z do\u015b\u0107 prost\u0105 topologi\u0105. Sk\u0142ada\u0142a si\u0119 ona z 1) \u017ar\u00f3d\u0142a 2) procesora z trwa\u0142ym magazynem kluczy i warto\u015bci 3) odcinka:<\/p>\n<p><img decoding=\"async\" alt=\"Nie tylko przetwarzanie: Jak zrobili\u015bmy z Kafka Streams rozproszon\u0105 baz\u0119 danych i co z tego wynik\u0142o\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustracja 2: domy\u015blna topologia naszych instancji strumieniowych dla mikroserwis\u00f3w z zachowaniem stanu. Zauwa\u017c, \u017ce znajduje si\u0119 tutaj tak\u017ce magazyn, w kt\u00f3rym przetrzymywane s\u0105 metadane dotycz\u0105ce harmonogramowania. <\/i><\/p>\n<p>W tym nowym podej\u015bciu agenci tworz\u0105 wiadomo\u015bci wprowadzane do pocz\u0105tkowego tematu, a konsumenci \u2013 na przyk\u0142ad, us\u0142uga powiadomie\u0144 e-mail \u2013 odbieraj\u0105 obliczony dzielony stan przez odcinek (temat wyj\u015bciowy).<\/p>\n<p><img decoding=\"async\" alt=\"Nie tylko przetwarzanie: Jak zrobili\u015bmy z Kafka Streams rozproszon\u0105 baz\u0119 danych i co z tego wynik\u0142o\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustracja 3: nowy przyk\u0142ad strumienia zada\u0144 dla scenariusza z dzielonymi mikroserwisami: 1) agent generuje wiadomo\u015b\u0107, kt\u00f3ra trafia do pocz\u0105tkowego tematu Kafka; 2) mikroserwis z dzielonym stanem (u\u017cywaj\u0105cy Kafka Streams) przetwarza j\u0105 i zapisuje obliczony stan w ko\u0144cowym temacie Kafka; po czym 3) konsumenci odbieraj\u0105 nowy stan.<\/i><\/p>\n<p><b>Hej, a to wbudowane magazyn kluczy i warto\u015bci jest naprawd\u0119 bardzo przydatne!<\/b><\/p>\n<p>Jak wspomniano wcze\u015bniej, nasza topologia z dzielonym stanem zawiera magazyn kluczy i warto\u015bci. Znale\u017ali\u015bmy kilka sposob\u00f3w jego wykorzystania, z kt\u00f3rych dwa opisane s\u0105 poni\u017cej.<\/p>\n<p><i><b>Opcja #1: wykorzystanie magazynu kluczy i warto\u015bci w obliczeniach.<\/b><\/i><\/p>\n<p>Nasze pierwsze magazyn kluczy i warto\u015bci zawiera\u0142 dane pomocnicze potrzebne do naszych oblicze\u0144. Na przyk\u0142ad, w niekt\u00f3rych przypadkach wsp\u00f3\u0142dzielony stan by\u0142 okre\u015blany na zasadzie \u201ewi\u0119kszo\u015bci g\u0142os\u00f3w\u201d. W magazynie mo\u017cna by\u0142o przechowywa\u0107 wszystkie ostatnie raporty agent\u00f3w dotycz\u0105ce stanu pewnego obiektu. Nast\u0119pnie, otrzymuj\u0105c nowy raport od danego agenta, mogli\u015bmy go zapisa\u0107, wydoby\u0107 z magazynu raporty wszystkich innych agent\u00f3w dotycz\u0105ce tego samego obiektu i powt\u00f3rzy\u0107 obliczenia.<br \/>\nNa poni\u017cszej ilustracji 4 pokazano, jak otwierali\u015bmy dost\u0119p do magazynu kluczy i warto\u015bci metodzie przetwarzaj\u0105cej procesora, dzi\u0119ki czemu mo\u017cna by\u0142o przetworzy\u0107 now\u0105 wiadomo\u015b\u0107.<\/p>\n<p><img decoding=\"async\" alt=\"Nie tylko przetwarzanie: Jak zrobili\u015bmy z Kafka Streams rozproszon\u0105 baz\u0119 danych i co z tego wynik\u0142o\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustracja 4: otwieramy dost\u0119p do magazynu kluczy i warto\u015bci dla przetwarzaj\u0105cej metody procesora (po tym ka\u017cdy scenariusz operuj\u0105cy na wsp\u00f3\u0142dzielonym stanie musi zaimplementowa\u0107 metod\u0119 <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Opcja #2: tworzenie API CRUD na bazie Kafka Streams<\/b><\/i><\/p>\n<p>Po ustabilizowaniu naszego podstawowego strumienia zada\u0144 zacz\u0119li\u015bmy pr\u00f3bowa\u0107 napisa\u0107 RESTful CRUD API dla naszych mikroserwis\u00f3w z wsp\u00f3\u0142dzielonym stanem. Chcieli\u015bmy, aby mo\u017cna by\u0142o pobiera\u0107 stan niekt\u00f3rych lub wszystkich obiekt\u00f3w, a tak\u017ce ustawia\u0107 lub usuwa\u0107 stan obiektu (co jest przydatne w przypadku utrzymania backendu).<\/p>\n<p>Aby zapewni\u0107 wsparcie dla wszystkich API Get State, za ka\u017cdym razem, gdy musieli\u015bmy ponownie oblicza\u0107 stan podczas przetwarzania, przez d\u0142ugi czas przechowywali\u015bmy go w wbudowanym magazynie kluczy i warto\u015bci. W takim przypadku wystarczy zaimplementowa\u0107 takie API za pomoc\u0105 jednego wyst\u0105pienia Kafka Streams, jak pokazano w poni\u017cszym kodzie:<\/p>\n<p><img decoding=\"async\" alt=\"Nie tylko przetwarzanie: Jak zrobili\u015bmy z Kafka Streams rozproszon\u0105 baz\u0119 danych i co z tego wynik\u0142o\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustracja 5: u\u017cycie wbudowanego magazynu kluczy i warto\u015bci do uzyskania wcze\u015bniej obliczonego stanu obiektu <\/i><\/p>\n<p>Aktualizacja stanu obiektu przez API r\u00f3wnie\u017c jest \u0142atwa do zrealizowania. W zasadzie, aby to zrobi\u0107, trzeba tylko stworzy\u0107 producenta Kafka, a za jego pomoc\u0105 dokona\u0107 zapisu zawieraj\u0105cego nowy stan. Dzi\u0119ki temu zapewniono, \u017ce wszystkie wiadomo\u015bci generowane przez API b\u0119d\u0105 przetwarzane dok\u0142adnie w taki sam spos\u00f3b, jak te pochodz\u0105ce od innych producent\u00f3w (np. agent\u00f3w).<\/p>\n<p><img decoding=\"async\" alt=\"Nie tylko przetwarzanie: Jak zrobili\u015bmy z Kafka Streams rozproszon\u0105 baz\u0119 danych i co z tego wynik\u0142o\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustracja 6: stan obiektu mo\u017cna ustawi\u0107 za pomoc\u0105 producenta Kafka <\/i><\/p>\n<p><b>Ma\u0142e komplikacje: Kafka ma wiele partycji<\/b><\/p>\n<p>Nast\u0119pnie chcieli\u015bmy roz\u0142o\u017cy\u0107 obci\u0105\u017cenie zwi\u0105zane z przetwarzaniem i poprawi\u0107 dost\u0119pno\u015b\u0107, dostarczaj\u0105c dla ka\u017cdego scenariusza klaster mikroserwis\u00f3w ze wsp\u00f3\u0142dzielonym stanem. Konfiguracja okaza\u0142a si\u0119 dla nas dziecinnie prosta: po skonfigurowaniu wszystkich instancji tak, aby pracowa\u0142y z tym samym ID aplikacji (i tymi samymi serwerami pocz\u0105tkowymi), praktycznie wszystko pozosta\u0142e odbywa\u0142o si\u0119 automatycznie. Ustalili\u015bmy r\u00f3wnie\u017c, \u017ce ka\u017cdy temat \u017ar\u00f3d\u0142owy b\u0119dzie sk\u0142ada\u0142 si\u0119 z kilku partycji, aby ka\u017cdej instancji przypisa\u0107 podzbi\u00f3r takich partycji.<\/p>\n<p>Warto r\u00f3wnie\u017c wspomnie\u0107, \u017ce tutaj w porz\u0105dku rzeczy jest tworzenie kopii zapasowej magazynu stan\u00f3w, aby na przyk\u0142ad w przypadku przywracania po awarii przenie\u015b\u0107 t\u0119 kopi\u0119 na inn\u0105 instancj\u0119. Dla ka\u017cdego magazynu stan\u00f3w w Kafka Streams tworzony jest replicable topic z dziennikiem zmian (w kt\u00f3rym \u015bledzone s\u0105 lokalne aktualizacje). W ten spos\u00f3b Kafka ci\u0105gle zabezpiecza magazyn stan\u00f3w. Dlatego w przypadku awarii danej instancji, magazyn stan\u00f3w Kafka Streams mo\u017ce by\u0107 szybko przywr\u00f3cony na innej instancji, na kt\u00f3r\u0105 przenios\u0105 si\u0119 odpowiednie partycje. Nasze testy pokaza\u0142y, \u017ce trwa to zaledwie kilka sekund, nawet je\u015bli w magazynie znajduj\u0105 si\u0119 miliony wpis\u00f3w.<\/p>\n<p>Przechodz\u0105c od jednego mikroserwisu ze wsp\u00f3\u0142dzielonym stanem do klastra mikroserwis\u00f3w, wdro\u017cenie Get State API nie jest ju\u017c tak trywialne. W nowej sytuacji w magazynie stan\u00f3w ka\u017cdego mikroserwisu znajduje si\u0119 tylko cz\u0119\u015b\u0107 og\u00f3lnego obrazu (te obiekty, kt\u00f3rych klucze by\u0142y mapowane na konkretn\u0105 partycj\u0119). Musieli\u015bmy okre\u015bli\u0107, na kt\u00f3rej instancji znajdowa\u0142 si\u0119 stan poszukiwanego obiektu, co robili\u015bmy na podstawie metadanych strumieni, jak pokazano poni\u017cej:<\/p>\n<p><img decoding=\"async\" alt=\"Nie tylko przetwarzanie: Jak zrobili\u015bmy z Kafka Streams rozproszon\u0105 baz\u0119 danych i co z tego wynik\u0142o\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustracja 7: przy pomocy metadanych strumieni okre\u015blamy, z kt\u00f3rej instancji \u017c\u0105da\u0107 stanu poszukiwanego obiektu; podobne podej\u015bcie stosowane by\u0142o z GET ALL API.<\/i><\/p>\n<p><b>G\u0142\u00f3wne wnioski<\/b><\/p>\n<p>Magazyny stan\u00f3w w Kafka Streams de facto mog\u0105 s\u0142u\u017cy\u0107 jako rozproszona baza danych, <\/p>\n<ul>\n<li>ci\u0105gle replikowana w Kafka.<\/li>\n<li>Na takiej systemie \u0142atwo zbudowa\u0107 API CRUD. <\/li>\n<li>Przetwarzanie wielu partycji staje si\u0119 nieco bardziej skomplikowane. <\/li>\n<li>Mo\u017cliwe jest r\u00f3wnie\u017c dodanie jednego lub wi\u0119cej magazyn\u00f3w stan\u00f3w do topologii strumieniowej w celu przechowywania danych pomocniczych. Taka opcja mo\u017ce by\u0107 u\u017cywana do:<\/li>\n<li>D\u0142ugoterminowego przechowywania danych potrzebnych do oblicze\u0144 w czasie przetwarzania strumieniowego <\/li>\n<li>D\u0142ugoterminowego przechowywania danych, kt\u00f3re mog\u0105 by\u0107 przydatne podczas nast\u0119pnej inicjalizacji instancji strumienia <\/li>\n<li>wielu innych\u2026<\/li>\n<\/ul>\n<p>Dzi\u0119ki tym i innym zaletom Kafka Streams doskonale nadaje si\u0119 do wspierania globalnego stanu w tak rozproszonej systemie jak nasz. Kafka Streams okaza\u0142a si\u0119 bardzo niezawodna w produkcji (od momentu jej wdro\u017cenia praktycznie nie utracili\u015bmy wiadomo\u015bci), a jeste\u015bmy pewni, \u017ce jej mo\u017cliwo\u015bci nie s\u0105 na tym ograniczone!<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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\/pl\/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=\"pl_PL\" \/>\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\/pl\/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\udd47Nie tylko przetwarzanie: Jak zrobili\u015bmy z Kafka Streams rozproszon\u0105 baz\u0119 danych, i co z tego wynik\u0142o | ProHoster","description":"Cze\u015b\u0107, Habr! Przypominamy, \u017ce po ksi\u0105\u017cce o Kafka wydali\u015bmy r\u00f3wnie interesuj\u0105c\u0105 prac\u0119 o bibliotece","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}