{"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\/da\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Ikke kun behandling: Hvordan vi gjorde Kafka Streams til en distribueret database, og hvad der kom ud af det","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hello, Habr!<\/p>\n<p>Vi minder om, at i takt med bogen om <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> har vi udgivet et mindst lige s\u00e5 interessant v\u00e6rk 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=\"Ikke kun behandling: Hvordan vi gjorde Kafka Streams til en distribueret database, og hvad der kom ud af det\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMens samfundet netop er ved at udforske gr\u00e6nserne for mulighederne med dette kraftfulde v\u00e6rkt\u00f8j, er der for nylig udgivet en artikel, som vi gerne vil introducere jer for. P\u00e5 egen erfaring beskriver forfatteren, hvordan man kan skabe et distribueret datalager med Kafka Streams. God l\u00e6sning!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nBiblioteket Apache <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> bruges over hele verden i erhvervslivet til distribueret streambehandling oven p\u00e5 Apache Kafka. En af de undervurderede aspekter ved dette framework er, at det tillader opbevaring af lokal tilstand genereret ud fra streambehandling.<\/p>\n<p>I denne artikel vil jeg fort\u00e6lle, hvordan vi i vores virksomhed har haft fordel af denne mulighed i udviklingen af et produkt til sikkerhed i skyapplikationer. Ved hj\u00e6lp af Kafka Streams har vi skabt mikrotjenester med delt tilstand, som hver is\u00e6r fungerer som en redundant og h\u00f8jt tilg\u00e6ngelig kilde til p\u00e5lidelig information om tilstanden af objekterne i systemet. For os er dette et skridt fremad hvad ang\u00e5r p\u00e5lidelighed samt vedligeholdelsesvenlighed.<\/p>\n<p>Hvis du er interesseret i en alternativ tilgang, der g\u00f8r det muligt at anvende en central database til at underst\u00f8tte den formelle tilstand af dine objekter - l\u00e6s videre, det vil v\u00e6re interessant\u2026 <\/p>\n<p><b>Hvorfor vi mente, det var tid til at \u00e6ndre vores tilgang til arbejde med delt tilstand <\/b><\/p>\n<p>Vi havde brug for at opretholde tilstanden af forskellige objekter baseret p\u00e5 rapporter fra agenter (for eksempel: var hjemmesiden blevet angrebet?). Inden vi skiftede til Kafka Streams stolede vi ofte p\u00e5 at administrere tilstanden med en central database (+ service API). Denne tilgang har sine ulemper: i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">datadrevne situationer<\/a><\/noindex> bliver opretholdelse af konsistens og synkronisering en reel udfordring. Databasen kan blive flaskehals eller ende i <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">kapl\u00f8b<\/a><\/noindex> og lide under uforudsigelighed.<\/p>\n<p><img decoding=\"async\" alt=\"Ikke kun behandling: Hvordan vi gjorde Kafka Streams til en distribueret database, og hvad der kom ud af det\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 1: typisk scenario med opdeling af tilstand, der blev m\u00f8dt f\u00f8r skiftet til <br \/>\nKafka og Kafka Streams: agenterne rapporterer deres opfattelser via API, den opdaterede tilstand beregnes gennem den centrale database. <\/i><\/p>\n<p><b>Bliv bekendt med Kafka Streams \u2013 det er nu blevet nemt at skabe mikrotjenester med delt tilstand. <\/b><\/p>\n<p>For about a year now, we have thoroughly reviewed our scenarios for working with shared state to tackle various issues. We immediately decided to try Kafka Streams\u2014it's well-known for its scalability, high availability, and fault tolerance, as well as its rich streaming functionality (including transformations, with state preservation). This was exactly what we needed, not to mention how mature and reliable the messaging system in Kafka has become.<\/p>\n<p>Each of the stateful microservices we created was based on an instance of Kafka Streams with a rather simple topology. It consisted of 1) a source 2) a processor with a persistent key-value store 3) a sink:<\/p>\n<p><img decoding=\"async\" alt=\"Ikke kun behandling: Hvordan vi gjorde Kafka Streams til en distribueret database, og hvad der kom ud af det\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 2: the default topology of our streaming instances for stateful microservices. Note: there is also a store here that contains metadata about scheduling. <\/i><\/p>\n<p>With this new approach, agents compose messages submitted to the initial topic, while consumers\u2014say, a mail notification service\u2014receive the computed shared state through the sink (output topic).<\/p>\n<p><img decoding=\"async\" alt=\"Ikke kun behandling: Hvordan vi gjorde Kafka Streams til en distribueret database, og hvad der kom ud af det\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 3: a new example of a task stream for a scenario with shared microservices: 1) an agent generates a message that goes to the initial Kafka topic; 2) the stateful microservice (using Kafka Streams) processes it and writes the computed state to the final Kafka topic; after which 3) consumers accept the new state.<\/i><\/p>\n<p><b>Hey, this built-in key-value store is actually very useful!<\/b><\/p>\n<p>As mentioned above, our stateful topology contains a key-value store. We found several use cases for it, two of which are described below.<\/p>\n<p><i><b>Option #1: using the key-value store in computations<\/b><\/i><\/p>\n<p>Vores f\u00f8rste n\u00f8gle-v\u00e6rdi-lager indeholdt hj\u00e6lpeoplysninger, som vi havde brug for til vores beregninger. For eksempel blev den delte tilstand i nogle tilf\u00e6lde bestemt ud fra princippet om \"flertallets stemme\". I lageret kunne vi holde alle de seneste rapporter fra agenter om tilstanden af et bestemt objekt. Derefter, n\u00e5r vi modtog en ny rapport fra en hvilken som helst agent, kunne vi gemme den, hente rapporterne fra alle de andre agenter om tilstanden af det samme objekt og gentage beregningen.<br \/>\nNedenfor i illustration 4 vises, hvordan vi \u00e5bnede adgangen til n\u00f8gle-v\u00e6rdi-lageret for den behandlende metode af processoren, s\u00e5 vi derefter kunne behandle en ny besked.<\/p>\n<p><img decoding=\"async\" alt=\"Ikke kun behandling: Hvordan vi gjorde Kafka Streams til en distribueret database, og hvad der kom ud af det\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 4: \u00c5bning af adgangen til n\u00f8gle-v\u00e6rdi-lageret for den behandlende metode af processoren (herefter skal der implementeres en metode i hvert scenarie, der arbejder med delt tilstand <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Mulighed #2: Oprettelse af CRUD API over Kafka Streams<\/b><\/i><\/p>\n<p>Efter at have etableret vores grundl\u00e6ggende opgaveflow begyndte vi at pr\u00f8ve at skrive et RESTful CRUD API til vores mikrotjenester med delt tilstand. Vi \u00f8nskede at kunne hente tilstanden af nogle eller alle objekter samt oprette eller slette tilstanden af et objekt (det er nyttigt til server-side support).<\/p>\n<p>For at underst\u00f8tte alle API'er til at hente tilstand, hver gang vi havde brug for at rekonstruere tilstanden under behandlingen, gemte vi den i det indbyggede n\u00f8gle-v\u00e6rdi-lager i lang tid. I s\u00e5 fald bliver det ganske enkelt at implementere et s\u00e5dant API ved hj\u00e6lp af en enkelt instans af Kafka Streams, som vist i den f\u00f8lgende kode:<\/p>\n<p><img decoding=\"async\" alt=\"Ikke kun behandling: Hvordan vi gjorde Kafka Streams til en distribueret database, og hvad der kom ud af det\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 5: Brug af det indbyggede n\u00f8gle-v\u00e6rdi-lager til at hente den forudberegnede tilstand af objektet <\/i><\/p>\n<p>Opdatering af objektets tilstand via API er heller ikke sv\u00e6rt at implementere. Grundl\u00e6ggende kr\u00e6ver det kun at oprette en Kafka-producent, og med denne lave en skrivning, der indeholder den nye tilstand. Dette sikrer, at alle beskeder genereret gennem API'en behandles p\u00e5 samme m\u00e5de som dem, der kommer fra andre producenter (f.eks. agenter).<\/p>\n<p><img decoding=\"async\" alt=\"Ikke kun behandling: Hvordan vi gjorde Kafka Streams til en distribueret database, og hvad der kom ud af det\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 6: Objektets tilstand kan angives ved hj\u00e6lp af en Kafka-producent <\/i><\/p>\n<p><b>En lille komplikation: Kafka har mange partitioner<\/b><\/p>\n<p>Dern\u00e6st \u00f8nskede vi at fordele belastningen relateret til behandlingen og forbedre tilg\u00e6ngeligheden ved at give hver scenarie et cluster af mikrotjenester med delt tilstand. Ops\u00e6tningen var lettere end forventet: efter at vi konfigurerede alle instanser til at arbejde med den samme app-ID (og de samme opstartservere), blev stort set alt andet udf\u00f8rt automatisk. Vi angav ogs\u00e5, at hvert oprindeligt emne skulle best\u00e5 af flere partitioner, s\u00e5 hver instans kunne tildeles et delm\u00e6ngde af disse partitioner.<\/p>\n<p>Jeg vil ogs\u00e5 n\u00e6vne, at det er almindeligt her at tage backup af tilstandsopbevaringen, s\u00e5 man f.eks. nemt kan overf\u00f8re denne backup til en anden instans i tilf\u00e6lde af gendannelse efter en fejl. For hver tilstandsopbevaring i Kafka Streams oprettes der et replikerbart emne med en \u00e6ndringslog (hvor lokale opdateringer registreres). P\u00e5 den m\u00e5de sikrer Kafka altid tilstandsopbevaringen. Derfor kan tilstandsopbevaringen i Kafka Streams hurtigt gendannes p\u00e5 en anden instans i tilf\u00e6lde af en fejl i en specifik instans, hvor de relevante partitioner overf\u00f8res. Vores tests viste, at dette kan g\u00f8res p\u00e5 f\u00e5 sekunder, selv n\u00e5r der er millioner af poster i opbevaringen.<\/p>\n<p>At g\u00e5 fra en mikrotjeneste med delt tilstand til et cluster af mikrotjenester g\u00f8r det ikke s\u00e5 trivielt at implementere Get State API. I den nye situation indeholder tilstandsopbevaringen i hver mikrotjeneste kun en del af det samlede billede (de objekter, hvis n\u00f8gler blev vist p\u00e5 en bestemt partition). Vi m\u00e5tte afg\u00f8re, hvilken instans der havde tilstanden af det objekt, vi havde brug for, og dette gjorde vi baseret p\u00e5 metadata fra str\u00f8mmene, som vist nedenfor:<\/p>\n<p><img decoding=\"async\" alt=\"Ikke kun behandling: Hvordan vi gjorde Kafka Streams til en distribueret database, og hvad der kom ud af det\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustration 7: ved hj\u00e6lp af metadatastr\u00f8mme bestemmer vi, hvilken instans vi skal anmode om tilstanden af det \u00f8nskede objekt; en lignende tilgang blev anvendt med GET ALL API<\/i><\/p>\n<p><b>Hovedelementer<\/b><\/p>\n<p>Tilstandsopbevaringer i Kafka Streams kan de facto fungere som en distribueret database, <\/p>\n<ul>\n<li>konstant replikeret i Kafka<\/li>\n<li>Oven p\u00e5 et s\u00e5dant system er det nemt at opbygge et CRUD API <\/li>\n<li>Behandlingen af flere partitioner viser sig at v\u00e6re lidt mere kompleks <\/li>\n<li>Det er ogs\u00e5 muligt at tilf\u00f8je et eller flere tilstandsopbevaringssystemer til den streamingtopologi til opbevaring af hj\u00e6lpeoplysninger. Denne l\u00f8sning kan anvendes til:<\/li>\n<li>Langtidsopbevaring af data, der er n\u00f8dvendige for beregninger under streamingbehandling <\/li>\n<li>Langtidsopbevaring af data, som kan v\u00e6re nyttige ved n\u00e6ste initialisering af streaminginstansen <\/li>\n<li>mange andre ting\u2026<\/li>\n<\/ul>\n<p>Takket v\u00e6re disse og andre fordele er Kafka Streams fremragende til at st\u00f8tte global tilstand i et s\u00e5dant distribueret system som vores. Kafka Streams har vist sig at v\u00e6re meget p\u00e5lidelig i produktion (siden dens implementering har vi n\u00e6sten ikke mistet meddelelser), og vi er overbeviste om, at dens muligheder ikke stopper her!<br \/>\n<br \/>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Ikke kun behandling: Hvordan vi gjorde Kafka Streams til en distribueret database, og hvad der kom ud af det | ProHoster","description":"Hej, Habr! Vi minder om, at vi efter bogen om Kafka har udgivet et ikke mindre interessant v\u00e6rk om biblioteket","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}