{"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\/hu\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Nem csak feldolgoz\u00e1s: Hogyan alak\u00edtottuk a Kafka Streams-t elosztott adatb\u00e1ziss\u00e1, \u00e9s mi lett az eredm\u00e9nye","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hell\u00f3, Habr!<\/p>\n<p>Eml\u00e9keztet\u00fcnk, hogy a k\u00f6nyv ut\u00e1n <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">, amely lehet\u0151s\u00e9get ad val\u00f3s id\u0151ben l\u00e1tni a rendszer esem\u00e9nyportf\u00f3li\u00f3j\u00e1t.<\/a><\/noindex> kiadtunk egy legal\u00e1bb annyira \u00e9rdekes m\u0171vet a <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-r\u00f3l<\/a><\/noindex>. <\/p>\n<p><img decoding=\"async\" alt=\"Nem csak feldolgoz\u00e1s: Hogyan alak\u00edtottuk a Kafka Streams-t elosztott adatb\u00e1ziss\u00e1, \u00e9s mi lett az eredm\u00e9nye\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJelenleg a k\u00f6z\u00f6ss\u00e9g csak felfedezi ennek a hatalmas eszk\u00f6znek a lehet\u0151s\u00e9geit. Nemr\u00e9giben megjelent egy cikk, amelynek ford\u00edt\u00e1s\u00e1val szeretn\u00e9nk megismertetni \u00d6n\u00f6ket. A szerz\u0151 saj\u00e1t tapasztalata alapj\u00e1n mes\u00e9l arr\u00f3l, hogyan lehet a Kafka Streams-b\u00f3l elosztott adatrakt\u00e1rt l\u00e9trehozni. J\u00f3 olvas\u00e1st k\u00edv\u00e1nunk!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nAz Apache k\u00f6nyvt\u00e1r <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> vil\u00e1gszerte adatk\u00f6zpontokban haszn\u00e1lj\u00e1k az Apache Kafka f\u00f6l\u00f6tti elosztott folyamfeldolgoz\u00e1shoz. Ennek a keretrendszernek az egyik al\u00e1becs\u00fclt aspektusa, hogy lehet\u0151v\u00e9 teszi a folyamfeldolgoz\u00e1s alapj\u00e1n gener\u00e1lt lok\u00e1lis \u00e1llapot t\u00e1rol\u00e1s\u00e1t.<\/p>\n<p>Ebben a cikkben arr\u00f3l fogok besz\u00e1molni, hogyan siker\u00fclt c\u00e9g\u00fcnkn\u00e9l hat\u00e9konyan kihaszn\u00e1lni ezt a lehet\u0151s\u00e9get egy felh\u0151alap\u00fa alkalmaz\u00e1sbiztons\u00e1gi term\u00e9k fejleszt\u00e9se sor\u00e1n. A Kafka Streams seg\u00edts\u00e9g\u00e9vel olyan mikroszolg\u00e1ltat\u00e1sokat hoztunk l\u00e9tre, amelyek megosztott \u00e1llapottal rendelkeznek, \u00e9s mindegyik megb\u00edzhat\u00f3 \u00e9s magas rendelkez\u00e9sre \u00e1ll\u00e1s\u00fa forr\u00e1sk\u00e9nt szolg\u00e1l az inform\u00e1ci\u00f3k pontos \u00e1llapot\u00e1r\u00f3l a rendszerben. Ez el\u0151rel\u00e9p\u00e9s sz\u00e1munkra mind a megb\u00edzhat\u00f3s\u00e1g, mind a karbantart\u00e1s k\u00f6nny\u00edt\u00e9se szempontj\u00e1b\u00f3l.<\/p>\n<p>Ha \u00e9rdekli egy alternat\u00edv megk\u00f6zel\u00edt\u00e9s, amely lehet\u0151v\u00e9 teszi, hogy egys\u00e9ges k\u00f6zponti adatb\u00e1zist haszn\u00e1ljunk az objektumok form\u00e1lis \u00e1llapot\u00e1nak kezel\u00e9s\u00e9re \u2013 olvassa el, \u00e9rdemes lesz\u2026 <\/p>\n<p><b>Mi\u00e9rt gondoltuk, hogy itt az ideje megv\u00e1ltoztatni a megk\u00f6zel\u00edt\u00e9seinket a megosztott \u00e1llapot kezel\u00e9s\u00e9ben <\/b><\/p>\n<p>Az k\u00fcl\u00f6nb\u00f6z\u0151 objektumok \u00e1llapot\u00e1nak fenntart\u00e1s\u00e1ra volt sz\u00fcks\u00e9g\u00fcnk, az \u00fcgyn\u00f6k\u00f6k jelent\u00e9seire t\u00e1maszkodva (p\u00e9ld\u00e1ul: t\u00f6rt\u00e9nt-e t\u00e1mad\u00e1s a weboldalon?). A Kafka Streams-re val\u00f3 \u00e1tt\u00e9r\u00e9s el\u0151tt gyakran t\u00e1maszkodtunk egy k\u00f6zponti adatb\u00e1zisra (+ szolg\u00e1ltat\u00e1si API) az \u00e1llapot kezel\u00e9s\u00e9hez. Ennek a megk\u00f6zel\u00edt\u00e9snek megvannak a h\u00e1tr\u00e1nyai: a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">nagy adathalmoz\u00e1si helyzetekben<\/a><\/noindex> az intelligencia \u00e9s a szinkroniz\u00e1l\u00e1s fenntart\u00e1sa igazi kih\u00edv\u00e1ss\u00e1 v\u00e1lik. Az adatb\u00e1zis sz\u0171k keresztmetszett\u00e9 v\u00e1lhat, vagy <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">fut\u00e1si \u00e1llapotba<\/a><\/noindex> ker\u00fclhet, \u00e9s szenvedhet a kisz\u00e1m\u00edthatatlans\u00e1gt\u00f3l.<\/p>\n<p><img decoding=\"async\" alt=\"Nem csak feldolgoz\u00e1s: Hogyan alak\u00edtottuk a Kafka Streams-t elosztott adatb\u00e1ziss\u00e1, \u00e9s mi lett az eredm\u00e9nye\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>1. \u00e1bra: tipikus \u00e1llapotmegoszt\u00e1si forgat\u00f3k\u00f6nyv, amely a Kafka \u00e9s a Kafka Streams-ra val\u00f3 \u00e1tt\u00e9r\u00e9s el\u0151tt fordult el\u0151: az \u00fcgyn\u00f6k\u00f6k az API-n kereszt\u00fcl jelentik az elk\u00e9pzel\u00e9seiket, az \u00faj \u00e1llapotot a k\u00f6zponti adatb\u00e1zis sz\u00e1m\u00edtja ki <br \/>\nIsmerje meg a Kafka Streams-t \u2013 most m\u00e1r egyszer\u0171en lehet megosztott \u00e1llapottal rendelkez\u0151 mikroszolg\u00e1ltat\u00e1sokat l\u00e9trehozni <\/i><\/p>\n<p><b>Ismerje meg a Kafka Streams-t \u2013 most m\u00e1r egyszer\u0171 l\u00e9trehozni a megosztott \u00e1llapot\u00fa mikroszervizeket. <\/b><\/p>\n<p>K\u00f6r\u00fclbel\u00fcl egy \u00e9vvel ezel\u0151tt \u00fagy d\u00f6nt\u00f6tt\u00fcnk, hogy alaposan \u00e1ttekintj\u00fck a megosztott \u00e1llapottal kapcsolatos munkafolyamatainkat, hogy megoldjuk a felmer\u00fclt probl\u00e9m\u00e1kat. Azonnal ki akartuk pr\u00f3b\u00e1lni a Kafka Streams-t \u2013 k\u00f6ztudott, hogy mennyire sk\u00e1l\u00e1zhat\u00f3, nagy rendelkez\u00e9sre \u00e1ll\u00e1s\u00fa \u00e9s hib\u00e1t\u0171r\u0151, \u00e9s milyen gazdag a folyamfunkcionalit\u00e1sa (t\u00f6bbek k\u00f6z\u00f6tt \u00e1llapot meg\u0151rz\u00e9s\u00e9vel v\u00e9gzett \u00e1talak\u00edt\u00e1sok). Pontosan erre volt sz\u00fcks\u00e9g\u00fcnk, nem besz\u00e9lve arr\u00f3l, milyen \u00e9rett \u00e9s megb\u00edzhat\u00f3 \u00fczenetk\u00fcld\u0151 rendszer alakult ki a Kafka k\u00f6r\u00fcl.<\/p>\n<p>Az \u00e1ltalunk l\u00e9trehozott minden megosztott \u00e1llapot\u00fa mikroszolg\u00e1ltat\u00e1s egy viszonylag egyszer\u0171 Kafka Streams p\u00e9ld\u00e1ny alapj\u00e1n \u00e9p\u00fclt fel. Ez 1) forr\u00e1st, 2) kulcs-\u00e9rt\u00e9k t\u00e1rol\u00f3val rendelkez\u0151 feldolgoz\u00f3t, \u00e9s 3) egy kimenetet tartalmazott:<\/p>\n<p><img decoding=\"async\" alt=\"Nem csak feldolgoz\u00e1s: Hogyan alak\u00edtottuk a Kafka Streams-t elosztott adatb\u00e1ziss\u00e1, \u00e9s mi lett az eredm\u00e9nye\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>2. \u00e1bra: a megosztott \u00e1llapottal rendelkez\u0151 mikroszolg\u00e1ltat\u00e1sok sz\u00e1m\u00e1ra be\u00e1ll\u00edtott alap\u00e9rtelmezett topol\u00f3gia a folyamok p\u00e9ld\u00e1nyaiban. K\u00e9rj\u00fck, vegye figyelembe: itt egy t\u00e1rol\u00f3 is tal\u00e1lhat\u00f3, amely a tervez\u00e9si metainform\u00e1ci\u00f3kat tartalmazza. <\/i><\/p>\n<p>Ezzel az \u00faj megk\u00f6zel\u00edt\u00e9ssel az \u00fcgyn\u00f6k\u00f6k \u00fczeneteket \u00e1ll\u00edtanak el\u0151, amelyeket az alap t\u00e9ma fel\u00e9 tov\u00e1bb\u00edtanak, m\u00edg a fogyaszt\u00f3k \u2013 mondjuk egy \u00e9rtes\u00edt\u00e9si szolg\u00e1ltat\u00e1s \u2013 a sz\u00e1m\u00edtott megosztott \u00e1llapotot egy kimeneti t\u00e9m\u00e1n kereszt\u00fcl fogadj\u00e1k.<\/p>\n<p><img decoding=\"async\" alt=\"Nem csak feldolgoz\u00e1s: Hogyan alak\u00edtottuk a Kafka Streams-t elosztott adatb\u00e1ziss\u00e1, \u00e9s mi lett az eredm\u00e9nye\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>3. \u00e1bra: \u00faj p\u00e9lda feladatfolyamra a megosztott mikroszolg\u00e1ltat\u00e1sok forgat\u00f3k\u00f6nyv\u00e9hez: 1) az \u00fcgyn\u00f6k egy \u00fczenetet gener\u00e1l, amely a Kafka alap t\u00e9m\u00e1j\u00e1ba \u00e9rkezik; 2) a megosztott \u00e1llapot\u00fa mikroszolg\u00e1ltat\u00e1s (Kafka Streams-t haszn\u00e1lva) feldolgozza azt, \u00e9s a sz\u00e1m\u00edtott \u00e1llapotot egy v\u00e9gs\u0151 Kafka t\u00e9m\u00e1ba r\u00f6gz\u00edti; ezut\u00e1n 3) a fogyaszt\u00f3k megkapj\u00e1k az \u00faj \u00e1llapotot.<\/i><\/p>\n<p><b>H\u00e9, ez az be\u00e9p\u00edtett kulcs-\u00e9rt\u00e9k t\u00e1rol\u00f3 t\u00e9nyleg nagyon hasznos!<\/b><\/p>\n<p>Ahogy kor\u00e1bban eml\u00edtett\u00fck, a megosztott \u00e1llapottal rendelkez\u0151 topol\u00f3gi\u00e1nk tartalmaz egy kulcs-\u00e9rt\u00e9k t\u00e1rol\u00f3t. T\u00f6bb felhaszn\u00e1l\u00e1si m\u00f3dot tal\u00e1ltunk, \u00e9s ezek k\u00f6z\u00fcl kett\u0151t az al\u00e1bbiakban mutatunk be.<\/p>\n<p><i><b>1. lehet\u0151s\u00e9g: kulcs-\u00e9rt\u00e9k t\u00e1rol\u00f3 haszn\u00e1lata a sz\u00e1m\u00edt\u00e1sok sor\u00e1n<\/b><\/i><\/p>\n<p>Els\u0151 kulcs-\u00e9rt\u00e9k t\u00e1rol\u00f3nk olyan seg\u00e9dadatokat tartalmazott, amelyek a sz\u00e1m\u00edt\u00e1sainkhoz sz\u00fcks\u00e9gesek voltak. P\u00e9ld\u00e1ul bizonyos esetekben a megosztott \u00e1llapot a \u201eszavazatok t\u00f6bbs\u00e9ge\u201d elv\u00e9n alapult. A t\u00e1rol\u00f3ban minden \u00fcgyn\u00f6k legut\u00f3bbi \u00e1llapotjelent\u00e9seit t\u00e1rolhattuk egy adott objektumr\u00f3l. \u00cdgy amikor egy \u00faj \u00e1llapotjelent\u00e9st kaptunk b\u00e1rmelyik \u00fcgyn\u00f6kt\u0151l, elmenthett\u00fck azt, kib\u0151v\u00edthett\u00fck a t\u00e1rol\u00f3b\u00f3l az \u00f6sszes t\u00f6bbi \u00fcgyn\u00f6k jelent\u00e9s\u00e9t ugyanarr\u00f3l az objektumr\u00f3l, \u00e9s megism\u00e9telhett\u00fck a sz\u00e1m\u00edt\u00e1st.<br \/>\nAz al\u00e1bbi 4. \u00e1br\u00e1n l\u00e1that\u00f3, hogyan nyitottuk meg a hozz\u00e1f\u00e9r\u00e9st a kulcs-\u00e9rt\u00e9k t\u00e1rol\u00f3hoz a feldolgoz\u00f3 met\u00f3dus sz\u00e1m\u00e1ra, hogy ezut\u00e1n \u00faj \u00fczeneteket tudjunk feldolgozni.<\/p>\n<p><img decoding=\"async\" alt=\"Nem csak feldolgoz\u00e1s: Hogyan alak\u00edtottuk a Kafka Streams-t elosztott adatb\u00e1ziss\u00e1, \u00e9s mi lett az eredm\u00e9nye\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>4. \u00e1bra: a kulcs-\u00e9rt\u00e9k t\u00e1rol\u00f3 hozz\u00e1f\u00e9r\u00e9s\u00e9nek megnyit\u00e1sa a feldolgoz\u00f3 met\u00f3dus sz\u00e1m\u00e1ra (ezut\u00e1n minden, a megosztott \u00e1llapotot kezel\u0151 szcen\u00e1ri\u00f3ban implement\u00e1lni kell a met\u00f3dust <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Alternat\u00edva #2: CRUD API l\u00e9trehoz\u00e1sa a Kafka Streams felett<\/b><\/i><\/p>\n<p>Alapvet\u0151 feladatfolyamunk be\u00e1ll\u00edt\u00e1sa ut\u00e1n megpr\u00f3b\u00e1ltunk egy RESTful CRUD API-t \u00edrni megosztott \u00e1llapot\u00fa mikroszolg\u00e1ltat\u00e1saink sz\u00e1m\u00e1ra. Szerett\u00fck volna, hogy lehessen \u00e1llapotot lek\u00e9rni bizonyos vagy minden objektumr\u00f3l, valamint be\u00e1ll\u00edtani vagy elt\u00e1vol\u00edtani az objektum \u00e1llapot\u00e1t (ez hasznos a backend t\u00e1mogat\u00e1sa sor\u00e1n).<\/p>\n<p>Minden Get State API t\u00e1mogat\u00e1s\u00e1hoz, amikor \u00fajra kellett sz\u00e1molni az \u00e1llapotot a feldolgoz\u00e1s sor\u00e1n, hossz\u00fa id\u0151re elmentett\u00fck azt a be\u00e9p\u00edtett kulcs-\u00e9rt\u00e9k t\u00e1rol\u00f3ba. \u00cdgy elegend\u0151 volt egyetlen p\u00e9ld\u00e1ny Kafka Streams seg\u00edts\u00e9g\u00e9vel implement\u00e1lni egy ilyen API-t, ahogyan az al\u00e1bbi list\u00e1z\u00e1sban l\u00e1that\u00f3:<\/p>\n<p><img decoding=\"async\" alt=\"Nem csak feldolgoz\u00e1s: Hogyan alak\u00edtottuk a Kafka Streams-t elosztott adatb\u00e1ziss\u00e1, \u00e9s mi lett az eredm\u00e9nye\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>5. \u00e1bra: a be\u00e9p\u00edtett kulcs-\u00e9rt\u00e9k t\u00e1rol\u00f3 haszn\u00e1lata az el\u0151re sz\u00e1molt objektum \u00e1llapot\u00e1nak lek\u00e9r\u00e9s\u00e9re <\/i><\/p>\n<p>Az objektum \u00e1llapot\u00e1nak friss\u00edt\u00e9se API-n kereszt\u00fcl szint\u00e9n egyszer\u0171en megval\u00f3s\u00edthat\u00f3. Alapvet\u0151en ehhez csak egy Kafka termel\u0151t kell l\u00e9trehozni, amelyen kereszt\u00fcl egy \u00faj \u00e1llapotot tartalmaz\u00f3 bejegyz\u00e9st hozunk l\u00e9tre. Ezzel garant\u00e1lva van, hogy minden API-n kereszt\u00fcl gener\u00e1lt \u00fczenetet pontosan ugyan\u00fagy dolgoznak fel, mint a t\u00f6bbi termel\u0151t\u0151l (pl. \u00fcgyn\u00f6k\u00f6kt\u0151l) \u00e9rkez\u0151 \u00fczenetek.<\/p>\n<p><img decoding=\"async\" alt=\"Nem csak feldolgoz\u00e1s: Hogyan alak\u00edtottuk a Kafka Streams-t elosztott adatb\u00e1ziss\u00e1, \u00e9s mi lett az eredm\u00e9nye\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>6. \u00e1bra: az objektum \u00e1llapot\u00e1t a Kafka termel\u0151 seg\u00edts\u00e9g\u00e9vel lehet be\u00e1ll\u00edtani <\/i><\/p>\n<p><b>Egy kis bonyodalom: a Kafka-nak sok part\u00edci\u00f3ja van<\/b><\/p>\n<p>A k\u00f6vetkez\u0151 l\u00e9p\u00e9sben szeretn\u00e9nk elosztani a feldolgoz\u00e1ssal j\u00e1r\u00f3 terhel\u00e9st, \u00e9s jav\u00edtani a rendelkez\u00e9sre \u00e1ll\u00e1st, minden forgat\u00f3k\u00f6nyvh\u00f6z l\u00e9trehozva egy megosztott \u00e1llapottal rendelkez\u0151 mikroszolg\u00e1ltat\u00e1s klasztert. A be\u00e1ll\u00edt\u00e1s sz\u00e1munkra rendk\u00edv\u00fcl egyszer\u0171en ment: miut\u00e1n konfigur\u00e1ltuk az \u00f6sszes p\u00e9ld\u00e1nyt \u00fagy, hogy ugyanazzal az alkalmaz\u00e1sazonos\u00edt\u00f3val (\u00e9s azonos kezdeti bet\u00f6lt\u0151 szerverekkel) m\u0171k\u00f6djenek, gyakorlatilag minden m\u00e1s automatikusan t\u00f6rt\u00e9nt. Azt is meghat\u00e1roztuk, hogy minden forr\u00e1sverem t\u00f6bb part\u00edci\u00f3b\u00f3l \u00e1ll, \u00edgy minden p\u00e9ld\u00e1nyhoz rendelhet\u0151 egy r\u00e9szhalmaza ezeknek a part\u00edci\u00f3knak.<\/p>\n<p>Tov\u00e1bb\u00e1 megeml\u00edtem, hogy itt szok\u00e1s az \u00e1llapot t\u00e1rol\u00e1s\u00e1nak biztons\u00e1gi ment\u00e9se, hogy p\u00e9ld\u00e1ul hiba eset\u00e9n ezt a m\u00e1solatot egy m\u00e1sik p\u00e9ld\u00e1nyra \u00e1thelyezz\u00fck. Minden egyes \u00e1llapot t\u00e1rol\u00f3nak a Kafka Streams-ben replik\u00e1lhat\u00f3 verem j\u00f6n l\u00e9tre, amely a v\u00e1ltoz\u00e1sok napl\u00f3j\u00e1t tartalmazza (ami a helyi friss\u00edt\u00e9seket k\u00f6veti). \u00cdgy a Kafka folyamatosan biztos\u00edtja az \u00e1llapot t\u00e1rol\u00f3t. Ez\u00e9rt ha az egyik p\u00e9ld\u00e1ny hib\u00e1t \u00e9szlel, a Kafka Streams \u00e1llapot t\u00e1rol\u00f3ja gyorsan helyre\u00e1ll\u00edthat\u00f3 egy m\u00e1sik p\u00e9ld\u00e1nyon, ahov\u00e1 a megfelel\u0151 part\u00edci\u00f3k ker\u00fclnek. Tesztjeink alapj\u00e1n ez n\u00e9h\u00e1ny m\u00e1sodpercen bel\u00fcl megval\u00f3sul, m\u00e9g akkor is, ha az \u00e1llapot t\u00e1rol\u00f3ban milli\u00f3 bejegyz\u00e9s van.<\/p>\n<p>A megosztott \u00e1llapot\u00fa mikroszolg\u00e1ltat\u00e1sb\u00f3l a mikroszolg\u00e1ltat\u00e1sok klaszter\u00e9hez val\u00f3 \u00e1tmenet nem olyan trivi\u00e1lis a Get State API megval\u00f3s\u00edt\u00e1s\u00e1ban. Az \u00faj helyzetben minden mikroszolg\u00e1ltat\u00e1s \u00e1llapot t\u00e1rol\u00f3j\u00e1ban csak a teljes t\u00e9rk\u00e9p egy r\u00e9sze tal\u00e1lhat\u00f3 (azok az objektumok, amelyek kulcsai egy adott part\u00edci\u00f3ra vonatkoznak). Meg kellett hat\u00e1roznunk, hogy melyik p\u00e9ld\u00e1nyon tal\u00e1lhat\u00f3 a keresett objektum \u00e1llapota, \u00e9s ezt az adatfolyamok metaadatai alapj\u00e1n tett\u00fck, ahogyan az al\u00e1bb l\u00e1that\u00f3:<\/p>\n<p><img decoding=\"async\" alt=\"Nem csak feldolgoz\u00e1s: Hogyan alak\u00edtottuk a Kafka Streams-t elosztott adatb\u00e1ziss\u00e1, \u00e9s mi lett az eredm\u00e9nye\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>7. \u00e1bra: az adatfolyamok metaadatai seg\u00edts\u00e9g\u00e9vel meghat\u00e1rozzuk, hogy melyik p\u00e9ld\u00e1nyt\u00f3l k\u00e9rdezz\u00fck le a keresett objektum \u00e1llapot\u00e1t; hasonl\u00f3 megk\u00f6zel\u00edt\u00e9st alkalmaztunk a GET ALL API-n\u00e1l<\/i><\/p>\n<p><b>F\u0151bb meg\u00e1llap\u00edt\u00e1sok<\/b><\/p>\n<p>A Kafka Streams \u00e1llapot t\u00e1rol\u00f3i de facto elosztott adatb\u00e1zisk\u00e9nt szolg\u00e1lhatnak, <\/p>\n<ul>\n<li>folyamatosan replik\u00e1lva a Kafka-ban<\/li>\n<li>Ezekre a rendszerekre k\u00f6nnyen fel\u00e9p\u00edthet\u0151 a CRUD API <\/li>\n<li>T\u00f6bb part\u00edci\u00f3 kezel\u00e9se azonban kicsit bonyolultabb lesz <\/li>\n<li>Lehet\u0151s\u00e9g van egy vagy t\u00f6bb \u00e1llapot t\u00e1rol\u00f3 hozz\u00e1ad\u00e1s\u00e1ra a stream topol\u00f3gi\u00e1hoz, amely seg\u00e9dadatok t\u00e1rol\u00e1s\u00e1ra szolg\u00e1l. Ez a megold\u00e1s a k\u00f6vetkez\u0151 esetekben haszn\u00e1lhat\u00f3:<\/li>\n<li>Hossz\u00fa t\u00e1v\u00fa adatok t\u00e1rol\u00e1sa, amelyek sz\u00fcks\u00e9gesek a stream feldolgoz\u00e1s sor\u00e1n v\u00e9gzett sz\u00e1m\u00edt\u00e1sokhoz <\/li>\n<li>Hossz\u00fa t\u00e1v\u00fa adatok t\u00e1rol\u00e1sa, amelyek hasznosak lehetnek a stream p\u00e9ld\u00e1ny k\u00f6vetkez\u0151 inicializ\u00e1l\u00e1sakor <\/li>\n<li>sok m\u00e1sra...<\/li>\n<\/ul>\n<p>Ezeknek \u00e9s m\u00e1s el\u0151ny\u00f6knek k\u00f6sz\u00f6nhet\u0151en a Kafka Streams kiv\u00e1l\u00f3an alkalmas a glob\u00e1lis \u00e1llapot t\u00e1mogat\u00e1s\u00e1ra egy olyan elosztott rendszerben, mint amilyen a mi\u00e9nk. A Kafka Streams a termel\u00e9s sor\u00e1n meglehet\u0151sen megb\u00edzhat\u00f3nak bizonyult (az\u00f3ta, hogy bevezett\u00fck, gyakorlatilag nem vesz\u00edtett\u00fcnk el \u00fczeneteket), \u00e9s biztosak vagyunk benne, hogy a lehet\u0151s\u00e9gei ezzel nem mer\u00fclnek ki!<br \/>\n<br \/>Forr\u00e1s: <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\/hu\/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=\"hu_HU\" \/>\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\/hu\/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\udd47Nemcsak feldolgoz\u00e1s: Hogyan alak\u00edtottuk a Kafka Streams-t egy elosztott adatb\u00e1ziss\u00e1, \u00e9s mi t\u00f6rt\u00e9nt ebb\u0151l | ProHoster","description":"Hell\u00f3, Habr! Eml\u00e9keztet\u00fcnk, hogy a Kafka k\u00f6nyv\u00fcnk ut\u00e1n megjelent egy legal\u00e1bb ennyire \u00e9rdekes munka a k\u00f6nyvt\u00e1rr\u00f3l,","canonical_url":"https:\/\/prohoster.info\/hu\/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":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}