{"id":35786,"date":"2019-10-31T22:06:19","date_gmt":"2019-10-31T19:06:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\/"},"modified":"2019-10-31T22:06:19","modified_gmt":"2019-10-31T19:06:19","slug":"kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","title":{"rendered":"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/457756\/\"><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/6f8bd2b31b87b0c760c1148515893c43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex> Hell\u00f3, Habr-lak\u00f3k! Ez a k\u00f6nyv b\u00e1rmely fejleszt\u0151 sz\u00e1m\u00e1ra hasznos lesz, aki szeretn\u00e9 meg\u00e9rteni az \u00e1raml\u00e1s alap\u00fa feldolgoz\u00e1st. A elosztott programoz\u00e1s meg\u00e9rt\u00e9se seg\u00edt jobban megismerni a Kafka-t \u00e9s a Kafka Streams-t. J\u00f3 lenne ismerni a Kafka keretrendszert is, de nem k\u00f6telez\u0151: minden sz\u00fcks\u00e9ges inform\u00e1ci\u00f3t el fogok mondani. A tapasztalt Kafka fejleszt\u0151k \u00e9s az \u00fajoncok is, ennek a k\u00f6nyvnek k\u00f6sz\u00f6nhet\u0151en, \u00e9rdekes \u00e1raml\u00e1sfeldolgoz\u00f3 alkalmaz\u00e1sokat hozhatnak l\u00e9tre a Kafka Streams k\u00f6nyvt\u00e1rral. A Java fejleszt\u0151k, akik m\u00e1r ismerik az olyan fogalmakat, mint a soros\u00edt\u00e1s, elsaj\u00e1t\u00edtj\u00e1k, hogyan alkalmazz\u00e1k tud\u00e1sukat a Kafka Streams alkalmaz\u00e1sok l\u00e9trehoz\u00e1s\u00e1ra. A k\u00f6nyv forr\u00e1sk\u00f3dja Java 8 nyelven \u00edr\u00f3dott, \u00e9s jelent\u0151sen haszn\u00e1lja a Java 8 lambda kifejez\u00e9seit, \u00edgy \u00e9rdemes a lambda funkci\u00f3k haszn\u00e1lat\u00e1t (m\u00e9g m\u00e1s programoz\u00e1si nyelven is) megtanulni.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>R\u00e9szlet. 5.3. Aggreg\u00e1l\u00e1s \u00e9s ablakos m\u0171veletek<\/h3>\n<p>\nEbben a r\u00e9szben a Kafka Streams leg\u00edg\u00e9retesebb r\u00e9szeinek a megismer\u00e9s\u00e9nek szentelj\u00fck magunkat. Eddig a k\u00f6vetkez\u0151 Kafka Streams-aspektusokat vizsg\u00e1ltuk:<\/p>\n<ul>\n<li>feldolgoz\u00e1si topol\u00f3gia l\u00e9trehoz\u00e1sa;<\/li>\n<li>\u00e1llapot haszn\u00e1lata az \u00e1raml\u00e1s alap\u00fa alkalmaz\u00e1sokban;<\/li>\n<li>adatfolyamok \u00f6sszevon\u00e1sa;<\/li>\n<li>k\u00fcl\u00f6nbs\u00e9gek az esem\u00e9nyfolyamok (KStream) \u00e9s a friss\u00edt\u00e9si folyamok (KTable) k\u00f6z\u00f6tt.<\/li>\n<\/ul>\n<p>\nA k\u00f6vetkez\u0151 p\u00e9ld\u00e1kban ezeket az elemeket egyes\u00edtj\u00fck. Ezen k\u00edv\u00fcl megismerkedhet az ablakos m\u0171veletekkel \u2013 egy \u00fajabb nagyszer\u0171 lehet\u0151s\u00e9ggel az \u00e1raml\u00e1s alap\u00fa alkalmaz\u00e1sok sz\u00e1m\u00e1ra. Az els\u0151 p\u00e9ld\u00e1nk egy egyszer\u0171 aggreg\u00e1l\u00e1s lesz.<\/p>\n<h3>5.3.1. Az ipar\u00e1gak szektorai k\u00f6z\u00f6tti r\u00e9szv\u00e9nykereskedelmi aggreg\u00e1l\u00e1s<\/h3>\n<p>\nAz aggreg\u00e1l\u00e1s \u00e9s csoportos\u00edt\u00e1s \u00e9letfontoss\u00e1g\u00fa eszk\u00f6z\u00f6k az \u00e1raml\u00e1s alap\u00fa adatok kezel\u00e9s\u00e9ben. Az egyedi rekordok nyomon k\u00f6vet\u00e9se gyakran nem elegend\u0151. A tov\u00e1bbi inform\u00e1ci\u00f3k kinyer\u00e9s\u00e9hez sz\u00fcks\u00e9ges az adatok csoportos\u00edt\u00e1sa \u00e9s kombin\u00e1l\u00e1sa.<\/p>\n<p>Ebben a p\u00e9ld\u00e1ban \u00e1t fogja \u00e9lni egy intranap keresked\u0151 szerep\u00e9t, akinek nyomon kell k\u00f6vetnie a r\u00e9szv\u00e9nyek forgalm\u00e1t t\u00f6bb ipar\u00e1gban. Kifejezetten \u00f6t olyan c\u00e9g \u00e9rdekel, amelyek a legmagasabb r\u00e9szv\u00e9nyforgalommal rendelkeznek minden egyes ipar\u00e1gban.<\/p>\n<p>Ehhez az aggreg\u00e1l\u00e1shoz t\u00f6bb l\u00e9p\u00e9st kell v\u00e9grehajtanunk az adatok sz\u00fcks\u00e9ges form\u00e1ra alak\u00edt\u00e1s\u00e1hoz (\u00e1ltal\u00e1nos \u00e9rtelemben sz\u00f3lva).<\/p>\n<ol>\n<li>Hozzon l\u00e9tre egy forr\u00e1st a t\u00e9ma alapj\u00e1n, amely nyers inform\u00e1ci\u00f3kat publik\u00e1l a r\u00e9szv\u00e9nykereskedelemr\u0151l. \u00c1t kell alak\u00edtanunk a StockTransaction t\u00edpust ShareVolume t\u00edpus\u00fav\u00e1. Az\u00e9rt, mert a StockTransaction objektum tartalmazza az elad\u00e1sok metaadatait, nek\u00fcnk csak a eladott r\u00e9szv\u00e9nyek sz\u00e1madataira van sz\u00fcks\u00e9g\u00fcnk.<\/li>\n<li>Csoportos\u00edtsa a ShareVolume adatokat a r\u00e9szv\u00e9nyek szimb\u00f3lumai szerint. A szimb\u00f3lumok szerinti csoportos\u00edt\u00e1s ut\u00e1n ezeket az adatokat az r\u00e9szv\u00e9nyek elad\u00e1si mennyis\u00e9geinek k\u00f6zbens\u0151 \u00f6sszegeiv\u00e9 tudjuk s\u0171r\u00edteni. \u00c9rdemes megjegyezni, hogy a KStream.groupBy met\u00f3dus egy KGroupedStream p\u00e9ld\u00e1nyt ad vissza. A KTable p\u00e9ld\u00e1nyt a KGroupedStream.reduce met\u00f3dus\u00e1nak h\u00edv\u00e1s\u00e1val kaphatjuk meg.<\/li>\n<\/ol>\n<p><\/p>\n<blockquote><p><b>Mi az a KGroupedStream interf\u00e9sz<\/b><\/p>\n<p>A KStream.groupBy \u00e9s a KStream.groupByKey met\u00f3dusok egy KGroupedStream p\u00e9ld\u00e1nyt adnak vissza. A KGroupedStream az esem\u00e9nyfolyam k\u00f6zbens\u0151 reprezent\u00e1ci\u00f3ja a kulcsok szerinti csoportos\u00edt\u00e1s ut\u00e1n. Nem arra k\u00e9sz\u00fclt, hogy k\u00f6zvetlen\u00fcl dolgozzunk vele. Ehelyett a KGroupedStream-et aggreg\u00e1l\u00f3 m\u0171veletekhez haszn\u00e1lj\u00e1k, amelyek eredm\u00e9nye mindig KTable. Mivel az aggreg\u00e1l\u00f3 m\u0171veletek eredm\u00e9nye KTable, \u00e9s ezekben \u00e1llapot-t\u00e1rol\u00f3 alkalmaz\u00e1sra ker\u00fcl sor, lehet, hogy nem minden friss\u00edt\u00e9s jut tov\u00e1bb a cs\u0151vezet\u00e9kben.<\/p>\n<p>A KTable.groupBy met\u00f3dus egy hasonl\u00f3 KGroupedTable-t ad vissza \u2014 a friss\u00edt\u00e9sek kulcs szerinti \u00fajracsoportos\u00edtott esem\u00e9nyfolyam\u00e1nak k\u00f6zbens\u0151 reprezent\u00e1ci\u00f3ja.<\/p><\/blockquote>\n<p>\nTartsunk egy kis sz\u00fcnetet, \u00e9s n\u00e9zz\u00fck meg az 5.9. \u00e1br\u00e1t, amely megmutatja, amit eddig el\u00e9rt\u00fcnk. Ez a topol\u00f3gia m\u00e1r ismer\u0151snek kell lennie a sz\u00e1modra.<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/9fd61317cde376362adcaeec72908919.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMost n\u00e9zz\u00fck meg a k\u00f3dot ehhez a topol\u00f3gi\u00e1hoz (megtal\u00e1lhat\u00f3 a src\/main\/java\/bbejeck\/chapter_5\/AggregationsAndReducingExample.java f\u00e1jlban) (5.2. lista).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/f937287e448295fbd467c283ceca316a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA megadott k\u00f3d t\u00f6m\u00f6r \u00e9s sz\u00e1mos l\u00e9p\u00e9st hajt v\u00e9gre n\u00e9h\u00e1ny sorban. A builder.stream met\u00f3dus els\u0151 param\u00e9ter\u00e9ben \u00e9szreveheted a sz\u00e1modra \u00faj dolgot: az AutoOffsetReset.EARLIEST enumer\u00e1lt t\u00edpus \u00e9rt\u00e9k\u00e9t (l\u00e9tezik m\u00e9g a LATEST is), amelyet a Consumed.withOffsetResetPolicy met\u00f3dussal adunk meg. Ezen enumer\u00e1lt t\u00edpus seg\u00edts\u00e9g\u00e9vel megadhatod az eltol\u00e1sok vissza\u00e1ll\u00edt\u00e1s\u00e1nak strat\u00e9gi\u00e1j\u00e1t minden KStream vagy KTable eset\u00e9ben, \u00e9s ez priorit\u00e1st \u00e9lvez a konfigur\u00e1ci\u00f3s eltol\u00e1s vissza\u00e1ll\u00edt\u00e1si param\u00e9ter\u00e9vel szemben.<\/p>\n<blockquote><p><b>GroupByKey \u00e9s GroupBy<\/b><\/p>\n<p>A KStream interf\u00e9szen k\u00e9t m\u00f3dszer tal\u00e1lhat\u00f3 a rekordok csoportos\u00edt\u00e1s\u00e1ra: a GroupByKey \u00e9s a GroupBy. Mindkett\u0151 KGroupedTable-t ad vissza, \u00edgy feltehet\u0151 a k\u00e9rd\u00e9s: mi a k\u00fcl\u00f6nbs\u00e9g k\u00f6z\u00f6tt\u00fck \u00e9s mikor haszn\u00e1ljuk melyiket?<\/p>\n<p>A GroupByKey m\u00f3dszert alkalmazzuk, amikor a KStream kulcsai m\u00e1r nem \u00fcresek. R\u00e1ad\u00e1sul a 'rekeszel\u00e9s \u00fajraig\u00e9nyl\u00e9se' jelz\u0151 sosem volt be\u00e1ll\u00edtva.<\/p>\n<p>A GroupBy m\u00f3dszer azt felt\u00e9telezi, hogy a csoportos\u00edt\u00e1shoz megv\u00e1ltoztattad a kulcsokat, \u00edgy a rekeszel\u00e9s \u00fajraig\u00e9nyl\u00e9s\u00e9nek jelz\u0151je true-ra van \u00e1ll\u00edtva. A GroupBy ut\u00e1n v\u00e9grehajtott m\u0171veletek, mint pl. \u00f6sszekapcsol\u00e1s, aggreg\u00e1l\u00e1s stb., automatikusan \u00fajb\u00f3li rekeszel\u00e9st eredm\u00e9nyeznek.<br \/>\n\u00d6sszegz\u00e9s: a lehet\u0151 legkisebb alkalommal haszn\u00e1ljuk a GroupByKey-t a GroupBy helyett.<\/p><\/blockquote>\n<p>\nA mapValues \u00e9s groupBy m\u00f3dszerek maguk\u00e9rt besz\u00e9lnek, n\u00e9zz\u00fck meg most a sum() met\u00f3dust (a src\/main\/java\/bbejeck\/model\/ShareVolume.java f\u00e1jlban tal\u00e1lhat\u00f3) (5.3. listing).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/8e9a6f873594f9b5fef9a96c42353a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA ShareVolume.sum visszaadja a r\u00e9szv\u00e9nyek forgalm\u00e1nak k\u00f6ztes \u00f6sszeg\u00e9t, m\u00edg az \u00f6sszes sz\u00e1m\u00edt\u00e1si l\u00e1nc eredm\u00e9nye egy KTable objektumot k\u00e9pvisel. Most m\u00e1r \u00e9rthet\u0151, hogy a KTable milyen szerepet j\u00e1tszik. Amikor a ShareVolume objektumok be\u00e9rkeznek, a megfelel\u0151 KTable objektumban t\u00e1rol\u00f3dik az utols\u00f3 friss\u00edt\u00e9s. Fontos ne felejts\u00fck el, hogy a friss\u00edt\u00e9sek mindegyike t\u00fckr\u00f6z\u0151dik a kor\u00e1bbi shareVolumeKTable-ben, de nem minden ker\u00fcl tov\u00e1bbk\u00fcld\u00e9sre.<\/p>\n<p>Ezt k\u00f6vet\u0151en ezzel a KTable-lal aggreg\u00e1l\u00e1st v\u00e9gz\u00fcnk (a r\u00e9szv\u00e9nyek elad\u00e1s\u00e1nak mennyis\u00e9ge szerint), hogy megkapjunk \u00f6t olyan v\u00e1llalatot, amelyek a legnagyobb r\u00e9szv\u00e9nykereskedelemmel rendelkeznek minden ipar\u00e1gban. Tev\u00e9kenys\u00e9geink a legels\u0151 aggreg\u00e1l\u00e1shoz hasonl\u00f3ak lesznek.<\/p>\n<ol>\n<li>Tov\u00e1bbra is hajtsunk v\u00e9gre egy \u00fajabb groupBy m\u0171veletet egyes ShareVolume objektumok ipar\u00e1gak szerinti csoportos\u00edt\u00e1s\u00e1ra.<\/li>\n<li>Foglalkozzunk a ShareVolume objektumok \u00f6sszes\u00edt\u00e9s\u00e9vel. Ez\u00fattal az aggreg\u00e1l\u00f3 objektum egy fix m\u00e9ret\u0171 priorit\u00e1s\u00fa sor. Ebben a fix m\u00e9ret\u0171 sorban csak az \u00f6t legnagyobb eladott r\u00e9szv\u00e9nysz\u00e1m\u00fa c\u00e9g t\u00e1rol\u00f3dik.<\/li>\n<li>Jelezz\u00fck a kor\u00e1bbi pontb\u00f3l sz\u00e1rmaz\u00f3 sorokat sztring \u00e9rt\u00e9kk\u00e9nt, \u00e9s adjuk vissza az \u00f6t legjobban eladott c\u00e9g r\u00e9szv\u00e9nyek sz\u00e1ma szerint az ipar\u00e1gak szerint.<\/li>\n<li>\u00cdrjuk bele az eredm\u00e9nyeket sztring form\u00e1tumban a t\u00e9m\u00e1ba.<\/li>\n<\/ol>\n<p>\nA 5.10. \u00e1bra a bej\u00f6v\u0151 adatok \u00e1raml\u00e1s\u00e1nak topol\u00f3gi\u00e1j\u00e1t mutatja. Ahogy l\u00e1tod, a m\u00e1sodik feldolgoz\u00e1si k\u00f6r el\u00e9g egyszer\u0171.<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/dabd1507eee267038edb7f8d76d8d8ae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMost m\u00e1r, vil\u00e1gosan meg\u00e9rtve a m\u00e1sodik feldolgoz\u00e1si k\u00f6r fel\u00e9p\u00edt\u00e9s\u00e9t, \u00e1tt\u00e9rhet\u00fcnk az alapk\u00f3dj\u00e1ra (a f\u00e1jlban tal\u00e1lja: src\/main\/java\/bbejeck\/chapter_5\/AggregationsAndReducingExample.java) (5.4. lista).<\/p>\n<p>Ebben az inicializ\u00e1l\u00f3ban van egy fixedQueue v\u00e1ltoz\u00f3. Ez egy felhaszn\u00e1l\u00f3i objektum \u2014 adapter a java.util.TreeSet-hez, amely az N legnagyobb eredm\u00e9ny nyomon k\u00f6vet\u00e9s\u00e9re szolg\u00e1l, cs\u00f6kken\u0151 sorrendben a sold r\u00e9szv\u00e9nyek sz\u00e1ma szerint.<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/488b072b0d91b81c925ca72291e69e48.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nM\u00e1r tal\u00e1lkozt\u00e1l a groupBy \u00e9s mapValues h\u00edv\u00e1sokkal, ez\u00e9rt nem \u00e1llunk meg n\u00e1luk (a KTable.toStream met\u00f3dust h\u00edvjuk, mivel a KTable.print met\u00f3dus elavult). De m\u00e9g nem l\u00e1tt\u00e1l KTable-verzi\u00f3t az aggregate() met\u00f3dusb\u00f3l, \u00edgy egy kicsi id\u0151t sz\u00e1nunk a megvitat\u00e1s\u00e1ra.<\/p>\n<p>Ahogy eml\u00e9kszel, a KTable-t az jellemzi, hogy az azonos kulcs\u00fa rekordokat friss\u00edt\u00e9seknek tekinti. A KTable lecser\u00e9li a r\u00e9gi rekordot az \u00fajra. Az aggreg\u00e1l\u00e1s hasonl\u00f3 m\u00f3don t\u00f6rt\u00e9nik: az utols\u00f3 azonos kulcs\u00fa rekordok aggreg\u00e1l\u00f3dnak. Amikor egy \u00faj rekord \u00e9rkezik, hozz\u00e1ad\u00f3dik a FixedSizePriorityQueue p\u00e9ld\u00e1nyhoz a szumm\u00e1z\u00f3 (a m\u00e1sodik param\u00e9ter az aggregate h\u00edv\u00e1s\u00e1ban), de ha m\u00e1r l\u00e9tezik egy m\u00e1sik rekord ugyanezzel a kulccsal, akkor a r\u00e9gi rekordot elt\u00e1vol\u00edtja a kivon\u00f3 (a harmadik param\u00e9ter az aggregate h\u00edv\u00e1s\u00e1ban).<\/p>\n<p>Ez mindent jelent, hogy az aggreg\u00e1torunk, a FixedSizePriorityQueue, val\u00f3j\u00e1ban nem aggreg\u00e1lja az azonos kulcs\u00fa \u00e9rt\u00e9keket, hanem t\u00e1rolja a legjobban eladott r\u00e9szv\u00e9nyek N legmagasabb mennyis\u00e9g\u00e9nek cs\u00fasz\u00f3 \u00f6sszeg\u00e9t. Minden egyes \u00e9rkez\u0151 rekord tartalmazza az eddig eladott r\u00e9szv\u00e9nyek \u00f6sszes\u00edtett sz\u00e1m\u00e1t. A KTable inform\u00e1ci\u00f3t ad arr\u00f3l, hogy mely c\u00e9gek r\u00e9szv\u00e9nyeit adj\u00e1k el a legjobban, a cs\u00fasz\u00f3 aggreg\u00e1l\u00e1sra pedig minden friss\u00edt\u00e9sn\u00e9l nincs sz\u00fcks\u00e9g.<\/p>\n<p>K\u00e9t fontos dolgot tanultunk meg:<\/p>\n<ul>\n<li>\u00e9rt\u00e9kek csoportos\u00edt\u00e1sa a KTable-ban a k\u00f6z\u00f6s kulcsuk szerint;<\/li>\n<li>hasznos m\u0171veletek v\u00e9grehajt\u00e1sa ezeken a csoportos\u00edtott \u00e9rt\u00e9keken, mint p\u00e9ld\u00e1ul az \u00f6sszegz\u00e9s \u00e9s az aggreg\u00e1l\u00e1s.<\/li>\n<\/ul>\n<p>\nEzeknek a m\u0171veleteknek a v\u00e9grehajt\u00e1s\u00e1nak k\u00e9pess\u00e9ge fontos a Kafka Streams alkalmaz\u00e1son \u00e1t\u00e1raml\u00f3 adatok \u00e9rtelm\u00e9nek meg\u00e9rt\u00e9s\u00e9hez \u00e9s annak kider\u00edt\u00e9s\u00e9hez, hogy milyen inform\u00e1ci\u00f3kat hordoznak.<\/p>\n<p>\u00d6sszekapcsoltuk a k\u00f6nyv kor\u00e1bban t\u00e1rgyalt n\u00e9h\u00e1ny kulcsfogalm\u00e1t. A 4. fejezetben arr\u00f3l besz\u00e9lt\u00fcnk, mennyire fontos a hibat\u0171r\u0151, lok\u00e1lis \u00e1llapot a streamel\u0151 alkalmaz\u00e1s sz\u00e1m\u00e1ra. Az ebben a fejezetben bemutatott els\u0151 p\u00e9lda megmutatta, mi\u00e9rt annyira l\u00e9nyeges a lok\u00e1lis \u00e1llapot \u2013 lehet\u0151s\u00e9get biztos\u00edt arra, hogy nyomon k\u00f6vethess\u00fck, milyen inform\u00e1ci\u00f3kat l\u00e1ttunk m\u00e1r. A lok\u00e1lis hozz\u00e1f\u00e9r\u00e9s lehet\u0151v\u00e9 teszi a h\u00e1l\u00f3zati k\u00e9sleltet\u00e9sek elker\u00fcl\u00e9s\u00e9t, \u00edgy az alkalmaz\u00e1s teljes\u00edtm\u00e9nye javul \u00e9s ellen\u00e1ll\u00f3bb\u00e1 v\u00e1lik a hib\u00e1kkal szemben.<\/p>\n<p>B\u00e1rmilyen aggreg\u00e1ci\u00f3s vagy csomagol\u00e1si m\u0171velet v\u00e9grehajt\u00e1sa sor\u00e1n meg kell adni az \u00e1llapot t\u00e1rol\u00f3 nev\u00e9t. Az aggreg\u00e1ci\u00f3s \u00e9s csomagol\u00e1si m\u0171veletek KTable p\u00e9ld\u00e1nyt adnak vissza, a KTable pedig az \u00e1llapot t\u00e1rol\u00f3t haszn\u00e1lja a r\u00e9gi eredm\u00e9nyek \u00fajakkal val\u00f3 helyettes\u00edt\u00e9s\u00e9re. Ahogy l\u00e1ttuk, nem minden friss\u00edt\u00e9s ker\u00fcl tov\u00e1bb a cs\u0151vezet\u00e9kben, \u00e9s ez fontos, mert az aggreg\u00e1l\u00f3 m\u0171veletek c\u00e9lja a v\u00e9gs\u0151 inform\u00e1ci\u00f3k visszanyer\u00e9se. Ha nem alkalmazunk lok\u00e1lis \u00e1llapotot, a KTable minden aggreg\u00e1l\u00f3 \u00e9s csomagol\u00f3 eredm\u00e9nyt tov\u00e1bb\u00edt majd.<\/p>\n<p>Most a konkr\u00e9t id\u0151intervallumokon bel\u00fcli m\u0171veletek, p\u00e9ld\u00e1ul az aggreg\u00e1ci\u00f3k v\u00e9grehajt\u00e1s\u00e1ra fogunk \u00f6sszpontos\u00edtani \u2013 az \u00fagynevezett ablakos m\u0171veletekre.<\/p>\n<h3>5.3.2. Ablakos m\u0171veletek<\/h3>\n<p>\nAz el\u0151z\u0151 r\u00e9szben megismert\u00fck a \u201ecs\u00fasz\u00f3\u201d aggreg\u00e1ci\u00f3t \u00e9s csomagol\u00e1st. Az alkalmaz\u00e1s folyamatosan csomagolta az \u00e9rt\u00e9kpap\u00edrok \u00e9rt\u00e9kes\u00edt\u00e9si volumen\u00e9t, majd aggreg\u00e1lta az \u00f6t legjobban eladott t\u0151zsdei \u00e9rt\u00e9kpap\u00edrt.<\/p>\n<p>N\u00e9ha sz\u00fcks\u00e9g van az ilyen folyamatos aggreg\u00e1ci\u00f3kra \u00e9s csomagol\u00e1sokra. M\u00e1skor csak egy adott id\u0151intervallumra van sz\u00fcks\u00e9g. P\u00e9ld\u00e1ul meg kell sz\u00e1molni, h\u00e1ny t\u0151zsdei tranzakci\u00f3 t\u00f6rt\u00e9nt egy adott c\u00e9g r\u00e9szv\u00e9nyeivel az utols\u00f3 10 percben. Vagy hogy h\u00e1ny felhaszn\u00e1l\u00f3 kattintott az \u00faj hirdet\u00e9si bannerre az utols\u00f3 15 percben. Az alkalmaz\u00e1s ilyen m\u0171veleteket t\u00f6bbsz\u00f6r is v\u00e9grehajthat, de az eredm\u00e9nyek csak az adott id\u0151intervallumokra (id\u0151ablakokra) vonatkoznak.<\/p>\n<h3>A v\u00e1s\u00e1rl\u00f3 szerint sz\u00e1molt t\u0151zsdei tranzakci\u00f3k<\/h3>\n<p>\nA k\u00f6vetkez\u0151 p\u00e9ld\u00e1ban t\u00f6bb keresked\u0151 \u2013 legyenek azok nagyobb szervezetek vagy \u00fcgyes p\u00e9nz\u00fcgyi elemz\u0151k \u2013 t\u0151zsdei tranzakci\u00f3inak nyomon k\u00f6vet\u00e9s\u00e9vel foglalkozunk.<\/p>\n<p>K\u00e9t lehets\u00e9ges oka van ennek a nyomon k\u00f6vet\u00e9snek. Az egyik az, hogy tudni kell, mit v\u00e1s\u00e1rolnak\/eladnak a piac vezet\u0151i. Ha ezek a nagy j\u00e1t\u00e9kosok \u00e9s tapasztalt befektet\u0151k lehet\u0151s\u00e9geket l\u00e1tnak, \u00e9rdemes k\u00f6vetni a strat\u00e9gi\u00e1jukat. A m\u00e1sik ok az, hogy \u00e9szrevegy\u00fck az esetleges illeg\u00e1lis tranzakci\u00f3k jeleit, amelyek bels\u0151 inform\u00e1ci\u00f3k felhaszn\u00e1l\u00e1s\u00e1val t\u00f6rt\u00e9nnek. Ehhez elemezni kell a nagy \u00e9rt\u00e9k\u0171 elad\u00e1si hull\u00e1mok korrel\u00e1ci\u00f3j\u00e1t a fontos sajt\u00f3k\u00f6zlem\u00e9nyekkel.<\/p>\n<p>Ez a nyomon k\u00f6vet\u00e9s a k\u00f6vetkez\u0151 l\u00e9p\u00e9sekb\u0151l \u00e1ll:<\/p>\n<ul>\n<li>adatfolyam l\u00e9trehoz\u00e1sa a stock-transactions t\u00e9m\u00e1b\u00f3l;<\/li>\n<li>a bej\u00f6v\u0151 rekordok csoportos\u00edt\u00e1sa a v\u00e1s\u00e1rl\u00f3 azonos\u00edt\u00f3ja \u00e9s a r\u00e9szv\u00e9ny szimb\u00f3luma szerint. A groupBy met\u00f3dus megh\u00edv\u00e1sa visszaad egy KGroupedStream oszt\u00e1ly p\u00e9ld\u00e1nyt;<\/li>\n<li>a KGroupedStream.windowedBy met\u00f3dus haszn\u00e1lat\u00e1val egy id\u0151ablakkal korl\u00e1tozott adatfolyam visszaad\u00e1sa, ami lehet\u0151v\u00e9 teszi az ablakos aggreg\u00e1l\u00e1st. Az ablak t\u00edpusa alapj\u00e1n visszaad\u00f3dik egy TimeWindowedKStream vagy egy SessionWindowedKStream;<\/li>\n<li>a tranzakci\u00f3k sz\u00e1ml\u00e1l\u00e1sa az aggreg\u00e1l\u00e1si m\u0171velethez. Az ablakos adatfolyam hat\u00e1rozza meg, hogy egy adott rekord szerepel-e a sz\u00e1ml\u00e1l\u00e1sban;<\/li>\n<li>az eredm\u00e9nyek r\u00f6gz\u00edt\u00e9se a t\u00e9m\u00e1ban vagy azok ki\u00edr\u00e1sa a konzolra a fejleszt\u00e9s sor\u00e1n.<\/li>\n<\/ul>\n<p>\nA program topol\u00f3gi\u00e1ja egyszer\u0171, de egy \u00e1ttekinthet\u0151 \u00e1bra nem \u00e1rt. N\u00e9zz\u00fck meg az 5.11. \u00e1br\u00e1t.<\/p>\n<p>Ezut\u00e1n megvizsg\u00e1ljuk az ablakos m\u0171veletek funkcionalit\u00e1s\u00e1t \u00e9s a megfelel\u0151 k\u00f3dot.<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/67d9d8d8acb1370a7c7fe5cd9a8b6aa7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Ablak t\u00edpusok<\/h3>\n<p>\nA Kafka Streams-ben h\u00e1rom t\u00edpus\u00fa ablak l\u00e9tezik:<\/p>\n<ul>\n<li>\u00fcl\u00e9s alap\u00fa;<\/li>\n<li>\u00abtumbling\u00bb (felborul\u00f3);<\/li>\n<li>cs\u00fasz\u00f3\/\u00abhopping\u00bb (sliding\/hopping).<\/li>\n<\/ul>\n<p>\nHogy melyiket v\u00e1lasszuk, az az \u00fczleti k\u00f6vetelm\u00e9nyekt\u0151l f\u00fcgg. A \u00abfelborul\u00f3\u00bb \u00e9s a \u00abhopping\u00bb ablakok id\u0151ben korl\u00e1tozottak, m\u00edg a session ablakok korl\u00e1toz\u00e1sa a felhaszn\u00e1l\u00f3i tev\u00e9kenys\u00e9geken alapul - a sesion(-\u00f6k) hossza kiz\u00e1r\u00f3lag att\u00f3l f\u00fcgg, hogy a felhaszn\u00e1l\u00f3 mennyire akt\u00edvan viselkedik. A legfontosabb, hogy ne felejts\u00fck el, hogy minden ablak t\u00edpus a rekordok d\u00e1tum\/id\u0151 jel\u00f6l\u00e9sein alapul, nem a rendszerid\u0151n.<\/p>\n<p>Ezut\u00e1n minden ablak t\u00edpus\u00e1val megval\u00f3s\u00edtjuk a topol\u00f3gi\u00e1nkat. A teljes k\u00f3dot csak az els\u0151 p\u00e9ld\u00e1ban mutatjuk be, a t\u00f6bbi ablak t\u00edpusn\u00e1l semmi nem v\u00e1ltozik, csak az ablak m\u0171velet t\u00edpusa.<\/p>\n<h3>Szezon\u00e1lis ablakok<\/h3>\n<p>\nA munkamenet ablakok jelent\u0151sen elt\u00e9rnek a t\u00f6bbi t\u00edpust\u00f3l. Ezeket nem annyira id\u0151ben korl\u00e1tozz\u00e1k, mint ink\u00e1bb a felhaszn\u00e1l\u00f3 (vagy annak a tev\u00e9kenys\u00e9ge, akit k\u00f6vetni szeretn\u00e9l) aktivit\u00e1s\u00e1val. A munkamenet ablakokat t\u00e9tlens\u00e9gi id\u0151szakok hat\u00e1rolj\u00e1k.<\/p>\n<p>A 5.12-es \u00e1bra szeml\u00e9lteti a munkamenet ablakok fogalm\u00e1t. A kisebb munkamenet \u00f6sszeolvad a bal oldali munkamenettel. A jobboldali munkamenet viszont k\u00fcl\u00f6n\u00e1ll\u00f3 lesz, mivel egy hosszabb t\u00e9tlens\u00e9gi id\u0151szakot k\u00f6vet. A munkamenet ablakok a felhaszn\u00e1l\u00f3i tev\u00e9kenys\u00e9gek alapj\u00e1n \u00e9p\u00fclnek fel, de id\u0151b\u00e9lyegeket alkalmaznak a rekordok azonos\u00edt\u00e1s\u00e1hoz, hogy melyik munkamenethez tartozik a rekord.<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/d39a5db7af7d6aa2194802622b2b47fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Munkamenet ablakok haszn\u00e1lata a t\u0151zsdei tranzakci\u00f3k nyomon k\u00f6vet\u00e9s\u00e9re.<\/h3>\n<p>\nA munkamenet ablakok seg\u00edts\u00e9g\u00e9vel inform\u00e1ci\u00f3t gy\u0171jt\u00fcnk a t\u0151zsdei tranzakci\u00f3kr\u00f3l. A munkamenet ablakok megval\u00f3s\u00edt\u00e1sa a 5.5-\u00f6s listingben tal\u00e1lhat\u00f3 (amely a src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKTableJoinExample.java f\u00e1jlban tal\u00e1lhat\u00f3).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/2dcbd9a36baec0e746aad165121451b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEnnek a topol\u00f3gi\u00e1nak a legt\u00f6bb m\u0171velet\u00e9t m\u00e1r tal\u00e1lkozt\u00e1tok, ez\u00e9rt nincs sz\u00fcks\u00e9g arra, hogy \u00fajra \u00e1tbesz\u00e9lj\u00fck \u0151ket. De van itt n\u00e9h\u00e1ny \u00faj elem, amelyet most meg fogunk vitatni.<\/p>\n<p>A groupBy m\u0171veletn\u00e9l \u00e1ltal\u00e1ban v\u00e9grehajtanak valamilyen aggreg\u00e1l\u00f3 m\u0171veletet (aggreg\u00e1l\u00e1s, reduk\u00e1l\u00e1s vagy sz\u00e1mol\u00e1s). V\u00e9grehajthat\u00f3 halmozott aggreg\u00e1l\u00e1s, amely a fut\u00f3 \u00f6sszeggel m\u0171k\u00f6dik, vagy ablakozott aggreg\u00e1l\u00e1s, amely figyelembe veszi a rekordokat egy adott id\u0151ablakban.<\/p>\n<p>Az 5.5-\u00f6s listing k\u00f3dja a munkamenet ablakokban l\u00e9v\u0151 tranzakci\u00f3k sz\u00e1m\u00e1nak figyel\u00e9s\u00e9t v\u00e9gzi. A 5.13-as \u00e1br\u00e1n ezeket a l\u00e9p\u00e9seket l\u00e9p\u00e9sr\u0151l l\u00e9p\u00e9sre elemzik.<\/p>\n<p>A windowedBy(SessionWindows.with(twentySeconds).until(fifteenMinutes)) h\u00edv\u00e1s r\u00e9v\u00e9n 20 m\u00e1sodperces t\u00e9tlens\u00e9gi id\u0151szakkal \u00e9s 15 perces meg\u0151rz\u00e9si intervallummal rendelkez\u0151 munkamenet ablakot hozunk l\u00e9tre. A 20 m\u00e1sodperces t\u00e9tlens\u00e9gi id\u0151 azt jelenti, hogy az alkalmaz\u00e1s b\u00e1rmilyen rekordot be fog vonni, amely a jelenlegi (akt\u00edv) munkamenet v\u00e9g\u00e9t\u0151l vagy kezdet\u00e9t\u0151l sz\u00e1m\u00edtott 20 m\u00e1sodpercen bel\u00fcl \u00e9rkezik.<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/9bd47b04698086872fd135b4c67eb938.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEzut\u00e1n megadjuk, hogy melyik aggreg\u00e1ci\u00f3s m\u0171veletet kell v\u00e9grehajtani az \u00fcl\u00e9sablakban \u2013 eset\u00fcnkben a count. Ha a bej\u00f6v\u0151 rekord t\u00falmutat az inaktivit\u00e1si id\u0151tartamon (b\u00e1rmelyik oldalr\u00f3l a d\u00e1tum\/id\u0151 b\u00e9lyeg mellett), akkor az alkalmaz\u00e1s \u00faj \u00fcl\u00e9s l\u00e9trehoz\u00e1s\u00e1t ind\u00edtja. A meg\u0151rz\u00e9si id\u0151tartam azt jelenti, hogy az \u00fcl\u00e9st meghat\u00e1rozott ideig fenntartjuk, lehet\u0151v\u00e9 t\u00e9ve a k\u00e9slekedett adatokat, amelyek az \u00fcl\u00e9s inaktivit\u00e1si id\u0151tartam\u00e1n k\u00edv\u00fcl esnek, de m\u00e9g mindig csatlakoztathat\u00f3k. Emellett az \u00faj \u00fcl\u00e9s kezdete \u00e9s v\u00e9ge, amely a f\u00fazi\u00f3 eredm\u00e9nyek\u00e9nt j\u00f6n l\u00e9tre, a legkor\u00e1bbi \u00e9s legk\u00e9s\u0151bbi d\u00e1tum\/id\u0151 b\u00e9lyeghez igazodik.<\/p>\n<p>N\u00e9zz\u00fcnk meg n\u00e9h\u00e1ny rekordot a count m\u00f3dszerb\u0151l, hogy l\u00e1ssuk, hogyan m\u0171k\u00f6dnek az \u00fcl\u00e9sek (5.1. t\u00e1bl\u00e1zat).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/ec04aae466d88c2d2349474069c8d541.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAmikor rekordok \u00e9rkeznek, m\u00e1r l\u00e9tez\u0151 \u00fcl\u00e9seket keres\u00fcnk ugyanazzal a kulccsal, ahol a befejez\u00e9s ideje kisebb, mint az aktu\u00e1lis d\u00e1tum\/id\u0151 b\u00e9lyeg \u2013 inaktivit\u00e1si id\u0151tartam \u00e9s a kezd\u00e9si id\u0151pont nagyobb, mint az aktu\u00e1lis d\u00e1tum\/id\u0151 b\u00e9lyeg + inaktivit\u00e1si id\u0151tartam. E tekintetben a 5.1. t\u00e1bl\u00e1zat n\u00e9gy rekordja egyetlen \u00fcl\u00e9ss\u00e9 egyes\u00fcl a k\u00f6vetkez\u0151 m\u00f3don.<\/p>\n<p>1. El\u0151sz\u00f6r \u00e9rkezik 1. rekord, \u00edgy a kezd\u00e9si id\u0151 egyenl\u0151 a befejez\u00e9si id\u0151vel, amely 00:00:00.<\/p>\n<p>2. Ezut\u00e1n \u00e9rkezik 2. rekord, \u00e9s megkeress\u00fck az \u00fcl\u00e9seket, amelyek 23:59:55-kor \u00e9rnek v\u00e9get \u00e9s 00:00:35-kor kezd\u0151dnek. Megtal\u00e1ljuk az 1. rekordot, \u00e9s egyes\u00edtj\u00fck az 1. \u00e9s 2. \u00fcl\u00e9seket. Az 1. \u00fcl\u00e9s kezd\u00e9si idej\u00e9t (kor\u00e1bbi) \u00e9s a 2. \u00fcl\u00e9s befejez\u00e9si idej\u00e9t (k\u00e9s\u0151bbi) vessz\u00fck, teh\u00e1t \u00faj \u00fcl\u00e9s\u00fcnk 00:00:00-kor kezd\u0151dik \u00e9s 00:00:15-kor \u00e9r v\u00e9get.<\/p>\n<p>3. Meg\u00e9rkezik a 3. rekord, az \u00fcl\u00e9seket 00:00:30 \u00e9s 00:01:10 k\u00f6z\u00f6tt keress\u00fck, de egyet sem tal\u00e1lunk. Hozz\u00e1adunk egy m\u00e1sodik \u00fcl\u00e9st a 123-345-654,FFBE kulcshoz, amely 00:00:50-kor kezd\u0151dik \u00e9s \u00e9r v\u00e9get.<\/p>\n<p>4. Meg\u00e9rkezik a 4. rekord, \u00e9s az \u00fcl\u00e9seket 23:59:45 \u00e9s 00:00:25 k\u00f6z\u00f6tt keress\u00fck. Ez\u00fattal mindk\u00e9t \u00fcl\u00e9st \u2013 1 \u00e9s 2 \u2013 megtal\u00e1ljuk. A h\u00e1rom \u00fcl\u00e9st egyes\u00edtj\u00fck egybe, a kezd\u00e9si id\u0151 00:00:00, a befejez\u00e9si id\u0151 pedig 00:00:15.<\/p>\n<p>A jelen fejezetb\u0151l \u00e9rdemes megjegyezni a k\u00f6vetkez\u0151 fontos r\u00e9szleteket:<\/p>\n<ul>\n<li>az \u00fcl\u00e9sek nem \u00e1lland\u00f3 m\u00e9ret\u0171 ablakok. Az \u00fcl\u00e9s id\u0151tartam\u00e1t az adott id\u0151intervallumon bel\u00fcli aktivit\u00e1s hat\u00e1rozza meg;<\/li>\n<li>az adatok d\u00e1tum\/id\u0151 b\u00e9lyegz\u0151i meghat\u00e1rozz\u00e1k, hogy egy esem\u00e9ny a megl\u00e9v\u0151 \u00fcl\u00e9sbe esik-e vagy az inaktivit\u00e1si id\u0151szakba.<\/li>\n<\/ul>\n<p>\nEzut\u00e1n a k\u00f6vetkez\u0151 ablakfajt\u00e1r\u00f3l fogunk besz\u00e9lni \u2013 a \u201elahorg\u00f3\u201d ablakokr\u00f3l.<\/p>\n<h3>\u201eLahorg\u00f3\u201d ablakok<\/h3>\n<p>\nA \"tumbling\" window captures events that occur within a specific time interval. Imagine you need to capture all stock transactions of a certain company every 20 seconds, collecting all events during that period. At the end of the 20-second interval, the window \"tumbles\" and moves to a new 20-second observation window. Figure 5.14 illustrates this situation.<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/e90e560d9ddda5e2e524b7c387ad9874.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAs you can see, all events that have occurred in the last 20 seconds are included in the window. Once this time interval is over, a new window is created.<\/p>\n<p>Listing 5.6 contains code demonstrating the use of \"tumbling\" windows to capture stock transactions every 20 seconds (it can be found in the file src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/e055bb1b288c7d500b64372fe3fbf064.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nThanks to this small change in the TimeWindows.of method call, a \"tumbling\" window can be used. In this example, there is no call to the until() method, so the default retention interval of 24 hours will be used.<\/p>\n<p>Finally, it's time to move on to the last of the window options \u2014 \"hopping\" windows.<\/p>\n<h3>Sliding (\"hopping\") windows<\/h3>\n<p>\nSliding\/\"hopping\" windows are similar to \"tumbling\" ones, with one small difference. Sliding windows do not wait for the time interval to end before creating a new window to process recent events. They start new calculations after a waiting interval that is shorter than the window duration.<\/p>\n<p>To illustrate the differences between \"tumbling\" and \"hopping\" windows, let's return to the example of counting stock transactions. Our goal remains to count the number of transactions, but we do not want to wait for the entire time interval before updating the counter. Instead, we will update the counter at shorter intervals. For example, we will still count the number of transactions every 20 seconds, but update the counter every 5 seconds, as shown in fig. 5.15. This way, we end up with three result windows that have overlapping data.<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/415c8cd9f2b60d453a1a01c3bc99331f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nListing 5.7 contains code for specifying sliding windows (it can be found in the file src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/ab2d1a64380d256d3fb084e16597417c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA \"rolling\" window can be transformed into a \"jumping\" one by adding a call to the advanceBy() method. In the given example, the retention interval is 15 minutes.<\/p>\n<p>In this section, you have seen how to limit aggregation results with time windows. In particular, keep in mind the following three things from this section:<\/p>\n<ul>\n<li>the size of session windows is limited not by the time interval, but by user activity;<\/li>\n<li>\"rolling\" windows give insight into events within a specified time period;<\/li>\n<li>the duration of \"jumping\" windows is fixed, but they are often updated and may contain overlapping records across all windows.<\/li>\n<\/ul>\n<p>\nNext, we will learn how to convert a KTable back into a KStream for joining.<\/p>\n<h3>5.3.3. Joining KStream and KTable objects<\/h3>\n<p>\nIn chapter 4, we discussed joining two KStream objects. Now we need to learn how to join a KTable and a KStream. This may be necessary for the following simple reason. KStream is a stream of records, while KTable is a stream of record updates, but sometimes it may be needed to add additional context to the record stream using updates from the KTable.<\/p>\n<p>Let\u2019s take data about the number of stock transactions and join it with stock news based on the corresponding industries. Here\u2019s what you need to do to achieve this, considering the existing code.<\/p>\n<ol>\n<li>Convert the KTable object concerning the number of stock transactions into a KStream by replacing the key with the key representing the industry corresponding to the stock symbol.<\/li>\n<li>Create a KTable object reading data from the stock news topic. This new KTable will be categorized by industries.<\/li>\n<li>Join news updates with information about the number of stock transactions by industries.<\/li>\n<\/ol>\n<p>\nNow let's see how to implement this action plan.<\/p>\n<h3>Converting KTable to KStream<\/h3>\n<p>\nTo convert a KTable to a KStream, the following needs to be done.<\/p>\n<ol>\n<li>Call the KTable.toStream() method.<\/li>\n<li>Use the KStream.map method to replace the key with the name of the industry, then extract the TransactionSummary object from the Windowed instance.<\/li>\n<\/ol>\n<p>\nWe will link these operations in a chain as follows (the code can be found in the file src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (listing 5.8).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/0d43c2650f6e66e2816ed383da3a29c2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMivel a KStream.map m\u0171veletet hajtjuk v\u00e9gre, a visszat\u00e9r\u0151 KStream p\u00e9ld\u00e1ny automatikusan \u00fajraszektion\u00e1l\u00f3dik, amikor kapcsolatba ker\u00fcl.<\/p>\n<p>Befejezt\u00fck a transzform\u00e1ci\u00f3s folyamatot, most KTable objektumot kell l\u00e9trehoznunk a t\u0151zsdei h\u00edrek olvas\u00e1s\u00e1hoz.<\/p>\n<h3>KTable l\u00e9trehoz\u00e1sa a t\u0151zsdei h\u00edrekhez<\/h3>\n<p>\nSzerencs\u00e9re a KTable objektum l\u00e9trehoz\u00e1s\u00e1hoz elegend\u0151 egyetlen sor k\u00f3d (ez a k\u00f3d a src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java f\u00e1jlban tal\u00e1lhat\u00f3) (5.9-es list\u00e1z\u00e1s).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/6e83a393fdc9ab74fda4cbdddddb5213.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c9rdemes megjegyezni, hogy nem sz\u00fcks\u00e9ges semmilyen Serde objektumot megadni, mivel a be\u00e1ll\u00edt\u00e1sokban karakterl\u00e1nc Serde-ket haszn\u00e1lnak. Az EARLIEST enumer\u00e1ci\u00f3 alkalmaz\u00e1s\u00e1nak k\u00f6sz\u00f6nhet\u0151en a t\u00e1bla a legkor\u00e1bbi bejegyz\u00e9sekkel telik meg.<\/p>\n<p>Most \u00e1tt\u00e9rhet\u00fcnk az utols\u00f3 l\u00e9p\u00e9sre \u2014 a kapcsolatra.<\/p>\n<h3>A h\u00edrek friss\u00edt\u00e9seinek \u00f6sszekapcsol\u00e1sa a tranzakci\u00f3sz\u00e1mmal<\/h3>\n<p>\nA kapcsolat l\u00e9trehoz\u00e1sa nem bonyolult. Bal oldali \u00f6sszekapcsol\u00e1st fogunk alkalmazni arra az esetre, ha a megfelel\u0151 ipar\u00e1gban nincsenek t\u0151zsdei h\u00edrek (a sz\u00fcks\u00e9ges k\u00f3d a src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java f\u00e1jlban tal\u00e1lhat\u00f3) (5.10-es list\u00e1z\u00e1s).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/92ed70f98927d2f778ad14dbc2a5aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEz a leftJoin operador el\u00e9g egyszer\u0171. A 4. fejezetb\u0151l sz\u00e1rmaz\u00f3 \u00f6sszekapcsol\u00e1sokkal ellent\u00e9tben a JoinWindow met\u00f3dust nem haszn\u00e1lj\u00e1k, mivel KStream-KTable kapcsolat l\u00e9trehoz\u00e1sakor minden kulcshoz csak egy bejegyz\u00e9s tartozik a KTable-ben. Ez a kapcsolat id\u0151korl\u00e1t n\u00e9lk\u00fcli: a bejegyz\u00e9s lehet a KTable-ben, vagy hi\u00e1nyozhat. A f\u0151 meg\u00e1llap\u00edt\u00e1s: KTable objektumok seg\u00edts\u00e9g\u00e9vel ritk\u00e1bban friss\u00edtett referenciadataival gazdag\u00edthatjuk a KStream-t.<\/p>\n<p>Most egy hat\u00e9konyabb m\u00f3dszert fogunk megvizsg\u00e1lni, amellyel gazdag\u00edthatjuk a KStream esem\u00e9nyeit.<\/p>\n<h3>5.3.4. GlobalKTable objektumok<\/h3>\n<p>\nAhogy l\u00e1that\u00f3, sz\u00fcks\u00e9g van az esem\u00e9nyfolyamok gazdag\u00edt\u00e1s\u00e1ra vagy kontextusok hozz\u00e1ad\u00e1s\u00e1ra. A 4. fejezetben k\u00e9t KStream objektum \u00f6sszekapcsol\u00e1s\u00e1t l\u00e1ttuk, m\u00edg az el\u0151z\u0151 r\u00e9szben a KStream \u00e9s KTable \u00f6sszekapcsol\u00e1s\u00e1t. Minden ezekben az esetekben sz\u00fcks\u00e9ges a folyamat \u00fajraszektion\u00e1l\u00e1sa, amikor a kulcsokat \u00faj t\u00edpusra vagy \u00e9rt\u00e9kre t\u00e9rk\u00e9pezz\u00fck. N\u00e9ha a szekcion\u00e1l\u00e1s kifejezetten t\u00f6rt\u00e9nik, m\u00e1skor pedig a Kafka Streams automatikusan v\u00e9gzi. Az \u00fajraszekcion\u00e1l\u00e1s sz\u00fcks\u00e9ges, mivel a kulcsok megv\u00e1ltoztak, \u00e9s a bejegyz\u00e9seknek \u00faj szekci\u00f3kban kell st\u00e1tuszt kapniuk, k\u00fcl\u00f6nben a kapcsolat lehetetlenn\u00e9 v\u00e1lik (ez a 4. fejezetben, az \u201eAdatok \u00fajraszektion\u00e1l\u00e1sa\u201d c\u00edm\u0171 szakaszban volt t\u00e1rgyalva, a 4.2.4. alszakaszban).<\/p>\n<h3>A t\u00f6bbsz\u00f6r\u00f6s szekcion\u00e1l\u00e1snak \u00e1ra van<\/h3>\n<p>\nA t\u00f6bbsz\u00f6r\u00f6s szekcion\u00e1l\u00e1s k\u00f6lts\u00e9geket von maga ut\u00e1n \u2014 tov\u00e1bbi er\u0151forr\u00e1sk\u00f6lts\u00e9geket a k\u00f6zbens\u0151 t\u00e9m\u00e1k l\u00e9trehoz\u00e1s\u00e1hoz, a megism\u00e9telt adatok t\u00e1rol\u00e1s\u00e1hoz egy m\u00e1sik t\u00e9m\u00e1ban; ez a k\u00e9sleltet\u00e9s n\u00f6veked\u00e9s\u00e9t is jelenti az \u00edr\u00e1si \u00e9s olvas\u00e1si folyamatok sor\u00e1n. Ezen k\u00edv\u00fcl, ha t\u00f6bb aspektus vagy dimenzi\u00f3 szerint kell csatlakozni, akkor a kapcsolatokat l\u00e1ncba kell szervezni, \u00faj kulcsokkal kell megjelen\u00edteni a bejegyz\u00e9seket, \u00e9s \u00fajra kell v\u00e9gezni a t\u00f6bbsz\u00f6r\u00f6s szekcion\u00e1l\u00e1st.<\/p>\n<h3>Kapcsol\u00f3d\u00e1s kisebb adathalmazokhoz<\/h3>\n<p>\nBizonyos esetekben a csatlakoztatni k\u00edv\u00e1nt hivatkoz\u00e1si adatok volumene viszonylag kicsi, \u00edgy a teljes m\u00e1solataik elf\u00e9rnek lok\u00e1lisan minden csom\u00f3ponton. Az ilyen helyzetekhez a Kafka Streams-ben GlobalKTable oszt\u00e1ly \u00e1ll rendelkez\u00e9sre.<\/p>\n<p>A GlobalKTable p\u00e9ld\u00e1nyok egyediek, mivel az alkalmaz\u00e1s minden adatot replik\u00e1l minden csom\u00f3ponton. Mivel minden csom\u00f3ponton megtal\u00e1lhat\u00f3 minden adat, nincs sz\u00fcks\u00e9g arra, hogy az esem\u00e9nyfolyamot a hivatkoz\u00e1si adatok kulcsa szerint szekcion\u00e1ljuk, hogy az minden szekci\u00f3 sz\u00e1m\u00e1ra el\u00e9rhet\u0151 legyen. A GlobalKTable objektumok seg\u00edts\u00e9g\u00e9vel kulcs n\u00e9lk\u00fcli csatlakoztat\u00e1sokat is v\u00e9gezhet\u00fcnk. T\u00e9rj\u00fcnk vissza az egyik kor\u00e1bbi p\u00e9ld\u00e1nkhoz, hogy bemutathassuk ezt a k\u00e9pess\u00e9get.<\/p>\n<h3>KStream objektumok csatlakoztat\u00e1sa GlobalKTable objektumokkal<\/h3>\n<p>\nAz 5.3.2 alfejezetben ablakos aggreg\u00e1ci\u00f3t hajtottunk v\u00e9gre a t\u0151zsdei tranzakci\u00f3kr\u00f3l a v\u00e1s\u00e1rl\u00f3k szerint. Az aggreg\u00e1l\u00e1s eredm\u00e9nyei a k\u00f6vetkez\u0151k\u00e9ppen n\u00e9ztek ki:<\/p>\n<pre><code class=\"plaintext\">{customerId='074-09-3705', stockTicker='GUTM'}, 17\n{customerId='037-34-5184', stockTicker='CORK'}, 16<\/code><\/pre>\n<p>\nB\u00e1r ezek az eredm\u00e9nyek megfeleltek a kit\u0171z\u00f6tt c\u00e9lnak, hasznosabb lenne, ha a v\u00e1s\u00e1rl\u00f3 neve \u00e9s a c\u00e9g teljes neve is megjelenne. A v\u00e1s\u00e1rl\u00f3 nev\u00e9nek \u00e9s a c\u00e9g nev\u00e9nek hozz\u00e1ad\u00e1sa \u00e9rdek\u00e9ben a szok\u00e1sos csatlakoztat\u00e1sokat lehet alkalmazni, de ez k\u00e9t kulcslek\u00e9pez\u00e9st \u00e9s \u00fajabb szekcion\u00e1l\u00e1st ig\u00e9nyel. A GlobalKTable seg\u00edts\u00e9g\u00e9vel elker\u00fclhetj\u00fck ezeket a k\u00f6lts\u00e9geket.<\/p>\n<p>Ehhez a 5.11-es listingb\u0151l a countStream objektumot fogjuk haszn\u00e1lni (a megfelel\u0151 k\u00f3d megtal\u00e1lhat\u00f3 a src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java f\u00e1jlban), \u00e9s \u00f6sszekapcsoljuk k\u00e9t GlobalKTable objektummal.<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/fc4d91bbe062ceb94f5650224840b81e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nM\u00e1r besz\u00e9lt\u00fcnk err\u0151l kor\u00e1bban, \u00edgy nem fogom megism\u00e9telni. De megjegyzem, hogy a toStream().map funkci\u00f3ban szerepl\u0151 k\u00f3d az olvashat\u00f3s\u00e1g \u00e9rdek\u00e9ben objektum-funkci\u00f3v\u00e1 van absztrah\u00e1lva, nem be\u00e1gyazott lambda-kifejez\u00e9ss\u00e9.<\/p>\n<p>A k\u00f6vetkez\u0151 l\u00e9p\u00e9s a GlobalKTable k\u00e9t p\u00e9ld\u00e1ny\u00e1nak bejelent\u00e9se (a bemutatott k\u00f3d a src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java f\u00e1jlban tal\u00e1lhat\u00f3) (5.12. list\u00e1z\u00e1s).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/db3918895f174c8cfb5fc927b55f87a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Vegye figyelembe, hogy a t\u00e9m\u00e1k neveit felsorolt t\u00edpusok seg\u00edts\u00e9g\u00e9vel \u00edrj\u00e1k le.<\/p>\n<p>Most, hogy minden komponenst el\u0151k\u00e9sz\u00edtett\u00fcnk, meg kell \u00edrni a csatlakoz\u00e1si k\u00f3dot (amely a src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java f\u00e1jlban tal\u00e1lhat\u00f3) (5.13. list\u00e1z\u00e1s).<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/799360cc99f1920c190a61fd4685d4ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nB\u00e1r a k\u00f3dban k\u00e9t csatlakoz\u00e1s tal\u00e1lhat\u00f3, azok l\u00e1ncba vannak szervezve, mivel k\u00fcl\u00f6n-k\u00fcl\u00f6n egyik\u00fck eredm\u00e9nyei sem ker\u00fclnek felhaszn\u00e1l\u00e1sra. Az eredm\u00e9nyek az eg\u00e9sz m\u0171velet v\u00e9g\u00e9n jelennek meg.<\/p>\n<p>A fenti csatlakoz\u00e1si m\u0171velet v\u00e9grehajt\u00e1sakor az al\u00e1bbi t\u00edpus\u00fa eredm\u00e9nyeket fogja kapni:<\/p>\n<pre><code class=\"plaintext\">{customer='Barney, Smith' company=\"Exxon\", transactions= 17}<\/code><\/pre>\n<p>\nA l\u00e9nyeg nem v\u00e1ltozott, de ezek az eredm\u00e9nyek \u00e9rthet\u0151bbek.<\/p>\n<p>Ha a 4. fejezetet is sz\u00e1moljuk, m\u00e1r l\u00e1ttad a csatlakoz\u00e1sok n\u00e9h\u00e1ny t\u00edpus\u00e1t m\u0171k\u00f6d\u00e9s k\u00f6zben. Ezek a 5.2. t\u00e1bl\u00e1zatban szerepelnek. Ez a t\u00e1bl\u00e1zat az 1.0.0 verzi\u00f3j\u00fa Kafka Streams-re alkalmazhat\u00f3 csatlakoz\u00e1si lehet\u0151s\u00e9geket t\u00fckr\u00f6zi; a j\u00f6v\u0151beli kiad\u00e1sokban val\u00f3sz\u00edn\u0171leg t\u00f6rt\u00e9nnek v\u00e1ltoz\u00e1sok.<\/p>\n<p><img decoding=\"async\" alt=\"A k\u00f6nyv \u201eKafka Streams a gyakorlatban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 feldolgoz\u00e1shoz\u201d\" src=\"\/wp-content\/uploads\/8e4cf35c64a8431bda43a5e748de275f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00d6sszegz\u00e9s\u00fcl eml\u00e9keztetn\u00e9m a l\u00e9nyeget: az esem\u00e9nyfolyamokat (KStream) \u00e9s a friss\u00edt\u00e9si folyamokat (KTable) helyi \u00e1llapot felhaszn\u00e1l\u00e1s\u00e1val lehet \u00f6sszekapcsolni. Ezenk\u00edv\u00fcl, ha a referenciaadatok m\u00e9rete nem t\u00fal nagy, a GlobalKTable objektummal is \u00e9lhet\u00fcnk. A GlobalKTable minden szakaszt replik\u00e1l a Kafka Streams alkalmaz\u00e1s \u00f6sszes csom\u00f3pontj\u00e1ra, ez\u00e1ltal biztos\u00edtva, hogy az \u00f6sszes adat el\u00e9rhet\u0151 legyen, f\u00fcggetlen\u00fcl att\u00f3l, hogy melyik szakaszhoz tartozik a kulcs.<\/p>\n<p>K\u00f6vetkez\u0151 l\u00e9p\u00e9sben meg fogjuk n\u00e9zni a Kafka Streams azon lehet\u0151s\u00e9g\u00e9t, amely lehet\u0151v\u00e9 teszi az \u00e1llapotv\u00e1ltoz\u00e1sok megfigyel\u00e9s\u00e9t an\u00e9lk\u00fcl, hogy adatokat kellene fogyasztani a Kafka t\u00e9m\u00e1b\u00f3l.<\/p>\n<h3>5.3.5. Lek\u00e9rdezhet\u0151 \u00e1llapot<\/h3>\n<p>\nM\u00e1r v\u00e9gezt\u00fcnk n\u00e9h\u00e1ny m\u0171veletet \u00e1llapotokkal, \u00e9s mindig az eredm\u00e9nyeket a konzolra \u00edrtuk (fejleszt\u00e9si c\u00e9lokra) vagy a t\u00e9m\u00e1ba r\u00f6gz\u00edtett\u00fck (ipari c\u00e9lokra). Az eredm\u00e9nyek t\u00e9m\u00e1ba val\u00f3 \u00edr\u00e1sakor a Kafka fogyaszt\u00f3t kell haszn\u00e1lni azok megtekint\u00e9s\u00e9re.<\/p>\n<p>Ezekb\u0151l a t\u00e9m\u00e1kb\u00f3l kiolvashat\u00f3 adatok a materializ\u00e1lt n\u00e9zetek (materialized views) egy form\u00e1j\u00e1nak tekinthet\u0151k. C\u00e9ljainkhoz a Wikipedia defin\u00edci\u00f3j\u00e1t haszn\u00e1lhatjuk a materializ\u00e1lt n\u00e9zetr\u0151l: \u201e\u2026 egy adatb\u00e1zis fizikai objektuma, amely egy lek\u00e9rdez\u00e9s v\u00e9grehajt\u00e1s\u00e1nak eredm\u00e9nyeit tartalmazza. P\u00e9ld\u00e1ul lehet t\u00e1voli adatok helyi m\u00e1solata, vagy sorok \u00e9s\/vagy oszlopok r\u00e9szhalmaza egy t\u00e1bl\u00e1zatb\u00f3l, vagy aggreg\u00e1l\u00e1ssal nyert pivot t\u00e1bl\u00e1zat\u201d (https:\/\/en.wikipedia.org\/wiki\/Materialized_view).<\/p>\n<p>A Kafka Streams lehet\u0151v\u00e9 teszi interakt\u00edv lek\u00e9rdez\u00e9sek (interactive queries) v\u00e9grehajt\u00e1s\u00e1t az \u00e1llapot t\u00e1rol\u00f3kra, ami lehet\u0151v\u00e9 teszi ezen materializ\u00e1lt n\u00e9zetek k\u00f6zvetlen olvas\u00e1s\u00e1t. Fontos megjegyezni, hogy az \u00e1llapot t\u00e1rol\u00f3ra val\u00f3 lek\u00e9rdez\u00e9s \u201ecsak olvas\u00e1si\u201d m\u0171veletet jelent. Ennek k\u00f6sz\u00f6nhet\u0151en nem kell izgulnia, hogy v\u00e9letlen\u00fcl \u00f6sszezavarja az \u00e1llapotot az adatok alkalmaz\u00e1s \u00e1ltali feldolgoz\u00e1sa sor\u00e1n.<\/p>\n<p>A k\u00f6zvetlen lek\u00e9rdez\u00e9sek lehet\u0151s\u00e9ge az \u00e1llapot t\u00e1rol\u00f3khoz nagy jelent\u0151s\u00e9ggel b\u00edr. Ez lehet\u0151v\u00e9 teszi, hogy inform\u00e1ci\u00f3s paneleket hozzunk l\u00e9tre an\u00e9lk\u00fcl, hogy el\u0151sz\u00f6r adatokat kellene szerezni a Kafka fogyaszt\u00f3t\u00f3l. Az alkalmaz\u00e1s hat\u00e9konys\u00e1g\u00e1t is n\u00f6veli, mivel nem sz\u00fcks\u00e9ges \u00fajra \u00edrni az adatokat:<\/p>\n<ul>\n<li>mivel az adatok lokalit\u00e1sa lehet\u0151v\u00e9 teszi, hogy gyorsan hozz\u00e1f\u00e9rj\u00fcnk hozz\u00e1juk;<\/li>\n<li>elker\u00fclhet\u0151 az adatok duplik\u00e1ci\u00f3ja, mivel nem \u00edr\u00f3dnak ki egy k\u00fcls\u0151 t\u00e1rol\u00f3ba.<\/li>\n<\/ul>\n<p>\nA legfontosabb dolog, amit szeretn\u00e9k, ha megjegyezne: a lek\u00e9rdez\u00e9seket k\u00f6zvetlen\u00fcl az \u00e1llapotb\u00f3l lehet v\u00e9gezni az alkalmaz\u00e1sb\u00f3l. Az a lehet\u0151s\u00e9g, amit ez ny\u00fajt, felbecs\u00fclhetetlen. Ahelyett, hogy adatokat fogyasztana a Kafka-b\u00f3l \u00e9s feljegyz\u00e9seket t\u00e1rolna az adatb\u00e1zisban az alkalmaz\u00e1s sz\u00e1m\u00e1ra, k\u00f6zvetlen lek\u00e9rdez\u00e9seket v\u00e9gezhet az \u00e1llapot t\u00e1rol\u00f3kra ugyanazzal az eredm\u00e9nnyel. A k\u00f6zvetlen lek\u00e9rdez\u00e9sek kevesebb k\u00f3dot (nincs fogyaszt\u00f3) \u00e9s kevesebb szoftvert ig\u00e9nyelnek (nincs sz\u00fcks\u00e9g adatb\u00e1zis t\u00e1bl\u00e1ra az eredm\u00e9nyek t\u00e1rol\u00e1s\u00e1hoz).<\/p>\n<p>Ebben a fejezetben jelent\u0151s mennyis\u00e9g\u0171 inform\u00e1ci\u00f3t t\u00e1rgyaltunk, ez\u00e9rt most \u00e1tmenetileg le\u00e1ll\u00edtjuk a besz\u00e9lget\u00e9st az \u00e1llapot t\u00e1rol\u00f3k interakt\u00edv lek\u00e9rdez\u00e9seivel kapcsolatban. De ne agg\u00f3djon: a 9. fejezetben egy egyszer\u0171 alkalmaz\u00e1st fogunk l\u00e9trehozni \u2013 egy inform\u00e1ci\u00f3s ir\u00e1ny\u00edt\u00f3pultot interakt\u00edv lek\u00e9rdez\u00e9sekkel. Az interakt\u00edv lek\u00e9rdez\u00e9sek bemutat\u00e1s\u00e1hoz \u00e9s a Kafka Streams alkalmaz\u00e1sokba val\u00f3 be\u00e9p\u00edt\u00e9s lehet\u0151s\u00e9geihez n\u00e9h\u00e1ny p\u00e9ld\u00e1t fogunk felhaszn\u00e1lni ebb\u0151l \u00e9s az el\u0151z\u0151 fejezetb\u0151l.<\/p>\n<h3>\u00d6sszefoglal\u00f3<\/h3>\n<p><\/p>\n<ul>\n<li>A KStream objektumok az esem\u00e9nyfolyamokat jelk\u00e9pezik, amelyek \u00f6sszehasonl\u00edthat\u00f3k az adatb\u00e1zisba val\u00f3 bejegyz\u00e9sekkel. A KTable objektumok a friss\u00edt\u00e9sek folyamait k\u00e9pviselik, \u00e9s ink\u00e1bb hasonl\u00edtanak az adatb\u00e1zis friss\u00edt\u00e9seire. A KTable objektumok m\u00e9rete nem n\u00f6vekszik; a r\u00e9gi bejegyz\u00e9seket \u00fajakkal helyettes\u00edtik.<\/li>\n<li>A KTable objektumok sz\u00fcks\u00e9gesek az aggreg\u00e1l\u00f3 m\u0171veletekhez.<\/li>\n<li>Az ablakm\u0171veletek seg\u00edts\u00e9g\u00e9vel az aggreg\u00e1lt adatokat id\u0151keretekre lehet bontani.<\/li>\n<li>A GlobalKTable objektumok lehet\u0151v\u00e9 teszik a referenciadatok el\u00e9r\u00e9s\u00e9t az alkalmaz\u00e1s b\u00e1rmely pontj\u00e1r\u00f3l, f\u00fcggetlen\u00fcl a szekci\u00f3k szerinti feloszt\u00e1st\u00f3l.<\/li>\n<li>KStream, KTable \u00e9s GlobalKTable objektumok k\u00f6z\u00f6tti \u00f6sszekapcsol\u00e1sok lehets\u00e9gesek.<\/li>\n<\/ul>\n<p>\nEddig a KStream magas szint\u0171 DSL haszn\u00e1lat\u00e1val k\u00e9sz\u00edtett\u00fck a Kafka Streams alkalmaz\u00e1sokat. B\u00e1r a magas szint\u0171 megk\u00f6zel\u00edt\u00e9s lehet\u0151v\u00e9 teszi, hogy tiszta \u00e9s t\u00f6m\u00f6r programokat k\u00e9sz\u00edts\u00fcnk, haszn\u00e1lata bizonyos kompromisszumokat jelent. A DSL KStream haszn\u00e1lata a k\u00f3d t\u00f6m\u00f6rs\u00e9g\u00e9nek n\u00f6vel\u00e9s\u00e9t, de a kontroll cs\u00f6kkent\u00e9s\u00e9t jelenti. A k\u00f6vetkez\u0151 fejezetben megvizsg\u00e1ljuk az alacsony szint\u0171 csom\u00f3pont-feldolgoz\u00f3 API-t, \u00e9s kipr\u00f3b\u00e1lunk m\u00e1s kompromisszumokat. A programok hosszabbak lesznek, mint eddig, de lehet\u0151s\u00e9g\u00fcnk ny\u00edlik szinte b\u00e1rminem\u0171 feldolgoz\u00f3 csom\u00f3pont l\u00e9trehoz\u00e1s\u00e1ra, amire csak sz\u00fcks\u00e9g\u00fcnk lehet.<\/p>\n<p>\u2192 A k\u00f6nyv r\u00e9szletesebben is megismerhet\u0151 itt: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/best\/product\/kafka-streams-v-deystvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\">kiad\u00f3 weboldal\u00e1n olvashat\u00f3<\/a><\/noindex><\/p>\n<p>\u2192 A Habr l\u00e1togat\u00f3i sz\u00e1m\u00e1ra 25% kedvezm\u00e9ny a kuponnal \u2014 <b>Kafka Streams<\/b><\/p>\n<p>\u2192 A nyomtatott k\u00f6nyv kifizet\u00e9s\u00e9t k\u00f6vet\u0151en elektronikus k\u00f6nyvet k\u00fcld\u00fcnk e-mailben.<br \/>\n<br \/>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/457756\/\">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\u043e\u0436\u0438\u0442\u0435\u043b\u0438! \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c Kafka \u0438 Kafka Streams. \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0437\u043d\u0430\u0442\u044c \u0438 \u0441\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Kafka, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u041e\u043f\u044b\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Kafka, \u043a\u0430\u043a \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u043e\u0441\u0432\u043e\u044f\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35786","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\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\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\" \/>\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\u041a\u043d\u0438\u0433\u0430 \u00abKafka Streams \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00bb | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\" \/>\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-31T19:06:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:06:19+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\udd47\u201eKafka Streams akci\u00f3ban. Alkalmaz\u00e1sok \u00e9s mikroszolg\u00e1ltat\u00e1sok val\u00f3s idej\u0171 munk\u00e1hoz\u201d | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","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\u041a\u043d\u0438\u0433\u0430 \u00abKafka Streams \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00bb | ProHoster","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","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-31T19:06:19+00:00","article:modified_time":"2019-10-31T19:06:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35786","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-22 00:45:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:56:32","updated":"2026-01-22 00:45: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\/35786","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=35786"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/35786\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=35786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=35786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=35786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}