{"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\/sv\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Inte bara bearbetning: Hur vi gjorde Kafka Streams till en distribuerad databas och vad som kom ut av det","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej, Habr!<\/p>\n<p>Vi p\u00e5minner om att efter boken om <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> har vi sl\u00e4ppt ett minst lika intressant verk om biblioteket <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=\"Inte bara bearbetning: Hur vi gjorde Kafka Streams till en distribuerad databas och vad som kom ut av det\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00f6r tillf\u00e4llet h\u00e5ller samh\u00e4llet p\u00e5 att utforska gr\u00e4nserna f\u00f6r m\u00f6jligheterna med detta kraftfulla verktyg. Nyligen publicerades en artikel som vi vill introducera er f\u00f6r. F\u00f6rfattaren delar med sig av sina egna erfarenheter om hur man skapar ett distribuerat datalager med hj\u00e4lp av Kafka Streams. Trevlig l\u00e4sning!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nApache-biblioteket <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> anv\u00e4nds v\u00e4rlden \u00f6ver i f\u00f6retag f\u00f6r distribuerad str\u00f6mbehandling ovanp\u00e5 Apache Kafka. En av de underskattade aspekterna av detta ramverk \u00e4r att det m\u00f6jligg\u00f6r lagring av lokalt tillst\u00e5nd som skapas genom str\u00f6mbehandling.<\/p>\n<p>I denna artikel kommer jag att ber\u00e4tta hur v\u00e5rt f\u00f6retag lyckades anv\u00e4nda denna m\u00f6jlighet f\u00f6r att utveckla en produkt f\u00f6r s\u00e4kerhet av molnapplikationer. Genom Kafka Streams skapade vi mikrotj\u00e4nster med delat tillst\u00e5nd, var och en av dem fungerar som en tillf\u00f6rlitlig och h\u00f6gverksam k\u00e4lla till information om tillst\u00e5ndet f\u00f6r objekt i systemet. F\u00f6r oss \u00e4r detta ett steg fram\u00e5t b\u00e5de n\u00e4r det g\u00e4ller tillf\u00f6rlitlighet och underh\u00e5ll.<\/p>\n<p>Om du \u00e4r intresserad av en alternativ metod som m\u00f6jligg\u00f6r anv\u00e4ndning av en central databas f\u00f6r att st\u00f6dja det formella tillst\u00e5ndet f\u00f6r dina objekt \u2013 l\u00e4s g\u00e4rna vidare, det blir intressant\u2026 <\/p>\n<p><b>Varf\u00f6r vi ans\u00e5g att det var dags att f\u00f6r\u00e4ndra v\u00e5ra angreppss\u00e4tt f\u00f6r att arbeta med delat tillst\u00e5nd <\/b><\/p>\n<p>Vi beh\u00f6vde st\u00f6dja tillst\u00e5ndet f\u00f6r olika objekt baserat p\u00e5 rapporter fr\u00e5n agenter (t.ex.: blev webbplatsen attackerad?). Innan \u00f6verg\u00e5ngen till Kafka Streams f\u00f6rlitade vi oss ofta p\u00e5 en central databas (+ tj\u00e4nste-API) f\u00f6r att hantera tillst\u00e5ndet. Denna metod har sina nackdelar: i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">datainstensiva situationer<\/a><\/noindex> blir det en verklig utmaning att st\u00f6dja konsistens och synkronisering. Databasen kan bli en flaskhals eller hamna i <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">tillst\u00e5nd av konkurrens<\/a><\/noindex> och lida av of\u00f6ruts\u00e4gbarhet.<\/p>\n<p><img decoding=\"async\" alt=\"Inte bara bearbetning: Hur vi gjorde Kafka Streams till en distribuerad databas och vad som kom ut av det\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 1: en typisk scenariobild med delat tillst\u00e5nd, som intr\u00e4ffade innan \u00f6verg\u00e5ngen till <br \/>\nKafka och Kafka Streams: agenter rapporterar sina uppfattningar via API, det uppdaterade tillst\u00e5ndet ber\u00e4knas genom den centrala databasen. <\/i><\/p>\n<p><b>L\u00e4r k\u00e4nna Kafka Streams \u2013 nu \u00e4r det enkelt att skapa mikrotj\u00e4nster med delat tillst\u00e5nd. <\/b><\/p>\n<p>F\u00f6r ungef\u00e4r ett \u00e5r sedan best\u00e4mde vi oss f\u00f6r att noga g\u00e5 igenom v\u00e5ra arbetsscenarier f\u00f6r delat tillst\u00e5nd f\u00f6r att hantera olika problem. Vi best\u00e4mde oss f\u00f6r att prova Kafka Streams \u2013 det \u00e4r allm\u00e4nt k\u00e4nt hur skalbar, h\u00f6g tillg\u00e4nglig och fel\u00e4kta systemet \u00e4r, samt den rika str\u00f6mfunktionalitet den erbjuder (bland annat transformationer, inklusive de som beh\u00e5ller tillst\u00e5nd). Precis vad vi beh\u00f6vde, f\u00f6r att inte n\u00e4mna hur mogen och p\u00e5litlig meddelandesystemet som Kafka har blivit.<\/p>\n<p>Varje mikrotj\u00e4nst vi skapade med delat tillst\u00e5nd byggdes p\u00e5 en instans av Kafka Streams med en ganska enkel topologi. Den bestod av 1) en k\u00e4lla 2) en processor med ett best\u00e4ndigt nyckel-v\u00e4rde-lager 3) en str\u00f6m:<\/p>\n<p><img decoding=\"async\" alt=\"Inte bara bearbetning: Hur vi gjorde Kafka Streams till en distribuerad databas och vad som kom ut av det\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 2: den standardtopologi som v\u00e5ra str\u00f6minstanser f\u00f6r mikrotj\u00e4nster med delat tillst\u00e5nd f\u00f6ljer. Observera att det ocks\u00e5 finns ett lager h\u00e4r som inneh\u00e5ller metadata om schemal\u00e4ggning. <\/i><\/p>\n<p>Med detta nya tillv\u00e4gag\u00e5ngss\u00e4tt skapar agenter meddelanden som skickas till den ursprungliga topiken, medan konsumenterna \u2013 l\u00e5t oss s\u00e4ga, e-postnotifikationstj\u00e4nsten \u2013 tar emot det ber\u00e4knade delade tillst\u00e5ndet via str\u00f6mmen (utg\u00e5ngstopiken).<\/p>\n<p><img decoding=\"async\" alt=\"Inte bara bearbetning: Hur vi gjorde Kafka Streams till en distribuerad databas och vad som kom ut av det\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 3: ett nytt exempel p\u00e5 str\u00f6m av uppgifter f\u00f6r scenariet med delade mikrotj\u00e4nster: 1) agenten genererar ett meddelande som g\u00e5r till den ursprungliga Kafka-topiken; 2) mikrotj\u00e4nsten med delat tillst\u00e5nd (som anv\u00e4nder Kafka Streams) bearbetar det och skriver det ber\u00e4knade tillst\u00e5ndet till den slutliga Kafka-topiken; d\u00e4refter 3) konsumenterna tar emot det nya tillst\u00e5ndet.<\/i><\/p>\n<p><b>Hej, och detta inbyggda nyckel-v\u00e4rde-lager \u00e4r verkligen mycket anv\u00e4ndbart!<\/b><\/p>\n<p>Som n\u00e4mnts tidigare inneh\u00e5ller v\u00e5r topologi med delat tillst\u00e5nd ett nyckel-v\u00e4rde-lager. Vi har funnit flera s\u00e4tt att anv\u00e4nda det, och tv\u00e5 av dem beskrivs nedan.<\/p>\n<p><i><b>Alternativ #1: anv\u00e4ndning av nyckel-v\u00e4rde-lager vid ber\u00e4kningar.<\/b><\/i><\/p>\n<p>V\u00e5rt f\u00f6rsta nyckel-v\u00e4rde-lager inneh\u00f6ll hj\u00e4lpdata som vi beh\u00f6vde f\u00f6r v\u00e5ra ber\u00e4kningar. Till exempel, i vissa fall fastst\u00e4lldes det delade tillst\u00e5ndet enligt principen \"majoritetens r\u00f6ster\". I lagret kunde vi h\u00e5lla alla senaste rapporter fr\u00e5n agenter om tillst\u00e5ndet f\u00f6r ett visst objekt. N\u00e4r vi sedan fick en ny rapport fr\u00e5n en agent, kunde vi spara den, h\u00e4mta lagret av rapporter fr\u00e5n alla andra agenter om samma objekt och upprepa ber\u00e4kningen.<br \/>\nNedan i illustration 4 visas hur vi \u00f6ppnade \u00e5tkomst till nyckel-v\u00e4rde-lagret f\u00f6r processorns behandlande metod, s\u00e5 att vi sedan kunde bearbeta ett nytt meddelande.<\/p>\n<p><img decoding=\"async\" alt=\"Inte bara bearbetning: Hur vi gjorde Kafka Streams till en distribuerad databas och vad som kom ut av det\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 4: \u00f6ppna \u00e5tkomst till nyckel-v\u00e4rde-lagret f\u00f6r den behandlande metoden i processorn (efter detta m\u00e5ste varje scenarie som arbetar med delat tillst\u00e5nd implementera metoden <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Alternativ #2: skapa ett CRUD API ovanp\u00e5 Kafka Streams<\/b><\/i><\/p>\n<p>Efter att ha st\u00e4llt in v\u00e5r grundl\u00e4ggande uppgiftstr\u00f6m b\u00f6rjade vi f\u00f6rs\u00f6ka skriva ett RESTful CRUD API f\u00f6r v\u00e5ra mikrotj\u00e4nster med delat tillst\u00e5nd. Vi ville m\u00f6jligg\u00f6ra att h\u00e4mta tillst\u00e5ndet f\u00f6r vissa eller alla objekt, samt att st\u00e4lla in eller ta bort tillst\u00e5ndet f\u00f6r ett objekt (detta \u00e4r anv\u00e4ndbart f\u00f6r att st\u00f6dja backend).<\/p>\n<p>F\u00f6r att st\u00f6dja alla API:Get State, varje g\u00e5ng vi beh\u00f6vde ber\u00e4kna tillst\u00e5ndet p\u00e5 nytt under behandlingen, lagrade vi det under l\u00e5ng tid i det inbyggda nyckel-v\u00e4rde-lagret. I s\u00e5 fall blir det tillr\u00e4ckligt enkelt att implementera ett s\u00e5dant API med hj\u00e4lp av en enda instans av Kafka Streams, som visas i den nedanst\u00e5ende listningen:<\/p>\n<p><img decoding=\"async\" alt=\"Inte bara bearbetning: Hur vi gjorde Kafka Streams till en distribuerad databas och vad som kom ut av det\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 5: anv\u00e4ndning av det inbyggda nyckel-v\u00e4rde-lagret f\u00f6r att h\u00e4mta f\u00f6rber\u00e4knat tillst\u00e5nd av objektet <\/i><\/p>\n<p>Att uppdatera tillst\u00e5ndet f\u00f6r ett objekt via API \u00e4r ocks\u00e5 enkelt att implementera. I princip kr\u00e4vs det bara att skapa en Kafka-producent och med den g\u00f6ra en skrivning som inneh\u00e5ller det nya tillst\u00e5ndet. Detta garanterar att alla meddelanden som genereras via API behandlas p\u00e5 samma s\u00e4tt som de som skickas fr\u00e5n andra producenter (t.ex. agenter).<\/p>\n<p><img decoding=\"async\" alt=\"Inte bara bearbetning: Hur vi gjorde Kafka Streams till en distribuerad databas och vad som kom ut av det\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 6: st\u00e4lla in tillst\u00e5ndet f\u00f6r ett objekt kan g\u00f6ras med hj\u00e4lp av en Kafka-producent <\/i><\/p>\n<p><b>En liten komplikation: Kafka har m\u00e5nga partitioner<\/b><\/p>\n<p>N\u00e4sta steg var att f\u00f6rdela den belastning som \u00e4r kopplad till bearbetningen och f\u00f6rb\u00e4ttra tillg\u00e4ngligheten genom att tillhandah\u00e5lla en kluster av mikrotj\u00e4nster med delat tillst\u00e5nd f\u00f6r varje scenario. Inst\u00e4llningen var mycket enkel f\u00f6r oss: efter att vi konfigurerade alla instanser s\u00e5 att de arbetade med samma app-ID (och med samma initiala server) gjordes praktiskt taget allt annat automatiskt. Vi angav ocks\u00e5 att varje ursprunglig \u00e4mne skulle best\u00e5 av flera partitioner s\u00e5 att varje instans kunde tilldelas en delm\u00e4ngd av dessa partitioner.<\/p>\n<p>Jag n\u00e4mner ocks\u00e5 att det \u00e4r vanligt h\u00e4r att ta en backup av tillst\u00e5ndslager, s\u00e5 att man, till exempel, vid en \u00e5terst\u00e4llning efter ett fel kan \u00f6verf\u00f6ra denna kopia till en annan instans. F\u00f6r varje tillst\u00e5ndslager i Kafka Streams skapas ett replikerat \u00e4mne med en \u00e4ndringslogg (d\u00e4r lokala uppdateringar sp\u00e5ras). P\u00e5 s\u00e5 s\u00e4tt skyddar Kafka kontinuerligt tillst\u00e5ndslagret. D\u00e4rf\u00f6r kan tillst\u00e5ndslagret i Kafka Streams snabbt \u00e5terst\u00e4llas p\u00e5 en annan instans om en av instanserna g\u00e5r ner, dit de relevanta partitionerna flyttas. V\u00e5ra tester visade att detta g\u00f6rs p\u00e5 n\u00e5gra sekunder \u00e4ven om lagret inneh\u00e5ller miljontals poster.<\/p>\n<p>Att g\u00e5 fr\u00e5n en mikrotj\u00e4nst med delat tillst\u00e5nd till ett kluster av mikrotj\u00e4nster g\u00f6r det inte l\u00e4ngre s\u00e5 trivialt att implementera Get State API. I den nya situationen inneh\u00e5ller tillst\u00e5ndslagret f\u00f6r varje mikrotj\u00e4nst endast en del av den helhet som beh\u00f6vs (de objekt vars nycklar pekades p\u00e5 en specifik partition). Vi beh\u00f6vde best\u00e4mma vilken instans som inneh\u00f6ll tillst\u00e5ndet f\u00f6r det objekt vi beh\u00f6vde, och vi gjorde detta baserat p\u00e5 metadata f\u00f6r str\u00f6mmarna, som visas nedan:<\/p>\n<p><img decoding=\"async\" alt=\"Inte bara bearbetning: Hur vi gjorde Kafka Streams till en distribuerad databas och vad som kom ut av det\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 7: med hj\u00e4lp av metadata f\u00f6r str\u00f6mmarna best\u00e4mmer vi vilken instans vi ska h\u00e4mta tillst\u00e5ndet f\u00f6r det \u00f6nskade objektet; en liknande metod till\u00e4mpades med GET ALL API.<\/i><\/p>\n<p><b>Huvudsakliga slutsatser<\/b><\/p>\n<p>Tillst\u00e5ndslager i Kafka Streams kan de facto fungera som en distribuerad databas, <\/p>\n<ul>\n<li>som kontinuerligt replikerar i Kafka.<\/li>\n<li>Ovanp\u00e5 ett s\u00e5dant system \u00e4r det enkelt att bygga ett CRUD API. <\/li>\n<li>Att bearbeta flera partitioner blir n\u00e5got mer komplicerat. <\/li>\n<li>Det \u00e4r ocks\u00e5 m\u00f6jligt att l\u00e4gga till ett eller flera tillst\u00e5ndslager i den str\u00f6mmande topologin f\u00f6r att lagra hj\u00e4lpdata. Denna l\u00f6sning kan anv\u00e4ndas f\u00f6r:<\/li>\n<li>L\u00e5ngtidslagring av data som beh\u00f6vs f\u00f6r ber\u00e4kningar vid str\u00f6mmande behandling <\/li>\n<li>L\u00e5ngtidslagring av data som kan vara anv\u00e4ndbara vid n\u00e4sta initiering av str\u00f6mmande instans <\/li>\n<li>mycket mer\u2026<\/li>\n<\/ul>\n<p>Tack vare dessa och andra f\u00f6rdelar \u00e4r Kafka Streams utm\u00e4rkt f\u00f6r att st\u00f6dja globalt tillst\u00e5nd i ett distribuerat system som v\u00e5rt. Kafka Streams har visat sig vara mycket p\u00e5litlig i produktion (sedan den lanserades har vi knappt f\u00f6rlorat n\u00e5gra meddelanden), och vi \u00e4r \u00f6vertygade om att dess m\u00f6jligheter inte begr\u00e4nsas av detta!<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Inte bara bearbetning: Hur vi gjorde Kafka Streams till en distribuerad databas, och vad som kom ur det | ProHoster","description":"Hej, Habr! Vi p\u00e5minner om att efter boken om Kafka har vi sl\u00e4ppt ett minst lika intressant arbete om biblioteket","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}