{"id":38172,"date":"2019-10-31T22:22:05","date_gmt":"2019-10-31T19:22:05","guid":{"rendered":"https:\/\/prohoster.info\/blog\/ponimanie-brokerov-soobshhenij-izuchenie-mehaniki-obmena-soobshheniyami-posredstvom-activemq-i-kafka-glava-3-kafka\/"},"modified":"2019-10-31T22:22:05","modified_gmt":"2019-10-31T19:22:05","slug":"ponimanie-brokerov-soobshhenij-izuchenie-mehaniki-obmena-soobshheniyami-posredstvom-activemq-i-kafka-glava-3-kafka","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/ponimanie-brokerov-soobshhenij-izuchenie-mehaniki-obmena-soobshheniyami-posredstvom-activemq-i-kafka-glava-3-kafka","title":{"rendered":"\u00dczenetbr\u00f3kerek meg\u00e9rt\u00e9se. Az \u00fczenetv\u00e1lt\u00e1s mechanizmus\u00e1nak tanulm\u00e1nyoz\u00e1sa az ActiveMQ \u00e9s a Kafka seg\u00edts\u00e9g\u00e9vel. 3. fejezet. Kafka","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>A k\u00f6nyv ford\u00edt\u00e1s\u00e1nak folytat\u00e1sa:<br \/>\n\u00abMessage Brokers meg\u00e9rt\u00e9se\u00bb<br \/>\nszerz\u0151: Jakub Korab, kiad\u00f3: O'Reilly Media, Inc., megjelen\u00e9s d\u00e1tuma: 2017 j\u00fanius, ISBN: 9781492049296.<\/p>\n<p>Az el\u0151z\u0151 ford\u00edtott r\u00e9sz: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/466385\/\">A \u00fczenetbr\u00f3kerek meg\u00e9rt\u00e9se. Az \u00fczenetcsere mechanik\u00e1j\u00e1nak tanulm\u00e1nyoz\u00e1sa az ActiveMQ \u00e9s Kafka seg\u00edts\u00e9g\u00e9vel. 1. fejezet. Bevezet\u00e9s<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>3. FEJEZET<\/h2>\n<p><\/p>\n<h2>, amely lehet\u0151s\u00e9get ad val\u00f3s id\u0151ben l\u00e1tni a rendszer esem\u00e9nyportf\u00f3li\u00f3j\u00e1t.<\/h2>\n<p>\nA Kafka-t a LinkedIn fejlesztette ki, hogy megker\u00fclje a hagyom\u00e1nyos \u00fczenetbr\u00f3kerek bizonyos korl\u00e1tait, \u00e9s elker\u00fclje, hogy t\u00f6bb \u00fczenetbr\u00f3kert kelljen be\u00e1ll\u00edtani k\u00fcl\u00f6nb\u00f6z\u0151 \"pont-pont\" interakci\u00f3khoz, amit a k\u00f6nyv \"Vertik\u00e1lis \u00e9s v\u00edzszintes sk\u00e1l\u00e1z\u00e1s\" c\u00edm\u0171 fejezet\u00e9ben 28. oldalon r\u00e9szletez\u00fcnk. A LinkedIn haszn\u00e1lati forgat\u00f3k\u00f6nyvei els\u0151sorban egyir\u00e1ny\u00fa, nagyon nagy adatmennyis\u00e9g bevitel\u00e9n alapultak, p\u00e9ld\u00e1ul az oldalon v\u00e9gzett kattint\u00e1sok \u00e9s a hozz\u00e1f\u00e9r\u00e9si napl\u00f3k, lehet\u0151v\u00e9 t\u00e9ve ezzel, hogy ezeket az adatokat t\u00f6bb rendszer haszn\u00e1lja an\u00e9lk\u00fcl, hogy a termel\u0151k vagy m\u00e1s fogyaszt\u00f3k teljes\u00edtm\u00e9ny\u00e9t befoly\u00e1soln\u00e1. Val\u00f3j\u00e1ban a Kafka l\u00e9trej\u00f6tt\u00e9nek oka egy olyan \u00fczenetcsere architekt\u00fara megval\u00f3s\u00edt\u00e1sa, amelyet az Universal Data Pipeline le\u00edr.<\/p>\n<p>Figyelembe v\u00e9ve ezt a v\u00e9gs\u0151 c\u00e9lt, term\u00e9szetesen m\u00e1s k\u00f6vetelm\u00e9nyek is felmer\u00fcltek. A Kafk\u00e1nak:<\/p>\n<ul>\n<li>Nagyon gyorsnak kell lennie<\/li>\n<li>Nagy \u00e1tbocs\u00e1t\u00f3k\u00e9pess\u00e9get kell biztos\u00edtania az \u00fczenetek kezel\u00e9sekor<\/li>\n<li>T\u00e1mogatnia kell a \"Kibocs\u00e1t\u00f3-El\u0151fizet\u0151\" \u00e9s \"Pont-Pont\" modelleket<\/li>\n<li>Nem szabad lelassulnia a fogyaszt\u00f3k hozz\u00e1ad\u00e1s\u00e1val. P\u00e9ld\u00e1ul az ActiveMQ-ban a teljes\u00edtm\u00e9ny \u00e9s a sorok, valamint a t\u00e9ma a fogyaszt\u00f3k sz\u00e1m\u00e1nak n\u00f6veked\u00e9s\u00e9vel romlik a c\u00edmzettben<\/li>\n<li>V\u00edzszintesen sk\u00e1l\u00e1zhat\u00f3nak kell lennie; ha egy br\u00f3ker, amely meg\u0151rzi az \u00fczeneteket, csak a lemez maxim\u00e1lis sebess\u00e9g\u00e9n tudja ezt megtenni, akkor \u00e9rdemes egy br\u00f3ker p\u00e9ld\u00e1nyon t\u00falmenni a teljes\u00edtm\u00e9ny n\u00f6vel\u00e9se \u00e9rdek\u00e9ben<\/li>\n<li>K\u00fcl\u00f6nb\u00f6z\u0151 hozz\u00e1f\u00e9r\u00e9st kell biztos\u00edtania az \u00fczenetek t\u00e1rol\u00e1s\u00e1hoz \u00e9s \u00fajrael\u00e9r\u00e9s\u00e9hez<\/li>\n<\/ul>\n<p>\nAhhoz, hogy mindezt el\u00e9rj\u00fck, a Kafka egy olyan architekt\u00far\u00e1t alkalmazott, amely \u00fajradefini\u00e1lta az \u00fcgyfelek \u00e9s az \u00fczenetbroker feladatait \u00e9s felel\u0151ss\u00e9geit. A JMS modell nagyon broker-orient\u00e1lt, ahol a broker felel\u0151s az \u00fczenetek terjeszt\u00e9s\u00e9\u00e9rt, m\u00edg az \u00fcgyfeleknek csak az \u00fczenetek k\u00fcld\u00e9s\u00e9vel \u00e9s fogad\u00e1s\u00e1val kell foglalkozniuk. Ezzel szemben a Kafka \u00fcgyf\u00e9lorient\u00e1lt, \u00edgy az \u00fcgyf\u00e9l sz\u00e1mos tradicion\u00e1lis broker funkci\u00f3t \u00e1tv\u00e1llal, mint p\u00e9ld\u00e1ul a megfelel\u0151 \u00fczenetek tisztess\u00e9ges eloszt\u00e1sa a fogyaszt\u00f3k k\u00f6z\u00f6tt, cser\u00e9be egy rendk\u00edv\u00fcl gyors \u00e9s sk\u00e1l\u00e1zhat\u00f3 brokeren kereszt\u00fcl. Azok sz\u00e1m\u00e1ra, akik hagyom\u00e1nyos \u00fczenetk\u00fcld\u0151 rendszerekkel dolgoztak, a Kafka haszn\u00e1latakor alapvet\u0151 v\u00e1ltoz\u00e1sokat kell v\u00e9grehajtaniuk a n\u00e9zeteikben.<br \/>\nEz a m\u00e9rn\u00f6ki ir\u00e1nyzat lehet\u0151v\u00e9 tette egy olyan \u00fczenetk\u00fcld\u0151 infrastrukt\u00fara meg\u00e9p\u00edt\u00e9s\u00e9t, amely nagys\u00e1grendekkel k\u00e9pes megn\u00f6velni a teljes\u00edtm\u00e9nyt a hagyom\u00e1nyos br\u00f3kerekhez k\u00e9pest. Ahogy l\u00e1tni fogjuk, ez a megk\u00f6zel\u00edt\u00e9s kompromisszumokkal j\u00e1r, amelyek azt jelentik, hogy a Kafka nem alkalmas bizonyos t\u00edpus\u00fa terhel\u00e9sekre \u00e9s bej\u00e1rati szoftverekre.<\/p>\n<h3>Egys\u00e9ges\u00edtett c\u00edmz\u00e9si modell<\/h3>\n<p>\nA fent eml\u00edtett k\u00f6vetelm\u00e9nyek teljes\u00edt\u00e9s\u00e9hez a Kafka egyes\u00edtette a 'k\u00f6zz\u00e9t\u00e9tel-feliratkoz\u00e1s' \u00e9s a 'pont-pont' \u00fczenetk\u00fcld\u00e9st egyetlen c\u00edmz\u00e9si t\u00edpusk\u00e9nt - <i>a t\u00e9ma<\/i>. Ez zavar\u00f3 lehet azok sz\u00e1m\u00e1ra, akik \u00fczenet forgalmaz\u00f3 rendszerekkel dolgoztak, ahol a 't\u00e9ma' a sz\u00e9lesk\u00f6r\u0171 mechanizmusra utal, ahonnan (a t\u00e9m\u00e1b\u00f3l) a leolvas\u00e1s nem megb\u00edzhat\u00f3 (is nondurable). A Kafka t\u00e9m\u00e1kat hibrid c\u00edmz\u00e9si t\u00edpusk\u00e9nt kell kezelni, a k\u00f6nyv bevezet\u0151j\u00e9ben megadott meghat\u00e1roz\u00e1snak megfelel\u0151en.<\/p>\n<blockquote><p>A fejezet h\u00e1tral\u00e9v\u0151 r\u00e9sz\u00e9ben, hacsak m\u00e1st kifejezetten nem jel\u00f6l\u00fcnk meg, a 't\u00e9ma' kifejez\u00e9s a Kafka t\u00e9m\u00e1ra fog vonatkozni.<\/p><\/blockquote>\n<p>\nA t\u00e9m\u00e1k m\u0171k\u00f6d\u00e9s\u00e9nek \u00e9s a biztos\u00edtott garanci\u00e1ik teljes meg\u00e9rt\u00e9s\u00e9hez el\u0151sz\u00f6r is meg kell vizsg\u00e1lnunk, hogyan val\u00f3sulnak meg a Kafka rendszer\u00e9ben.<br \/>\n<i>Minden Kafka t\u00e9m\u00e1nak saj\u00e1t napl\u00f3ja van.<\/i><br \/>\nA Kafka-hoz \u00fczeneteket k\u00fcld\u0151 producerek az \u00fczeneteket egy napl\u00f3ba \u00edrj\u00e1k, m\u00edg a fogyaszt\u00f3k a napl\u00f3b\u00f3l olvasnak azzal, hogy folyamatosan el\u0151re mozg\u00f3 mutat\u00f3kat haszn\u00e1lnak. Id\u0151nk\u00e9nt a Kafka elt\u00e1vol\u00edtja a legr\u00e9gebbi napl\u00f3r\u00e9szeket, f\u00fcggetlen\u00fcl att\u00f3l, hogy az ott tal\u00e1lhat\u00f3 \u00fczeneteket elolvast\u00e1k-e m\u00e1r vagy sem. A Kafka tervez\u00e9s\u00e9nek k\u00f6z\u00e9ppontj\u00e1ban az \u00e1ll, hogy a broker nem foglalkozik azzal, hogy az \u00fczeneteket elolvast\u00e1k-e vagy sem \u2014 ez a kliens felel\u0151ss\u00e9ge.<\/p>\n<blockquote><p>A 'napl\u00f3' \u00e9s a 'mutat\u00f3' kifejez\u00e9sek nem tal\u00e1lhat\u00f3ak meg <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation.html\">a Kafka dokument\u00e1ci\u00f3j\u00e1ban.<\/a><\/noindex>Ezek a j\u00f3l ismert kifejez\u00e9sek itt az\u00e9rt haszn\u00e1latosak, hogy seg\u00edtsenek a meg\u00e9rt\u00e9sben.<\/p><\/blockquote>\n<p>\nEz a modell teljesen elt\u00e9r az ActiveMQ-t\u00f3l, ahol az \u00f6sszes sorb\u00f3l sz\u00e1rmaz\u00f3 \u00fczenetek egy k\u00f6z\u00f6s napl\u00f3ban t\u00e1rol\u00f3dnak, \u00e9s a broker az \u00fczeneteket azut\u00e1n jel\u00f6li meg elt\u00e1vol\u00edtottnak, hogy el lettek olvasva.<br \/>\nMost n\u00e9zz\u00fck meg kicsit m\u00e9lyebben a t\u00e9ma napl\u00f3j\u00e1t.<br \/>\nA Kafka napl\u00f3ja t\u00f6bb part\u00edci\u00f3b\u00f3l \u00e1ll (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/tm\/w2\/yf\/tmw2yf3lanppqtrumxoidotplhi.png\">3-1. \u00e1bra<\/a><\/noindex>). A Kafka szigor\u00fa sorrendet garant\u00e1l minden part\u00edci\u00f3ban. Ez azt jelenti, hogy a part\u00edci\u00f3ba egy adott sorrendben \u00edrt \u00fczeneteket ugyanabban a sorrendben fogj\u00e1k elolvasni. Minden part\u00edci\u00f3 ciklikus (rolling) napl\u00f3f\u00e1jlk\u00e9nt van megval\u00f3s\u00edtva, amely tartalmazza <i>az \u00fczenetek egy r\u00e9szhalmaz\u00e1t <\/i>(subset) amelyek a t\u00e9m\u00e1ba a producerei \u00e1ltal lettek k\u00fcldve. Az alap\u00e9rtelmezett be\u00e1ll\u00edt\u00e1ssal l\u00e9trehozott t\u00e9ma egy part\u00edci\u00f3t tartalmaz. A part\u00edci\u00f3k \u00f6tlete a Kafka k\u00f6zponti gondolata a horizont\u00e1lis sk\u00e1l\u00e1z\u00e1s szempontj\u00e1b\u00f3l.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dczenetbr\u00f3kerek meg\u00e9rt\u00e9se. Az \u00fczenetv\u00e1lt\u00e1s mechanizmus\u00e1nak tanulm\u00e1nyoz\u00e1sa az ActiveMQ \u00e9s a Kafka seg\u00edts\u00e9g\u00e9vel. 3. fejezet. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/39f41ebcb73ec247656c0dea438158a9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>3-1. \u00e1bra. Kafka part\u00edci\u00f3k<\/i><\/p>\n<p>Amikor a producer \u00fczenetet k\u00fcld a Kafka t\u00e9m\u00e1ba, eld\u00f6nti, hogy melyik part\u00edci\u00f3ba k\u00fcldje az \u00fczenetet. Ezt k\u00e9s\u0151bb r\u00e9szletesebben is megvizsg\u00e1ljuk.<\/p>\n<h2>\u00dczenetek olvas\u00e1sa<\/h2>\n<p>\nA kliens, aki szeretn\u00e9 elolvasni az \u00fczeneteket, egy n\u00e9vvel ell\u00e1tott mutat\u00f3t kezel, amelyet <i>fogyaszt\u00f3i csoportnak (consumer group) neveznek<\/i>, amely az \u00fczenetek <i>offset poz\u00edci\u00f3j\u00e1ra mutat a part\u00edci\u00f3ban. Az offset egy n\u00f6vekv\u0151 sz\u00e1m\u00fa poz\u00edci\u00f3, amely 0-t\u00f3l kezd\u0151dik a part\u00edci\u00f3 elej\u00e9n. Ez a fogyaszt\u00f3i csoport, amelyre az API-n kereszt\u00fcl a felhaszn\u00e1l\u00f3 \u00e1ltal meghat\u00e1rozott group_id azonos\u00edt\u00f3val hivatkoznak, egy<\/i> logikai fogyaszt\u00f3t vagy rendszert k\u00e9pvisel. <i>A legt\u00f6bb \u00fczenetk\u00fcld\u0151 rendszerek p\u00e1rhuzamos feldolgoz\u00e1s \u00e9rdek\u00e9ben t\u00f6bb p\u00e9ld\u00e1nyon \u00e9s sz\u00e1lon kereszt\u00fcl olvassa az adatokat a c\u00edmzettb\u0151l. \u00cdgy \u00e1ltal\u00e1ban sok fogyaszt\u00f3i p\u00e9ld\u00e1ny fog k\u00f6z\u00f6s fogyaszt\u00f3i csoportot haszn\u00e1lni.<\/i>.<\/p>\n<p>A legt\u00f6bb \u00fczenetkezel\u0151 rendszer az adatokat a c\u00edmzett\u0151l t\u00f6bb p\u00e9ld\u00e1ny \u00e9s sz\u00e1l seg\u00edts\u00e9g\u00e9vel olvassa el az \u00fczenetek p\u00e1rhuzamos feldolgoz\u00e1s\u00e1hoz. Ennek eredm\u00e9nyek\u00e9nt \u00e1ltal\u00e1ban sok consumerek p\u00e9ld\u00e1ny osztozik az ugyanazon a fogyaszt\u00f3i csoporton.<\/p>\n<p>A probl\u00e9ma olvas\u00e1s\u00e1nak meg\u00e9rt\u00e9se a k\u00f6vetkez\u0151k\u00e9ppen lehets\u00e9ges:<\/p>\n<ul>\n<li>A t\u00e9ma t\u00f6bb part\u00edci\u00f3val rendelkezik<\/li>\n<li>A t\u00e9m\u00e1t egyszerre t\u00f6bb fogyaszt\u00f3i csoport is haszn\u00e1lhatja<\/li>\n<li>A fogyaszt\u00f3i csoportnak lehet t\u00f6bb k\u00fcl\u00f6nb\u00f6z\u0151 p\u00e9ld\u00e1nya<\/li>\n<\/ul>\n<p>\nEz nem triv\u00e1lis \u201esokaz-egyhez\u201d probl\u00e9ma. Ahhoz, hogy meg\u00e9rts\u00fck, hogyan kezeli a Kafka a kapcsolatokat a fogyaszt\u00f3i csoportok, a fogyaszt\u00f3i p\u00e9ld\u00e1nyok \u00e9s a part\u00edci\u00f3k k\u00f6z\u00f6tt, vizsg\u00e1ljuk meg n\u00e9h\u00e1ny fokozatosan bonyolultabb olvas\u00e1si forgat\u00f3k\u00f6nyvet.<\/p>\n<h3>Fogyaszt\u00f3k \u00e9s fogyaszt\u00f3i csoportok<\/h3>\n<p>\nVegy\u00fcnk kiindul\u00e1sk\u00e9nt egy t\u00e9m\u00e1t egy part\u00edci\u00f3val (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/6z\/tz\/dh\/6ztzdhqmjweck-z15htxb2xbe28.png\">\u00c1bra 3-2<\/a><\/noindex>).<\/p>\n<p><img decoding=\"async\" alt=\"\u00dczenetbr\u00f3kerek meg\u00e9rt\u00e9se. Az \u00fczenetv\u00e1lt\u00e1s mechanizmus\u00e1nak tanulm\u00e1nyoz\u00e1sa az ActiveMQ \u00e9s a Kafka seg\u00edts\u00e9g\u00e9vel. 3. fejezet. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/46c92e6bd38774dfef3be4bd198bf35d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00c1bra 3-2. A fogyaszt\u00f3 olvas a part\u00edci\u00f3b\u00f3l<\/i><\/p>\n<p>Amikor egy fogyaszt\u00f3i p\u00e9ld\u00e1ny a saj\u00e1t group_id-j\u00e1val csatlakozik ehhez a t\u00e9m\u00e1hoz, egy part\u00edci\u00f3t kap az olvas\u00e1sra \u00e9s egy offsetet a part\u00edci\u00f3ban. Ennek az offsetnek a poz\u00edci\u00f3ja a kliensben van konfigur\u00e1lva, mint mutat\u00f3 a legutols\u00f3 poz\u00edci\u00f3ra (leg\u00fajabb \u00fczenetre) vagy a legkor\u00e1bbi poz\u00edci\u00f3ra (leg\u00f6regebb \u00fczenetre). A fogyaszt\u00f3 \u00fczeneteket k\u00e9r le a t\u00e9m\u00e1b\u00f3l, ami a napl\u00f3b\u00f3l t\u00f6rt\u00e9n\u0151 sorozatos olvas\u00e1s\u00e1t eredm\u00e9nyezi.<br \/>\nAz offset poz\u00edci\u00f3j\u00e1t rendszeresen komit\u00e1lj\u00e1k vissza a Kafka-ba, \u00e9s elt\u00e1rolj\u00e1k, mint \u00fczeneteket a bels\u0151 t\u00e9m\u00e1ban <i>_consumer_offsets<\/i>. A kiolvasott \u00fczenetek nem t\u00f6rl\u0151dnek, ellent\u00e9tben a hagyom\u00e1nyos brokerrel, \u00e9s a kliens visszaforgathatja (rewind) az offsetet, hogy \u00fajra feldolgozhassa a m\u00e1r megtekintett \u00fczeneteket.<\/p>\n<p>Amikor egy m\u00e1sodik logikai fogyaszt\u00f3 csatlakozik, m\u00e1sik group_id haszn\u00e1lat\u00e1val, egy m\u00e1sodik mutat\u00f3t kezel, amely f\u00fcggetlen az els\u0151t\u0151l (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/qe\/v1\/yk\/qev1yktga3s-g1gqlynylbe3n9w.png\">\u00c1bra 3-3<\/a><\/noindex>). \u00cdgy a Kafka t\u00e9ma \u00fagy m\u0171k\u00f6dik, mint egy sor, ahol egy fogyaszt\u00f3 van, \u00e9s mint egy szok\u00e1sos t\u00e9ma, amely kiadott \u00e9s feliratkoz\u00f3 (pub-sub) modell, amelyre t\u00f6bb fogyaszt\u00f3 feliratkozik, azzal a kieg\u00e9sz\u00edt\u0151 el\u0151nnyel, hogy minden \u00fczenet megmarad \u00e9s t\u00f6bbsz\u00f6r feldolgozhat\u00f3.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dczenetbr\u00f3kerek meg\u00e9rt\u00e9se. Az \u00fczenetv\u00e1lt\u00e1s mechanizmus\u00e1nak tanulm\u00e1nyoz\u00e1sa az ActiveMQ \u00e9s a Kafka seg\u00edts\u00e9g\u00e9vel. 3. fejezet. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/e9e8b9063ef7367005254d36abb47f4f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00c1bra 3-3. K\u00e9t fogyaszt\u00f3 k\u00fcl\u00f6nb\u00f6z\u0151 fogyaszt\u00f3i csoportokb\u00f3l olvas egy part\u00edci\u00f3b\u00f3l<\/i><\/p>\n<h3>Fogyaszt\u00f3k a fogyaszt\u00f3i csoportban<\/h3>\n<p>\nAmikor egy fogyaszt\u00f3 p\u00e9ld\u00e1ny olvas adatokat a part\u00edci\u00f3b\u00f3l, teljes m\u00e9rt\u00e9kben ellen\u0151rzi a mutat\u00f3t \u00e9s feldolgozza az \u00fczeneteket, ahogyan azt az el\u0151z\u0151 r\u00e9szben le\u00edrtuk.<br \/>\nHa t\u00f6bb fogyaszt\u00f3 p\u00e9ld\u00e1ny csatlakozik ugyanazzal a group_id-vel egy olyan topikhoz, amely egy part\u00edci\u00f3val rendelkezik, akkor az utolj\u00e1ra csatlakoz\u00f3 p\u00e9ld\u00e1ny kapja meg az ir\u00e1ny\u00edt\u00e1st a mutat\u00f3 felett, \u00e9s innent\u0151l kezdve \u0151 fogja megkapni az \u00f6sszes \u00fczenetet (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/0j\/ao\/f2\/0jaof2mdwg3cqvmwemhtxkrltuq.png\">3-4. \u00e1bra<\/a><\/noindex>).<\/p>\n<p><img decoding=\"async\" alt=\"\u00dczenetbr\u00f3kerek meg\u00e9rt\u00e9se. Az \u00fczenetv\u00e1lt\u00e1s mechanizmus\u00e1nak tanulm\u00e1nyoz\u00e1sa az ActiveMQ \u00e9s a Kafka seg\u00edts\u00e9g\u00e9vel. 3. fejezet. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/ec6af819445dad4028f65449a735ae22.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>3-4. \u00e1bra. K\u00e9t fogyaszt\u00f3 ugyanabban a fogyaszt\u00f3i csoportban olvas egy part\u00edci\u00f3b\u00f3l<\/i><\/p>\n<p>Ez a feldolgoz\u00e1si m\u00f3d, amelyben a fogyaszt\u00f3i p\u00e9ld\u00e1nyok sz\u00e1ma meghaladja a part\u00edci\u00f3k sz\u00e1m\u00e1t, monopolisztikus fogyaszt\u00f3k\u00e9nt is felfoghat\u00f3. Hasznos lehet, ha akt\u00edv-passz\u00edv (vagy \u201eforr\u00f3-meleg\u201d) klaszterez\u00e9sre van sz\u00fcks\u00e9ge a fogyaszt\u00f3i p\u00e9ld\u00e1nyai k\u00f6z\u00f6tt, hab\u00e1r t\u00f6bb fogyaszt\u00f3 p\u00e1rhuzamos m\u0171k\u00f6d\u00e9se (\u201eakt\u00edv-akt\u00edv\u201d vagy \u201eforr\u00f3-forr\u00f3\u201d) sokkal jellemz\u0151bb, mint a v\u00e1rakoz\u00f3 fogyaszt\u00f3k.<\/p>\n<blockquote><p>A fenti \u00fczeneti eloszt\u00e1si viselked\u00e9s, amelyet le\u00edrtunk, meglep\u0151 lehet a hagyom\u00e1nyos JMS sorhoz k\u00e9pest. Ebben a modellben a sorba k\u00fcld\u00f6tt \u00fczenetek egyenletesen oszlanak el a k\u00e9t fogyaszt\u00f3 k\u00f6z\u00f6tt.<\/p><\/blockquote>\n<p>\nLegt\u00f6bbsz\u00f6r, amikor t\u00f6bb fogyaszt\u00f3 p\u00e9ld\u00e1nyt hozunk l\u00e9tre, ezt vagy \u00fczenetek p\u00e1rhuzamos feldolgoz\u00e1sa \u00e9rdek\u00e9ben tessz\u00fck, vagy az olvas\u00e1si sebess\u00e9g n\u00f6vel\u00e9s\u00e9re, vagy az olvas\u00e1si folyamat megb\u00edzhat\u00f3s\u00e1g\u00e1nak fokoz\u00e1s\u00e1ra. Mivel egy part\u00edci\u00f3b\u00f3l csak egy fogyaszt\u00f3 p\u00e9ld\u00e1ny olvashat egy id\u0151ben, hogyan val\u00f3sul ez meg a Kafka-ban?<\/p>\n<p>Az egyik m\u00f3dja ennek az, hogy egy fogyaszt\u00f3 p\u00e9ld\u00e1ny olvassa az \u00f6sszes \u00fczenetet, \u00e9s \u00e1tadja azokat egy sz\u00e1lpoolnak. B\u00e1r ez a megk\u00f6zel\u00edt\u00e9s n\u00f6veli a feldolgoz\u00e1s \u00e1tereszt\u0151k\u00e9pess\u00e9g\u00e9t, n\u00f6veli a fogyaszt\u00f3k logik\u00e1j\u00e1nak bonyolults\u00e1g\u00e1t, \u00e9s semmit sem tesz a rendszer olvas\u00e1s\u00e1nak megb\u00edzhat\u00f3s\u00e1ga \u00e9rdek\u00e9ben. Ha egy fogyaszt\u00f3 p\u00e9ld\u00e1ny \u00e1ramkimarad\u00e1s vagy hasonl\u00f3 esem\u00e9ny miatt le\u00e1ll, akkor az olvas\u00e1s is le\u00e1ll.<\/p>\n<p>A probl\u00e9ma klasszikus megold\u00e1sa a Kafka-ban a b<i>A<\/i>zs t\u00f6bb part\u00edci\u00f3 haszn\u00e1lata.<\/p>\n<h3>Particion\u00e1l\u00e1s<\/h3>\n<p>\nA part\u00edci\u00f3k a topik olvas\u00e1s\u00e1nak p\u00e1rhuzamos\u00edt\u00e1s\u00e1nak \u00e9s a sk\u00e1l\u00e1z\u00e1s\u00e1nak alapvet\u0151 mechanizmusai egy broker p\u00e9ld\u00e1ny \u00e1tereszt\u0151k\u00e9pess\u00e9g\u00e9n t\u00fal. Annak \u00e9rdek\u00e9ben, hogy ezt jobban meg\u00e9rts\u00fck, vegy\u00fcnk egy olyan helyzetet, amikor egy topik k\u00e9t part\u00edci\u00f3val rendelkezik, \u00e9s egy fogyaszt\u00f3 feliratkozik erre a topikra (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/en\/9g\/ct\/en9gct0o017cqp8buawguwlscty.png\">3-5. \u00e1bra<\/a><\/noindex>).<\/p>\n<p><img decoding=\"async\" alt=\"\u00dczenetbr\u00f3kerek meg\u00e9rt\u00e9se. Az \u00fczenetv\u00e1lt\u00e1s mechanizmus\u00e1nak tanulm\u00e1nyoz\u00e1sa az ActiveMQ \u00e9s a Kafka seg\u00edts\u00e9g\u00e9vel. 3. fejezet. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/cc766bf69af22698aacc3f1ac70b067f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>3-5. Egy fogyaszt\u00f3 olvas t\u00f6bb part\u00edci\u00f3b\u00f3l<\/i><\/p>\n<p>Ebben a forgat\u00f3k\u00f6nyvben a fogyaszt\u00f3 ellen\u0151rz\u00e9st kap az \u0151 group_id-hoz tartoz\u00f3 mutat\u00f3k felett mindk\u00e9t part\u00edci\u00f3ban, \u00e9s elkezdi az \u00fczenetek olvas\u00e1s\u00e1t mindk\u00e9t part\u00edci\u00f3b\u00f3l.<br \/>\nAmikor egy tov\u00e1bbi fogyaszt\u00f3 ker\u00fcl hozz\u00e1ad\u00e1sra ugyanahhoz a group_id-hoz, a Kafka \u00fajraallok\u00e1lja az egyik part\u00edci\u00f3t az els\u0151r\u0151l a m\u00e1sodikra. Ezut\u00e1n minden fogyaszt\u00f3 p\u00e9ld\u00e1ny egy part\u00edci\u00f3b\u00f3l fog olvasni a t\u00e9m\u00e1ban (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/8b\/a0\/um\/8ba0umn2yzr9yy3vztonhdfiub0.png\">3-6. \u00e1bra<\/a><\/noindex>).<\/p>\n<p>Ahhoz, hogy p\u00e1rhuzamosan 20 sz\u00e1lon dolgozzon fel \u00fczeneteket, legal\u00e1bb 20 part\u00edci\u00f3ra van sz\u00fcks\u00e9g. Ha kevesebb part\u00edci\u00f3 van, maradnak olyan fogyaszt\u00f3k, akiknek nincs mit csin\u00e1lniuk, amint az a monopol fogyaszt\u00f3k vit\u00e1j\u00e1ban m\u00e1r eml\u00edt\u00e9sre ker\u00fclt.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dczenetbr\u00f3kerek meg\u00e9rt\u00e9se. Az \u00fczenetv\u00e1lt\u00e1s mechanizmus\u00e1nak tanulm\u00e1nyoz\u00e1sa az ActiveMQ \u00e9s a Kafka seg\u00edts\u00e9g\u00e9vel. 3. fejezet. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/a3c4001e4a5b92d53b6f529b2633254a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>3-6. \u00e1bra. K\u00e9t fogyaszt\u00f3 ugyanazon fogyaszt\u00f3i csoportban k\u00fcl\u00f6nb\u00f6z\u0151 part\u00edci\u00f3kb\u00f3l olvas<\/i><\/p>\n<p>Ez a s\u00e9ma jelent\u0151sen cs\u00f6kkenti a Kafka broker m\u0171k\u00f6d\u00e9s\u00e9nek bonyolults\u00e1g\u00e1t a JMS sorok t\u00e1mogat\u00e1s\u00e1hoz sz\u00fcks\u00e9ges \u00fczenetmegoszt\u00e1shoz k\u00e9pest. Itt nem kell figyelni a k\u00f6vetkez\u0151kre:<\/p>\n<ul>\n<li>Melyik fogyaszt\u00f3nak kell megkapnia a k\u00f6vetkez\u0151 \u00fczenetet a k\u00f6rk\u00f6r\u00f6s (round-robin) megoszt\u00e1s, a jelenlegi el\u0151t\u00f6lt\u0151 pufferek kapacit\u00e1sa vagy a kor\u00e1bbi \u00fczenetek alapj\u00e1n (a JMS \u00fczenet csoportokhoz hasonl\u00f3an).<\/li>\n<li>Mely \u00fczeneteket k\u00fcldtek el milyen fogyaszt\u00f3knak, \u00e9s \u00fajra kell-e \u0151ket k\u00fcldeni hiba eset\u00e9n.<\/li>\n<\/ul>\n<p>\nA Kafka brokernek annyit kell tennie, hogy sorban tov\u00e1bb\u00edtja az \u00fczeneteket a fogyaszt\u00f3nak, amikor az utols\u00f3 k\u00e9ri \u0151ket.<\/p>\n<p>A k\u00e9r\u00e9s a p\u00e1rhuzamos olvas\u00e1sra \u00e9s a hib\u00e1s \u00fczenetek \u00fajrak\u00fcld\u00e9s\u00e9re egy\u00e1ltal\u00e1n nem t\u0171nik el \u2014 a felel\u0151ss\u00e9g egyszer\u0171en \u00e1tker\u00fcl a brokert\u0151l az \u00fcgyf\u00e9lhez. Ez azt jelenti, hogy figyelembe kell venni a k\u00f3dodban.<\/p>\n<h2>\u00dczenetek k\u00fcld\u00e9se<\/h2>\n<p>\nAz a d\u00f6nt\u00e9s, hogy melyik part\u00edci\u00f3ba k\u00fcldj\u00fck az \u00fczenetet, a mez\u0151 \u00fczenet\u00e9nek k\u00e9sz\u00edt\u0151j\u00e9nek felel\u0151ss\u00e9ge. Az, hogy meg\u00e9rts\u00fck a mechanizmust, amellyel ez t\u00f6rt\u00e9nik, el\u0151sz\u00f6r meg kell vizsg\u00e1lni, hogy val\u00f3j\u00e1ban mit k\u00fcld\u00fcnk.<\/p>\n<p>M\u00edg a JMS eset\u00e9ben \u00fczenetstrukt\u00far\u00e1t haszn\u00e1lunk metadat\u00e1val (fejl\u00e9cekkel \u00e9s tulajdons\u00e1gokkal) \u00e9s egy hasznos teherrel (payload) rendelkez\u0151 testtel, a Kafka \u00fczenete <i>egy \"kulcs-\u00e9rt\u00e9k\" p\u00e1r<\/i>A payload of the message is sent as a value. The key, on the other hand, is mainly used for partitioning and must contain <i>a business logic specific key<\/i>, to place related messages in the same partition.<\/p>\n<p>In Chapter 2, we discussed the online betting scenario where related events need to be processed in order by a single consumer:<\/p>\n<ol>\n<li>The user account is set up.<\/li>\n<li>Money is credited to the account.<\/li>\n<li>A bet is placed, which withdraws money from the account.<\/li>\n<\/ol>\n<p>\nIf each event represents a message sent to the topic, then in this case, the natural key would be the account identifier.<br \/>\nWhen a message is sent using the Kafka Producer API, it is passed to the partitioning function, which, taking into account the message and the current state of the Kafka cluster, returns the partition ID to which the message should be sent. This function is implemented in Java through the Partitioner interface.<\/p>\n<p>This interface looks as follows:<\/p>\n<pre><code class=\"java\">interface Partitioner {\n    int partition(String topic,\n        Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);\n}<\/code><\/pre>\n<p>\nThe Partitioner implementation for determining the partition uses a default key hashing algorithm (general-purpose hashing algorithm over the key) or round-robin if the key is not specified. This default value works well in most cases. However, in the future, you may want to write your own.<\/p>\n<h3>Writing your own partitioning strategy<\/h3>\n<p>\nLet's consider an example where you want to send metadata along with the message payload. The payload in our example is an instruction to deposit funds into a gaming account. The instruction is something we would like to guarantee is not modified during transmission and we want to ensure that only a trusted higher-level system can initiate this instruction. In this case, both the sending and receiving systems agree to use a signature for message authentication.<br \/>\nIn regular JMS, we simply define the property 'message signature' and add it to the message. However, Kafka does not provide us with a mechanism for transferring metadata \u2014 only key and value.<\/p>\n<p>Mivel az \u00e9rt\u00e9k a banki \u00e1tutal\u00e1s terhel\u00e9se (bank transfer payload), amelynek integrit\u00e1s\u00e1t meg szeretn\u00e9nk \u0151rizni, nincs m\u00e1s v\u00e1laszt\u00e1sunk, mint hogy meghat\u00e1rozzuk az adatszerkezetet, amelyet a kulcsban haszn\u00e1lunk. Felt\u00e9telezve, hogy sz\u00fcks\u00e9g\u00fcnk van egy fi\u00f3kazonos\u00edt\u00f3ra a part\u00edcion\u00e1l\u00e1shoz, mivel az \u00f6sszes, a fi\u00f3khoz kapcsol\u00f3d\u00f3 \u00fczenetet sorrendben kell feldolgozni, a k\u00f6vetkez\u0151 JSON szerkezetet alkotjuk meg:<\/p>\n<pre><code class=\"json\">{\n  \"signature\": \"541661622185851c248b41bf0cea7ad0\",\n  \"accountId\": \"10007865234\"\n}<\/code><\/pre>\n<p>\nMivel a al\u00e1\u00edr\u00e1s \u00e9rt\u00e9ke v\u00e1ltozni fog a terhel\u00e9s f\u00fcggv\u00e9ny\u00e9ben, a Partitioner interf\u00e9sz alap\u00e9rtelmezett hash-strat\u00e9gi\u00e1ja nem fog megb\u00edzhat\u00f3an csoportos\u00edtani a kapcsol\u00f3d\u00f3 \u00fczeneteket. Ez\u00e9rt saj\u00e1t strat\u00e9gi\u00e1t kell \u00edrnunk, amely elemzi ezt a kulcsot, \u00e9s sz\u00e9tv\u00e1lasztja (partition) a fi\u00f3kazonos\u00edt\u00f3 \u00e9rt\u00e9k\u00e9t.<\/p>\n<blockquote><p>A Kafka ellen\u0151rz\u0151 \u00f6sszegeket tartalmaz az \u00fczenetek s\u00e9r\u00fcl\u00e9s\u00e9nek \u00e9szlel\u00e9s\u00e9re a t\u00e1rol\u00f3ban, \u00e9s teljes biztons\u00e1gi funkci\u00f3kkal b\u00edr. M\u00e9g ebben az esetben is n\u00e9ha megjelennek ipar\u00e1gspecifikus k\u00f6vetelm\u00e9nyek, mint p\u00e9ld\u00e1ul az el\u0151bbiekben eml\u00edtett.<\/p><\/blockquote>\n<p>\nA felhaszn\u00e1l\u00f3i part\u00edcion\u00e1l\u00e1si strat\u00e9gi\u00e1nak biztos\u00edtania kell, hogy az \u00f6sszes kapcsol\u00f3d\u00f3 \u00fczenet ugyanabban a part\u00edci\u00f3ban legyen. B\u00e1r ez egyszer\u0171nek t\u0171nik, a k\u00f6vetelm\u00e9ny bonyolultabb\u00e1 v\u00e1lhat a kapcsol\u00f3d\u00f3 \u00fczenetek sorrendj\u00e9nek fontoss\u00e1ga \u00e9s a part\u00edci\u00f3k sz\u00e1m\u00e1nak r\u00f6gz\u00edtetts\u00e9ge miatt a t\u00e9m\u00e1ban.<\/p>\n<p>A t\u00e9m\u00e1ban a part\u00edci\u00f3k sz\u00e1ma id\u0151vel v\u00e1ltozhat, mivel \u00faj part\u00edci\u00f3kat lehet hozz\u00e1adni, ha a forgalom t\u00fall\u00e9pi az eredeti v\u00e1rakoz\u00e1sokat. \u00cdgy az \u00fczenetek kulcsai a part\u00edci\u00f3hoz kapcsolhat\u00f3k, amelybe eredetileg elk\u00fcldt\u00e9k \u0151ket, ami a producer p\u00e9ld\u00e1nyok k\u00f6z\u00f6tt elosztand\u00f3 \u00e1llapot egy r\u00e9sz\u00e9t jelenti.<\/p>\n<p>Egy m\u00e1sik t\u00e9nyez\u0151, amelyet figyelembe kell venni, az \u00fczenetek egyenletes eloszl\u00e1sa a part\u00edci\u00f3k k\u00f6z\u00f6tt. \u00c1ltal\u00e1ban a kulcsok nem oszlanak el egyenletesen az \u00fczenetek k\u00f6z\u00f6tt, \u00e9s a hash-funkci\u00f3k nem garant\u00e1lj\u00e1k az \u00fczenetek tisztess\u00e9ges eloszl\u00e1s\u00e1t kis kulcsk\u00e9szletek eset\u00e9n.<br \/>\nFontos megjegyezni, hogy b\u00e1rmilyen m\u00f3don is d\u00f6nt, hogy megossza az \u00fczeneteket, mag\u00e1t a megoszt\u00f3t esetleg \u00fajra kell haszn\u00e1lnia.<\/p>\n<p>Vizsg\u00e1ljuk meg az adat replik\u00e1ci\u00f3s k\u00f6vetelm\u00e9ny\u00e9t a k\u00fcl\u00f6nb\u00f6z\u0151 f\u00f6ldrajzi elhelyezked\u00e9s\u0171 Kafka klaszterek k\u00f6z\u00f6tt. E c\u00e9lb\u00f3l a Kafka egy MirrorMaker nev\u0171 parancssori eszk\u00f6zt biztos\u00edt, amelyet arra haszn\u00e1lnak, hogy \u00fczeneteket olvassanak ki egy klaszterb\u0151l, \u00e9s tov\u00e1bb\u00edts\u00e1k azokat egy m\u00e1sikba.<\/p>\n<p>A MirrorMaker-nek meg kell \u00e9rtenie a replik\u00e1lt t\u00e9ma kulcsait, hogy fenntartsa az \u00fczenetek viszonylagos sorrendj\u00e9t a klaszterek k\u00f6z\u00f6tti replik\u00e1ci\u00f3 sor\u00e1n, mivel a t\u00e9ma sz\u00e1m\u00e1ra a particion\u00e1l\u00e1sok sz\u00e1ma nem biztos, hogy egyezik a k\u00e9t klaszterben.<\/p>\n<p>A felhaszn\u00e1l\u00f3i particion\u00e1l\u00e1si strat\u00e9gi\u00e1k viszonylag ritk\u00e1k, mivel az alap\u00e9rtelmezett hash vagy k\u00f6rk\u00f6r\u00f6s m\u00e1sol\u00e1s a legt\u00f6bb forgat\u00f3k\u00f6nyvben sikeresen m\u0171k\u00f6dik. Azonban, ha szigor\u00fa sorrendbeli garanci\u00e1kra van sz\u00fcks\u00e9ge, vagy ha metaadatokat kell kinyerni a hasznos terhekb\u0151l, akkor a particion\u00e1l\u00e1s az, amire \u00e9rdemes jobban odafigyelnie.<\/p>\n<p>A Kafka sk\u00e1l\u00e1zhat\u00f3s\u00e1g\u00e1nak \u00e9s teljes\u00edtm\u00e9ny\u00e9nek el\u0151nyei azzal magyar\u00e1zhat\u00f3k, hogy a hagyom\u00e1nyos k\u00f6zvet\u00edt\u0151 n\u00e9h\u00e1ny feladat\u00e1t a kliensre h\u00e1r\u00edtj\u00e1k. Ebben az esetben d\u00f6nt\u00e9s sz\u00fcletik arr\u00f3l, hogy a potenci\u00e1lisan kapcsol\u00f3d\u00f3 \u00fczeneteket p\u00e1rhuzamosan m\u0171k\u00f6d\u0151 t\u00f6bb fogyaszt\u00f3n osztj\u00e1k el.<\/p>\n<blockquote><p>A JMS k\u00f6zvet\u00edt\u0151knek is foglalkozniuk kell az ilyen k\u00f6vetelm\u00e9nyekkel. \u00c9rdekes, hogy a kapcsol\u00f3d\u00f3 \u00fczenetek ugyanannak a fogyaszt\u00f3nak val\u00f3 elk\u00fcld\u00e9s\u00e9nek mechanizmusa, amelyet a JMS \u00dczenetcsoportok (sticky load balancing - SLB strat\u00e9gia) r\u00e9v\u00e9n val\u00f3s\u00edtanak meg, szint\u00e9n megk\u00f6veteli, hogy a k\u00fcld\u0151 megjel\u00f6lje az \u00fczeneteket, mint \u00f6sszekapcsoltakat. JMS eset\u00e9ben a k\u00f6zvet\u00edt\u0151 felel\u0151s az\u00e9rt, hogy egy sok k\u00f6z\u00fcl egy fogyaszt\u00f3nak k\u00fcldje el ezt a csoportot, \u00e9s \u00e1tadja a tulajdonjogot a csoport felett, ha a fogyaszt\u00f3 elromlik.<\/p><\/blockquote>\n<p><\/p>\n<h2>Kibocs\u00e1t\u00f3i meg\u00e1llapod\u00e1sok<\/h2>\n<p>\nA particion\u00e1l\u00e1s nem az egyetlen dolog, amire figyelni kell az \u00fczenetek k\u00fcld\u00e9sekor. N\u00e9zz\u00fck meg a Java API Producer oszt\u00e1ly send() m\u00f3dszereit:<\/p>\n<pre><code class=\"java\">Future  send(ProducerRecord  record);\nFuture  send(ProducerRecord  record, Callback callback);<\/code><\/pre>\n<p>\nAzonnal meg kell jegyezni, hogy mindk\u00e9t m\u00f3dszer Future-t ad vissza, ami arra utal, hogy a k\u00fcld\u00e9si m\u0171velet nem hajt\u00f3dik v\u00e9gre azonnal. Ennek eredm\u00e9nyek\u00e9nt a ProducerRecord \u00fczenet a k\u00fcld\u00e9si pufferbe ker\u00fcl minden akt\u00edv part\u00edci\u00f3 sz\u00e1m\u00e1ra, \u00e9s h\u00e1tt\u00e9rfolyamatban a Kafka kliensk\u00f6nyvt\u00e1r \u00e1tadja a brokernek. B\u00e1r ez rendk\u00edv\u00fcl gyorsan v\u00e9gzi a munk\u00e1t, azt jelenti, hogy egy tapasztalatlanul \u00edrt alkalmaz\u00e1s veszthet \u00fczeneteket, ha folyamata le\u00e1ll.<\/p>\n<p>Mint mindig, van m\u00f3d a k\u00fcld\u00e9s megb\u00edzhat\u00f3bb\u00e1 t\u00e9tel\u00e9re a teljes\u00edtm\u00e9ny rov\u00e1s\u00e1ra. Ezt a puffer m\u00e9ret\u00e9t 0-ra \u00e1ll\u00edtva el\u00e9rhetj\u00fck, \u00e9s a k\u00fcld\u0151 alkalmaz\u00e1s folyamat\u00e1nak meg kell v\u00e1rnia, am\u00edg az \u00fczenet brokerhez val\u00f3 \u00e1tad\u00e1sa befejez\u0151dik, a k\u00f6vetkez\u0151k\u00e9ppen:<\/p>\n<pre><code class=\"java\">RecordMetadata metadata = producer.send(record).get();<\/code><\/pre>\n<p><\/p>\n<h2>Ism\u00e9t a \u00fczenetek olvas\u00e1s\u00e1r\u00f3l<\/h2>\n<p>\nAz \u00fczenetek olvas\u00e1sa tov\u00e1bbi neh\u00e9zs\u00e9gekkel j\u00e1r, amelyeket meg kell vitatni. A JMS API-t\u00f3l elt\u00e9r\u0151en, amely k\u00e9pes \u00fczenetfigyel\u0151t (message listener) ind\u00edtani egy be\u00e9rkezett \u00fczenetre, a <i>Consumer <\/i>Kafka interf\u00e9sz csup\u00e1n polling-alap\u00fa. Vizsg\u00e1ljuk meg r\u00e9szletesebben a <i>poll()<\/i>m\u00f3dszert, amelyet ezen c\u00e9lra haszn\u00e1lnak:<\/p>\n<pre><code class=\"java\">ConsumerRecords poll(long timeout);<\/code><\/pre>\n<p>\nA met\u00f3dus visszat\u00e9r\u00e9si \u00e9rt\u00e9ke egy kont\u00e9ner strukt\u00fara, amely t\u00f6bb <i>ConsumerRecord <\/i>objektumot tartalmazhat t\u00f6bb part\u00edci\u00f3b\u00f3l. <i>ConsumerRecord <\/i>Ez \u00f6n\u00e1ll\u00f3 kulcs-\u00e9rt\u00e9k p\u00e1rt tartalmaz, a megfelel\u0151 metaadatokkal, mint p\u00e9ld\u00e1ul a part\u00edci\u00f3, ahonnan sz\u00e1rmazik.<\/p>\n<p>Amint azt a 2. fejezetben megvitattuk, folyamatosan eml\u00e9kezn\u00fcnk kell arra, hogy mi t\u00f6rt\u00e9nik az \u00fczenetekkel a sikeres vagy sikertelen feldolgoz\u00e1s ut\u00e1n, p\u00e9ld\u00e1ul ha a kliens nem k\u00e9pes feldolgozni az \u00fczenetet vagy ha megszak\u00edtja a munk\u00e1t. A JMS ezt a visszaigazol\u00e1si m\u00f3d (acknowledgement mode) r\u00e9v\u00e9n kezelte. A broker vagy t\u00f6rli a sikeresen feldolgozott \u00fczeneteket, vagy \u00fajra \u00e1tadja a feldolgozand\u00f3 vagy meghi\u00fasult \u00fczeneteket (felt\u00e9ve, hogy tranzakci\u00f3kat haszn\u00e1ltak). <br \/>\nA Kafka eg\u00e9szen m\u00e1sk\u00e9ppen m\u0171k\u00f6dik. Az \u00fczenetek nem t\u00f6rl\u0151dnek a brokerben a beolvas\u00e1s ut\u00e1n, \u00e9s a hiba eset\u00e9n fell\u00e9p\u0151 felel\u0151ss\u00e9g a beolvas\u00f3 k\u00f3dk\u00f3dra h\u00e1rul.<\/p>\n<p>Ahogy m\u00e1r eml\u00edtett\u00fck, a fogyaszt\u00f3k csoportja a napl\u00f3 eltol\u00f3d\u00e1s\u00e1hoz van t\u00e1rs\u00edtva. A napl\u00f3ban tal\u00e1lhat\u00f3 eltol\u00f3d\u00e1s poz\u00edci\u00f3ja megfelel a k\u00f6vetkez\u0151 \u00fczenetnek, amely a v\u00e1laszk\u00e9nt kiad\u00e1sra ker\u00fcl. <i>poll()<\/i>A d\u00f6nt\u0151 jelent\u0151s\u00e9g\u0171 az olvas\u00e1s sor\u00e1n az az id\u0151pont, amikor ez az elmozdul\u00e1s n\u00f6vekszik.<\/p>\n<p>Visszat\u00e9rve az el\u0151z\u0151leg t\u00e1rgyalt olvas\u00e1si modellhez, az \u00fczenet feldolgoz\u00e1sa h\u00e1rom l\u00e9p\u00e9sb\u0151l \u00e1ll:<\/p>\n<ol>\n<li>Az \u00fczenet kiemel\u00e9se az olvas\u00e1shoz.<\/li>\n<li>Az \u00fczenet feldolgoz\u00e1sa.<\/li>\n<li>Az \u00fczenet meger\u0151s\u00edt\u00e9se.<\/li>\n<\/ol>\n<p>\nA Kafka fogyaszt\u00f3 konfigur\u00e1l\u00e1si lehet\u0151s\u00e9get k\u00edn\u00e1l <i>enable.auto.commit<\/i>. Ez gyakran haszn\u00e1lt alap\u00e9rtelmezett be\u00e1ll\u00edt\u00e1s, ahogyan az a \"auto\" sz\u00f3t tartalmaz\u00f3 be\u00e1ll\u00edt\u00e1sokn\u00e1l szok\u00e1s.<\/p>\n<p>A Kafka 0.10 el\u0151tt a kliens, amely ezt a param\u00e9tert haszn\u00e1lta, az utols\u00f3 olvasott \u00fczenet elmozdul\u00e1s\u00e1t k\u00fcldte a k\u00f6vetkez\u0151 h\u00edv\u00e1skor <i>poll()<\/i> feldolgoz\u00e1s ut\u00e1n. Ez azt jelentette, hogy b\u00e1rmely \u00fczenet, amelyet m\u00e1r kiemeltek (fetched), \u00fajra feldolgozhat\u00f3 maradt, ha a kliens m\u00e1r feldolgozta, de v\u00e1ratlanul le\u00e1llt a h\u00edv\u00e1s el\u0151tt. <i>poll()<\/i>. Mivel a br\u00f3ker nem t\u00e1rol el semmilyen \u00e1llapotot arr\u00f3l, hogy h\u00e1nyszor olvast\u00e1k el az \u00fczenetet, a k\u00f6vetkez\u0151 fogyaszt\u00f3, aki ezt az \u00fczenetet feldolgozza, nem fog tudni arr\u00f3l, hogy t\u00f6rt\u00e9nt valami hiba. Ez a viselked\u00e9s pseudo-tranzakcion\u00e1liss\u00e1 v\u00e1lt. A cs\u00fasz\u00e1s csak akkor volt elk\u00f6nyvelve, ha az \u00fczenetet sikeresen feldolgozt\u00e1k, de ha az \u00fcgyf\u00e9l le\u00e1llt, a br\u00f3ker ugyanazt az \u00fczenetet \u00fajra elk\u00fcldte egy m\u00e1sik \u00fcgyf\u00e9lnek. Ez a viselked\u00e9s megfelelt az \u00fczenetek k\u00e9zbes\u00edt\u00e9s\u00e9nek garanci\u00e1j\u00e1nak.<i>legal\u00e1bb egyszer<\/i>A &#171;ALTER TABLE&#187; \u00e9s &#171;RENAME TABLE&#187; m\u0171veletekben t\u00e1mogat\u00e1sra ker\u00fclt a &#171;IF EXISTS&#187; felt\u00e9tel, amely lehet\u0151v\u00e9 teszi az oper\u00e1ci\u00f3 v\u00e9grehajt\u00e1s\u00e1t a t\u00e1bla l\u00e9tez\u00e9se eset\u00e9n.<\/p>\n<p>A Kafka 0.10 verzi\u00f3j\u00e1ban a kliens k\u00f3dj\u00e1t \u00fagy m\u00f3dos\u00edtott\u00e1k, hogy az elk\u00f6telez\u00e9s id\u0151szakosan elindult a kliens k\u00f6nyvt\u00e1r r\u00e9v\u00e9n, a be\u00e1ll\u00edt\u00e1snak megfelel\u0151en <i>auto.commit.interval.ms<\/i>. Ez a viselked\u00e9s valahol a JMS AUTO_ACKNOWLEDGE \u00e9s DUPS_OK_ACKNOWLEDGE m\u00f3djai k\u00f6z\u00f6tt helyezkedik el. Az automatikus elk\u00f6telez\u00e9s haszn\u00e1latakor az \u00fczenetek akkor is meger\u0151s\u00edthet\u0151k voltak, ha t\u00e9nylegesen nem dolgozt\u00e1k fel \u0151ket - ez el\u0151fordulhatott lass\u00fa fogyaszt\u00f3 eset\u00e9n. Ha a fogyaszt\u00f3 le\u00e1llt, az \u00fczeneteket a k\u00f6vetkez\u0151 fogyaszt\u00f3 az elk\u00f6telezett poz\u00edci\u00f3t\u00f3l kezdve emelte ki, ami \u00fczenetek kihagy\u00e1s\u00e1hoz vezethetett. Ilyen esetekben a Kafka nem vesz\u00edtett \u00fczeneteket, a leolvas\u00f3 k\u00f3d egyszer\u0171en nem dolgozta fel azokat.<\/p>\n<p>Ez a m\u00f3d ugyanazokat a kil\u00e1t\u00e1sokat k\u00edn\u00e1lja, mint a 0.9-es verzi\u00f3ban: az \u00fczenetek feldolgozhat\u00f3k, de hiba eset\u00e9n az elmozdul\u00e1s el\u0151fordulhat, hogy nem ker\u00fclt elk\u00f6telez\u00e9sre, ami potenci\u00e1lisan dupl\u00e1zott k\u00fcld\u00e9st eredm\u00e9nyezhet. Min\u00e9l t\u00f6bb \u00fczenetet emelsz ki v\u00e9grehajt\u00e1s k\u00f6zben <i>poll()<\/i>, ann\u00e1l nagyobb ez a probl\u00e9ma.<\/p>\n<p>Ahogy azt a \"\u00dczenetek olvas\u00e1sa a sorb\u00f3l\" c\u00edm\u0171 r\u00e9szben a 21. oldalon t\u00e1rgyaltuk, a \u00fczenetk\u00fcld\u0151 rendszerben nincs olyan fogalom, mint az \u00fczenet egyszeri k\u00e9zbes\u00edt\u00e9se, ha figyelembe vessz\u00fck a hiba\u00e1raml\u00e1s m\u00f3djait.<\/p>\n<p>A Kafka-ban k\u00e9t m\u00f3dszer l\u00e9tezik az eltol\u00f3d\u00e1s (offset) r\u00f6gz\u00edt\u00e9s\u00e9re (committ\u00e1l\u00e1s\u00e1ra): automatikusan \u00e9s manu\u00e1lisan. Mindk\u00e9t esetben az \u00fczenetek t\u00f6bbsz\u00f6r is feldolgozhat\u00f3k, ha az \u00fczenet m\u00e1r feldolgoz\u00e1sra ker\u00fclt, de a commit el\u0151tt hiba t\u00f6rt\u00e9nt. Azt is megteheti, hogy egy\u00e1ltal\u00e1n nem dolgozza fel az \u00fczenetet, ha a commit a h\u00e1tt\u00e9rben megt\u00f6rt\u00e9nt, \u00e9s a k\u00f3dja befejez\u0151d\u00f6tt, miel\u0151tt elkezdte volna a feldolgoz\u00e1st (val\u00f3sz\u00edn\u0171leg a Kafka 0.9-es \u00e9s kor\u00e1bbi verzi\u00f3iban).<\/p>\n<p>A commit eltol\u00f3d\u00e1s folyamat\u00e1nak manu\u00e1lis kezel\u00e9s\u00e9re a Kafka fogyaszt\u00f3 API-j\u00e1ban \u00e1ll\u00edtsa be a param\u00e9tert <i>enable.auto.commit<\/i> hamisra, \u00e9s egy\u00e9rtelm\u0171en h\u00edvja meg az al\u00e1bbi m\u00f3dszerek egyik\u00e9t:<\/p>\n<pre><code class=\"java\">void commitSync();\nvoid commitAsync();<\/code><\/pre>\n<p>\nHa arra t\u00f6rekszik, hogy az \u00fczenetet \"b\u00e1r legal\u00e1bb egyszer\" feldolgozza, manu\u00e1lisan kell elk\u00f6teleznie az eltol\u00f3d\u00e1st a <i>commitSync ()<\/i>, ezt a parancsot k\u00f6zvetlen\u00fcl az \u00fczenetek feldolgoz\u00e1sa ut\u00e1n kell v\u00e9grehajtani.<\/p>\n<p>Ezek a m\u00f3dszerek nem teszik lehet\u0151v\u00e9 az \u00fczenetek meger\u0151s\u00edt\u00e9s\u00e9t (acknowledged) a feldolgoz\u00e1s el\u0151tt, de nem tesznek semmit a potenci\u00e1lis feldolgoz\u00e1si duplik\u00e1ci\u00f3k megsz\u00fcntet\u00e9se \u00e9rdek\u00e9ben, mik\u00f6zben tranzakci\u00f3s l\u00e1tszatot teremtenek. A Kafka-ban nincsenek tranzakci\u00f3k. A kliensnek nincs lehet\u0151s\u00e9ge arra, hogy a k\u00f6vetkez\u0151ket tegye:<\/p>\n<ul>\n<li>Automatikusan visszag\u00f6rgesse (roll back) a sikertelen \u00fczenetet. A fogyaszt\u00f3knak maguknak kell kezelni\u00fck a hib\u00e1kat, amelyek probl\u00e9m\u00e1s payload-okb\u00f3l \u00e9s h\u00e1tt\u00e9rkiad\u00e1sokb\u00f3l sz\u00e1rmaznak, mivel nem t\u00e1maszkodhatnak arra, hogy a broker \u00fajra k\u00e9zbes\u00edti az \u00fczeneteket.<\/li>\n<li>\u00dczeneteket k\u00fcldeni t\u00f6bb topik sz\u00e1m\u00e1ra egyetlen atomikus m\u0171veleten bel\u00fcl. Ahogy hamarosan l\u00e1tni fogjuk, a k\u00fcl\u00f6nb\u00f6z\u0151 topikok \u00e9s part\u00edci\u00f3k f\u00f6l\u00f6tti ellen\u0151rz\u00e9s a Kafka klaszter k\u00fcl\u00f6nb\u00f6z\u0151 g\u00e9pein lehet, amelyek nem koordin\u00e1lj\u00e1k a tranzakci\u00f3kat a k\u00fcld\u00e9s sor\u00e1n. Az \u00edr\u00e1s id\u0151pontj\u00e1ban bizonyos l\u00e9p\u00e9seket tettek ennek lehet\u0151v\u00e9 t\u00e9tel\u00e9re a KIP-98 seg\u00edts\u00e9g\u00e9vel.<\/li>\n<li>\u00d6sszekapcsolni egy \u00fczenet olvas\u00e1s\u00e1t egy topikb\u00f3l egy m\u00e1sik \u00fczenet k\u00fcld\u00e9s\u00e9vel egy m\u00e1sik topikba. Ism\u00e9t, a Kafka architekt\u00far\u00e1ja sz\u00e1mos f\u00fcggetlen g\u00e9pre t\u00e1maszkodik, amelyek egy buszk\u00e9nt m\u0171k\u00f6dnek, \u00e9s nem tesznek semmilyen k\u00eds\u00e9rletet erre a rejtett feldolgoz\u00e1sra. P\u00e9ld\u00e1ul nem l\u00e9teznek API komponensek, amelyek lehet\u0151v\u00e9 tenn\u00e9k a <i>Fogyaszt\u00f3 <\/i>\u00e9s <i>Termel\u0151 <\/i>a tranzakci\u00f3ban. A JMS-ben ezt az objektum biztos\u00edtja <i>Session<\/i>, amelyb\u0151l k\u00e9sz\u00fclnek <i>MessageProducers <\/i>\u00e9s <i>MessageConsumers<\/i>.<\/li>\n<\/ul>\n<p>\nHa nem t\u00e1maszkodhatunk a tranzakci\u00f3kra, hogyan biztos\u00edthatjuk a szemantik\u00e1t, amely k\u00f6zelebb \u00e1ll ahhoz, amit a hagyom\u00e1nyos \u00fczenetk\u00fcld\u0151 rendszerek ny\u00fajtanak?<\/p>\n<p>Ha fenn\u00e1ll a lehet\u0151s\u00e9ge annak, hogy a fogyaszt\u00f3 eltol\u00f3d\u00e1sa n\u0151, miel\u0151tt az \u00fczenetet feldolgozt\u00e1k, p\u00e9ld\u00e1ul a fogyaszt\u00f3 meghib\u00e1sod\u00e1sa sor\u00e1n, akkor a fogyaszt\u00f3nak nincs m\u00f3dja arra, hogy megtudja, hogy a fogyaszt\u00f3i csoport kihagyott-e \u00fczeneteket, amikor a part\u00edci\u00f3t hozz\u00e1rendelik neki. Teh\u00e1t az egyik strat\u00e9gia a visszatekint\u00e9s (rewind) az eltol\u00e1s kor\u00e1bbi poz\u00edci\u00f3j\u00e1ra. A Kafka fogyaszt\u00f3 API-ja a k\u00f6vetkez\u0151 m\u00f3dszereket biztos\u00edt erre:<\/p>\n<pre><code class=\"java\">void seek(TopicPartition partition, long offset);\nvoid seekToBeginning(Collection  partitions);<\/code><\/pre>\n<p>\nM\u00f3dszer <i>seek ()<\/i> haszn\u00e1lhat\u00f3 a k\u00f6vetkez\u0151 m\u00f3dszerrel <br \/>\n<i>offsetsForTimes (Map timestampsToSearch)<\/i> egy adott m\u00faltbeli id\u0151pontba val\u00f3 visszateker\u00e9shez.<\/p>\n<p>Implicit m\u00f3don ennek a megk\u00f6zel\u00edt\u00e9snek a haszn\u00e1lata azt jelenti, hogy val\u00f3sz\u00edn\u0171leg n\u00e9h\u00e1ny kor\u00e1bban feldolgozott \u00fczenetet \u00fajraolvasnak \u00e9s feldolgoznak. Ennek elker\u00fcl\u00e9se \u00e9rdek\u00e9ben haszn\u00e1lhatjuk az idempotens olvas\u00e1st, ahogy a 4. fejezetben ismertetj\u00fck, hogy nyomon k\u00f6vethess\u00fck a kor\u00e1bban megtekintett \u00fczeneteket \u00e9s kiz\u00e1rhassuk a duplik\u00e1tumokat.<\/p>\n<p>Alternat\u00edvak\u00e9nt a fogyaszt\u00f3 k\u00f3dja egyszer\u0171 lehet, ha megengedett az \u00fczenetek elveszt\u00e9se vagy duplik\u00e1l\u00e1sa. Amikor azokra a felhaszn\u00e1l\u00e1si forgat\u00f3k\u00f6nyvekre gondolunk, amelyeket a Kafka jellemz\u0151en haszn\u00e1l, p\u00e9ld\u00e1ul napl\u00f3z\u00e1s, metrik\u00e1k, kattint\u00e1sk\u00f6vet\u00e9s stb., meg\u00e9rtj\u00fck, hogy egyes \u00fczenetek elveszt\u00e9se val\u00f3sz\u00edn\u0171leg nem jelent\u0151s hat\u00e1ssal lesz a k\u00f6rnyez\u0151 alkalmaz\u00e1sokra. Ilyen esetekben az alap\u00e9rt\u00e9kek teljesen elfogadhat\u00f3k. M\u00e1sr\u00e9szt, ha az alkalmaz\u00e1s\u00e1nak sz\u00fcks\u00e9ge van a kifizet\u00e9sek tov\u00e1bb\u00edt\u00e1s\u00e1ra, akkor gondosan kell b\u00e1nni minden egyes \u00fczenettel. Mindez a kontextus k\u00e9rd\u00e9se.<\/p>\n<p>Szem\u00e9lyes megfigyel\u00e9sek azt mutatj\u00e1k, hogy az \u00fczenetek intenzit\u00e1s\u00e1nak n\u00f6veked\u00e9s\u00e9vel minden egyes \u00fczenet \u00e9rt\u00e9ke cs\u00f6kken. A nagy mennyis\u00e9g\u0171 \u00fczenetek \u00e1ltal\u00e1ban \u00e9rt\u00e9kesebbek aggreg\u00e1lt form\u00e1ban t\u00f6rt\u00e9n\u0151 vizsg\u00e1lat sor\u00e1n.<\/p>\n<h2>Magas rendelkez\u00e9sre \u00e1ll\u00e1s (High Availability)<\/h2>\n<p>\nA Kafka megk\u00f6zel\u00edt\u00e9se a magas rendelkez\u00e9sre \u00e1ll\u00e1ssal szemben l\u00e9nyegesen elt\u00e9r az ActiveMQ-t\u00f3l. A Kafka v\u00edzszintesen sk\u00e1l\u00e1zhat\u00f3 klaszterekre \u00e9p\u00fcl, amelyben minden egyes br\u00f3ker p\u00e9ld\u00e1ny egyszerre fogad \u00e9s k\u00fcld \u00fczeneteket.<\/p>\n<p>A Kafka klaszter t\u00f6bb br\u00f3ker p\u00e9ld\u00e1nyb\u00f3l \u00e1ll, amelyek k\u00fcl\u00f6nb\u00f6z\u0151 szervereken m\u0171k\u00f6dnek. A Kafka \u00fagy lett tervezve, hogy \u00e1ltal\u00e1nos f\u00e9mhardvereken fusson, ahol minden egyes csom\u00f3pontnak saj\u00e1t dedik\u00e1lt t\u00e1rol\u00f3ja van. H\u00e1l\u00f3zati t\u00e1rol\u00f3k (SAN) haszn\u00e1lata nem aj\u00e1nlott, mivel a t\u00f6bb sz\u00e1m\u00edt\u00e1si csom\u00f3pont p\u00e1rhuzamosan k\u00fczdhet az t\u00e1rol\u00e1si id\u0151intervallumok\u00e9rt \u00e9s konfliktusokat okozhat.<i>A<\/i>t\u00e1rol\u00e1si intervallumok \u00e9s konfliktusok keletkezhetnek.<\/p>\n<p>A Kafka egy <i>folyamatosan m\u0171k\u00f6d\u0151<\/i> rendszer. Sz\u00e1mos nagy felhaszn\u00e1l\u00f3 soha nem kapcsolja ki a klasztereiket, \u00e9s a szoftver mindig folyamatos friss\u00edt\u00e9seket biztos\u00edt soros \u00fajraind\u00edt\u00e1ssal. Ez a kor\u00e1bbi verzi\u00f3k kompatibilit\u00e1s\u00e1nak garant\u00e1l\u00e1s\u00e1val \u00e9rthet\u0151 el az \u00fczenetek \u00e9s a br\u00f3kerek k\u00f6z\u00f6tti interakci\u00f3k eset\u00e9n.<\/p>\n<p>A br\u00f3kerek a <noindex><a rel=\"nofollow\" href=\"http:\/\/zookeeper.apache.org\">ZooKeeperhez<\/a><\/noindex>, amely a konfigur\u00e1ci\u00f3s adatok nyilv\u00e1ntart\u00e1sak\u00e9nt m\u0171k\u00f6dik, csatlakoznak, \u00e9s az egyes br\u00f3kerek szerepeinek koordin\u00e1l\u00e1s\u00e1ra szolg\u00e1l. A ZooKeeper maga is egy elosztott rendszer, amely biztos\u00edtja a magas rendelkez\u00e9sre \u00e1ll\u00e1st az inform\u00e1ci\u00f3k replik\u00e1l\u00e1s\u00e1val a <i>kvorum<\/i>.<\/p>\n<p>megalap\u00edt\u00e1s\u00e1val.<\/p>\n<ul>\n<li>Alap\u00e9rtelmezett esetben a t\u00e9ma l\u00e9trej\u00f6n a Kafka klaszterben a k\u00f6vetkez\u0151 tulajdons\u00e1gokkal:<\/li>\n<li>A part\u00edci\u00f3k sz\u00e1ma. Ahogy kor\u00e1bban is besz\u00e9lt\u00fcnk r\u00f3la, az itt haszn\u00e1lt pontos \u00e9rt\u00e9k a k\u00edv\u00e1nt p\u00e1rhuzamos olvas\u00e1si szintt\u0151l f\u00fcgg.<\/li>\n<\/ul>\n<p>\nA replik\u00e1ci\u00f3s t\u00e9nyez\u0151 meghat\u00e1rozza, hogy a klaszterben h\u00e1ny br\u00f3ker p\u00e9ld\u00e1nynak kell tartalmaznia a napl\u00f3kat a part\u00edci\u00f3 sz\u00e1m\u00e1ra.<\/p>\n<p>A ZooKeeper koordin\u00e1ci\u00f3j\u00e1val a Kafka pr\u00f3b\u00e1lja igazs\u00e1gosan elosztani az \u00faj part\u00edci\u00f3kat a klaszter br\u00f3kerei k\u00f6z\u00f6tt. Ezt egy p\u00e9ld\u00e1ny v\u00e9gzi, amely a Kontroller szerep\u00e9t t\u00f6lti be. <i>Fut\u00e1sid\u0151ben<\/i> <i>Ir\u00e1ny\u00edt\u00f3 <\/i>a t\u00e9ma minden part\u00edci\u00f3j\u00e1hoz br\u00f3ker szerepeket <i>vezet\u0151nek <\/i>(leader, master) \u00e9s <i>sz\u00e1mos nyelven. \u00c9s most megpr\u00f3b\u00e1ljuk alkalmazni a hasonl\u00f3 filoz\u00f3fi\u00e1t a SQL-k\u00f3d elk\u00fcl\u00f6n\u00edt\u00e9s\u00e9re az \u00f6sszes t\u00f6bbit\u0151l, messze az ORM-en t\u00fal. <\/i>(k\u00f6vet\u0151k, rabszolg\u00e1k, al\u00e1rendelt szem\u00e9lyek). A br\u00f3ker, aki vezet\u0151k\u00e9nt m\u0171k\u00f6dik az adott partici\u00f3n\u00e1l, felel\u0151s minden producer \u00e1ltal k\u00fcld\u00f6tt \u00fczenet fogad\u00e1s\u00e1\u00e9rt \u00e9s az \u00fczenetek eloszt\u00e1s\u00e1\u00e9rt a fogyaszt\u00f3k sz\u00e1m\u00e1ra. Amikor \u00fczeneteket k\u00fcldenek a t\u00e9ma partici\u00f3j\u00e1ba, azokat reproduk\u00e1lj\u00e1k az \u00f6sszes br\u00f3ker csom\u00f3ponton, amelyek k\u00f6vet\u0151kk\u00e9nt m\u0171k\u00f6dnek ezen partici\u00f3 sz\u00e1m\u00e1ra. Minden csom\u00f3pont, amely napl\u00f3kat tartalmaz a partici\u00f3hoz, <i>reprodukci\u00f3nak<\/i>nevezik. A br\u00f3ker lehet vezet\u0151 egyes partici\u00f3k eset\u00e9ben \u00e9s k\u00f6vet\u0151 m\u00e1sok eset\u00e9ben.<\/p>\n<p>A k\u00f6vet\u0151, amely minden \u00fczenetet tartalmaz, amely a vezet\u0151n\u00e9l van, <i>szinkroniz\u00e1lt replik\u00e1nak<\/i> (szinkroniz\u00e1lt \u00e1llapot\u00fa replik\u00e1nak, in-sync replica). Ha a br\u00f3ker, aki vezet\u0151k\u00e9nt m\u0171k\u00f6dik a partici\u00f3 sz\u00e1m\u00e1ra, le\u00e1ll, b\u00e1rmely br\u00f3ker, amely aktu\u00e1lisan vagy szinkroniz\u00e1lt \u00e1llapotban van ezen partici\u00f3 sz\u00e1m\u00e1ra, \u00e1tveheti a vezet\u0151 szerep\u00e9t. Ez egy rendk\u00edv\u00fcl ellen\u00e1ll\u00f3 diz\u00e1jn.<\/p>\n<p>A producer konfigur\u00e1ci\u00f3j\u00e1nak r\u00e9sze a <i>acks<\/i>param\u00e9ter, amely meghat\u00e1rozza, hogy h\u00e1ny replik\u00e1nak kell meger\u0151s\u00edtenie (acknowledge) az \u00fczenet fogad\u00e1s\u00e1t, miel\u0151tt az alkalmaz\u00e1s folytatja az \u00fczenetek k\u00fcld\u00e9s\u00e9t: 0, 1 vagy mind. Ha a <i>mind<\/i>\u00e9rt\u00e9k van megadva, akkor amikor az \u00fczenetet megkapja, a vezet\u0151 meger\u0151s\u00edt\u00e9st (confirmation) k\u00fcld vissza a producernek, amint megkapja a r\u00f6gz\u00edtett replik\u00e1kt\u00f3l (bele\u00e9rtve saj\u00e1t mag\u00e1t) a megnyugtat\u00e1sokat (acknowledgements), amelyeket a t\u00e9ma be\u00e1ll\u00edt\u00e1sa hat\u00e1roz meg <i>min.insync.replicas<\/i> (alap\u00e9rtelmezett 1). Ha az \u00fczenetet nem siker\u00fcl megfelel\u0151en reproduk\u00e1lni, akkor a producer kiv\u00e1lt egy kiv\u00e9telt az alkalmaz\u00e1s sz\u00e1m\u00e1ra (<i>NotEnoughReplicas<\/i> vagy <i>NotEnoughReplicasAfterAppend<\/i>).<\/p>\n<p>A tipikus konfigur\u00e1ci\u00f3ban egy t\u00e9ma van l\u00e9trehozva 3-as replik\u00e1ci\u00f3s ar\u00e1nnyal (1 vezet\u0151, 2 k\u00f6vet\u0151 minden partici\u00f3 sz\u00e1m\u00e1ra) \u00e9s a <i>min.insync.replicas<\/i> param\u00e9ter 2-re van be\u00e1ll\u00edtva. Ebben az esetben a klaszter lehet\u0151v\u00e9 teszi, hogy az egyik br\u00f3ker, aki a t\u00e9ma partici\u00f3j\u00e1t ir\u00e1ny\u00edtja, le\u00e1lljon an\u00e9lk\u00fcl, hogy hat\u00e1ssal lenne az \u00fcgyf\u00e9lalkalmaz\u00e1sokra.<\/p>\n<p>Ez visszavisz minket az ismert kompromissz\u00e1hoz a teljes\u00edtm\u00e9ny \u00e9s a megb\u00edzhat\u00f3s\u00e1g k\u00f6z\u00f6tt. A replik\u00e1ci\u00f3 a k\u00f6vet\u0151k meger\u0151s\u00edt\u00e9sei (acknowledgments) fogad\u00e1s\u00e1hoz sz\u00fcks\u00e9ges plusz v\u00e1rakoz\u00e1si id\u0151 r\u00e9v\u00e9n t\u00f6rt\u00e9nik. B\u00e1r mivel p\u00e1rhuzamosan zajlik, legal\u00e1bb h\u00e1rom csom\u00f3ponton t\u00f6rt\u00e9n\u0151 replik\u00e1l\u00e1s ugyan\u00fagy teljes\u00edt, mint kett\u0151 (figyelmen k\u00edv\u00fcl hagyva a tov\u00e1bbi h\u00e1l\u00f3zati s\u00e1vsz\u00e9less\u00e9ghaszn\u00e1latot).<\/p>\n<p>Ezen a replik\u00e1ci\u00f3s s\u00e9m\u00e1n kereszt\u00fcl a Kafka \u00fcgyesen elker\u00fcli, hogy minden \u00fczenetet fizikailag le kellene \u00edrnia a lemezen a <i>sync ()<\/i>. Minden \u00fczenet, amelyet a producer elk\u00fcld, a part\u00edci\u00f3 napl\u00f3j\u00e1ba lesz \u00edrva, de ahogy azt a 2. fejezetben t\u00e1rgyaltuk, a f\u00e1jlba t\u00f6rt\u00e9n\u0151 \u00edr\u00e1s kezdetben a rendszeroper\u00e1ci\u00f3s mem\u00f3ria puffer\u00e9ben t\u00f6rt\u00e9nik. Ha ez az \u00fczenet \u00e1tker\u00fcl egy m\u00e1sik Kafka p\u00e9ld\u00e1nyra \u00e9s az annak mem\u00f3ri\u00e1j\u00e1ban tal\u00e1lhat\u00f3, a vezet\u0151 elveszt\u00e9se nem jelenti azt, hogy maga az \u00fczenet is elveszett \u2014 azt egy szinkroniz\u00e1lt replik\u00e1nak \u00e1tadhatj\u00e1k.<br \/>\nA m\u0171velet elv\u00e9gz\u00e9s\u00e9nek sz\u00fcks\u00e9gess\u00e9ge <i>sync ()<\/i> azt jelenti, hogy a Kafka olyan sebess\u00e9ggel k\u00e9pes fogadni az \u00fczeneteket, ahogyan azokat a mem\u00f3ri\u00e1ban r\u00f6gz\u00edteni tudja. \u00c9s ford\u00edtva, min\u00e9l tov\u00e1bb lehet elker\u00fclni a mem\u00f3ria lemezre \u00edr\u00e1s\u00e1t, ann\u00e1l jobb. Emiatt nem ritka, hogy a Kafka broker-ek 64 GB mem\u00f3ri\u00e1t vagy ann\u00e1l t\u00f6bbet kapnak. Ez a mem\u00f3riahaszn\u00e1lat lehet\u0151v\u00e9 teszi, hogy egy Kafka p\u00e9ld\u00e1ny k\u00f6nnyed\u00e9n m\u0171k\u00f6dj\u00f6n t\u00f6bb ezer alkalommal gyorsabban, mint a hagyom\u00e1nyos \u00fczenetbr\u00f3kerek.<\/p>\n<p>A Kafka be\u00e1ll\u00edthat\u00f3 \u00fagy is, hogy a <i>sync ()<\/i> \u00fczenetcsomagokra alkalmazza a m\u0171veletet. Mivel a Kafka minden az \u00fczenetcsomagok k\u00f6r\u00e9 \u00e9p\u00fcl, ez val\u00f3j\u00e1ban el\u00e9g j\u00f3l m\u0171k\u00f6dik sz\u00e1mos felhaszn\u00e1l\u00e1si szcen\u00e1ri\u00f3ban, \u00e9s hasznos eszk\u00f6z azok sz\u00e1m\u00e1ra, akik er\u0151s garanci\u00e1kat ig\u00e9nyelnek. A Kafka tiszta teljes\u00edtm\u00e9ny\u00e9nek nagy r\u00e9sze a brokerhez csomagokban k\u00fcld\u00f6tt \u00fczenetekhez kapcsol\u00f3dik, \u00e9s azok olvas\u00e1s\u00e1hoz a brokerb\u0151l folyamatos blokkokban <noindex><a rel=\"nofollow\" href=\"http:\/\/www.linuxjournal.com\/article\/6345\">zero-copy<\/a><\/noindex> m\u0171veletek (olyan m\u0171veletek, amelyek sor\u00e1n nem t\u00f6rt\u00e9nik adatm\u00e1sol\u00e1s az egyik mem\u00f3riahelyr\u0151l a m\u00e1sikra). Az ut\u00f3bbi tekintet\u00e9ben jelent\u0151s teljes\u00edtm\u00e9ny- \u00e9s er\u0151forr\u00e1snyeres\u00e9get jelent, \u00e9s csak a part\u00edci\u00f3s s\u00e9m\u00e1t meghat\u00e1roz\u00f3 alapul szolg\u00e1l\u00f3 napl\u00f3szerkezet haszn\u00e1lat\u00e1nak k\u00f6sz\u00f6nhet\u0151.<\/p>\n<p>A Kafka klaszterben sokkal magasabb teljes\u00edtm\u00e9ny \u00e9rhet\u0151 el, mint egyetlen Kafka broker haszn\u00e1lat\u00e1val, mivel a t\u00e9ma part\u00edci\u00f3i v\u00edzszintesen sk\u00e1l\u00e1zhat\u00f3k sz\u00e1mos k\u00fcl\u00f6n\u00e1ll\u00f3 g\u00e9pen.<\/p>\n<h2>\u00d6sszegz\u00e9s<\/h2>\n<p>\nEbben a fejezetben azt vizsg\u00e1ltuk, hogy a Kafka architekt\u00far\u00e1ja hogyan gondolja \u00fajra a kapcsolatok kezel\u00e9s\u00e9t az \u00fcgyfelek \u00e9s a br\u00f3kerek k\u00f6z\u00f6tt, hogy rendk\u00edv\u00fcl megb\u00edzhat\u00f3 \u00fczenetv\u00e1lt\u00e1si csatorn\u00e1t biztos\u00edtson, amelynek \u00e1tereszt\u0151k\u00e9pess\u00e9ge sokszorosa a hagyom\u00e1nyos \u00fczenetbr\u00f3ker\u00e9nek. Megbesz\u00e9lt\u00fck azokat a funkci\u00f3kat, amelyeket ehhez a c\u00e9lhoz haszn\u00e1l, \u00e9s r\u00f6viden \u00e1ttekintett\u00fck azokat az alkalmaz\u00e1sarchitekt\u00far\u00e1kat, amelyek biztos\u00edtj\u00e1k ezeket a funkci\u00f3kat. A k\u00f6vetkez\u0151 fejezetben a l\u00e9tez\u0151 \u00fczenetkezel\u0151 alap\u00fa alkalmaz\u00e1sokat \u00e9rint\u0151 \u00e1ltal\u00e1nos probl\u00e9m\u00e1kat fogjuk megvizsg\u00e1lni, \u00e9s megvitatjuk a megold\u00e1si strat\u00e9gi\u00e1kat. A fejezetet azzal z\u00e1rjuk, hogy v\u00e1zoljuk, hogyan lehet az \u00fczenetk\u00fcld\u0151 technol\u00f3gi\u00e1kr\u00f3l \u00e1ltal\u00e1ban gondolkodni, hogy felm\u00e9rhesse azok megfelel\u0151s\u00e9g\u00e9t az \u00d6n felhaszn\u00e1l\u00e1si forgat\u00f3k\u00f6nyveihez.<\/p>\n<p>Az el\u0151z\u0151 ford\u00edtott r\u00e9sz: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/466385\/\">\u00dczenetbr\u00f3kerek meg\u00e9rt\u00e9se. Az \u00fczenetek cser\u00e9j\u00e9nek mechanik\u00e1j\u00e1nak tanulm\u00e1nyoz\u00e1sa az ActiveMQ \u00e9s a Kafka seg\u00edts\u00e9g\u00e9vel. 1. fejezet<\/a><\/noindex><\/p>\n<p><b> Ford\u00edt\u00e1s befejezve: <noindex><a rel=\"nofollow\" href=\"http:\/\/tele.gg\/middle_java\">tele.gg\/middle_java<\/a><\/noindex><\/b><\/p>\n<p><i>Folytat\u00e1sa k\u00f6vetkezik\u2026<\/i><\/p>\n<p class=\"for_users_only_msg\">Csak a regisztr\u00e1lt felhaszn\u00e1l\u00f3k vehetnek r\u00e9szt a szavaz\u00e1son. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">K\u00e9rem, jelentkezzen be.<\/a><\/noindex>, k\u00e9rem.<\/p>\n<h2 class=\"default-block__polling-title\">Haszn\u00e1lja a Kafk\u00e1t a szervezet\u00e9ben?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Igen<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nem<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    R\u00e9gebben haszn\u00e1ltuk, de most nem<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Tervez\u00fcnk haszn\u00e1lni<\/p>\n<\/li>\n<\/ul>\n<p>    38 felhaszn\u00e1l\u00f3 szavazott. 8 felhaszn\u00e1l\u00f3 tart\u00f3zkodott.<br \/>\n<br \/>Forr\u00e1s: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/466585\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043d\u0438\u0433\u0438: \u00abUnderstanding Message Brokers\u00bb, \u0430\u0432\u0442\u043e\u0440: Jakub Korab, \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: O&#8217;Reilly Media, Inc., \u0434\u0430\u0442\u0430 \u0438\u0437\u0434\u0430\u043d\u0438\u044f: June 2017, ISBN: 9781492049296. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c: \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c ActiveMQ \u0438 Kafka. \u0413\u043b\u0430\u0432\u0430 1. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0413\u041b\u0410\u0412\u0410 3 Kafka Kafka \u0431\u044b\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0432 LinkedIn \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 [&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-38172","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=\"description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043d\u0438\u0433\u0438: \u00abUnderstanding Message Brokers\u00bb, \u0430\u0432\u0442\u043e\u0440: Jakub Korab, \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: O&#039;Reilly Media, Inc., \u0434\u0430\u0442\u0430 \u0438\u0437\u0434\u0430\u043d\u0438\u044f: June 2017, ISBN: 9781492049296. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f.\" \/>\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\/ponimanie-brokerov-soobshhenij-izuchenie-mehaniki-obmena-soobshheniyami-posredstvom-activemq-i-kafka-glava-3-kafka\" \/>\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\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c ActiveMQ \u0438 Kafka. \u0413\u043b\u0430\u0432\u0430 3. Kafka | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043d\u0438\u0433\u0438: \u00abUnderstanding Message Brokers\u00bb, \u0430\u0432\u0442\u043e\u0440: Jakub Korab, \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: O&#039;Reilly Media, Inc., \u0434\u0430\u0442\u0430 \u0438\u0437\u0434\u0430\u043d\u0438\u044f: June 2017, ISBN: 9781492049296. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/ponimanie-brokerov-soobshhenij-izuchenie-mehaniki-obmena-soobshheniyami-posredstvom-activemq-i-kafka-glava-3-kafka\" \/>\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:22:05+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:22:05+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\u00dczenetbr\u00f3kerek meg\u00e9rt\u00e9se. Az \u00fczenetk\u00fcld\u00e9s mechanik\u00e1j\u00e1nak tanulm\u00e1nyoz\u00e1sa az ActiveMQ \u00e9s a Kafka r\u00e9v\u00e9n. 3. fejezet. Kafka | ProHoster","description":"Egy kisebb k\u00f6nyv folytat\u00e1s\u00e1nak ford\u00edt\u00e1sa: \u00abUnderstanding Message Brokers\u00bb, szerz\u0151: Jakub Korab, kiad\u00f3: O'Reilly Media, Inc., megjelen\u00e9s d\u00e1tuma: 2017 j\u00fanius, ISBN: 9781492049296. Kor\u00e1bban leford\u00edtott.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/ponimanie-brokerov-soobshhenij-izuchenie-mehaniki-obmena-soobshheniyami-posredstvom-activemq-i-kafka-glava-3-kafka","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\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c ActiveMQ \u0438 Kafka. \u0413\u043b\u0430\u0432\u0430 3. Kafka | ProHoster","og:description":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043d\u0438\u0433\u0438: \u00abUnderstanding Message Brokers\u00bb, \u0430\u0432\u0442\u043e\u0440: Jakub Korab, \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: O'Reilly Media, Inc., \u0434\u0430\u0442\u0430 \u0438\u0437\u0434\u0430\u043d\u0438\u044f: June 2017, ISBN: 9781492049296. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/ponimanie-brokerov-soobshhenij-izuchenie-mehaniki-obmena-soobshheniyami-posredstvom-activemq-i-kafka-glava-3-kafka","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:22:05+00:00","article:modified_time":"2019-10-31T19:22:05+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38172","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-23 20:46:00","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 15:34:26","updated":"2026-01-23 20:46:00","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\/38172","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=38172"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/38172\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=38172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=38172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=38172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}