{"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\/cs\/blog\/administrirovanie\/ponimanie-brokerov-soobshhenij-izuchenie-mehaniki-obmena-soobshheniyami-posredstvom-activemq-i-kafka-glava-3-kafka","title":{"rendered":"Pochopen\u00ed zprost\u0159edkovatel\u016f zpr\u00e1v. Studium mechaniky v\u00fdm\u011bny zpr\u00e1v prost\u0159ednictv\u00edm ActiveMQ a Kafka. Kapitola 3. Kafka","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Pokra\u010dov\u00e1n\u00ed p\u0159ekladu mal\u00e9 knihy:<br \/>\n\u201ePorozum\u011bn\u00ed zprost\u0159edkovatel\u016fm zpr\u00e1v\u201c,<br \/>\nautor: Jakub Korab, nakladatelstv\u00ed: O'Reilly Media, Inc., datum vyd\u00e1n\u00ed: \u010derven 2017, ISBN: 9781492049296.<\/p>\n<p>P\u0159edchoz\u00ed p\u0159elo\u017een\u00e1 \u010d\u00e1st: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/466385\/\">Porozum\u011bn\u00ed zprost\u0159edkovatel\u016fm zpr\u00e1v. Studium mechaniky v\u00fdm\u011bny zpr\u00e1v prost\u0159ednictv\u00edm ActiveMQ a Kafka. Kapitola 1. \u00davod<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>KAPITOLA 3<\/h2>\n<p><\/p>\n<h2>Kafka<\/h2>\n<p>\nKafka byla vyvinuta ve spole\u010dnosti LinkedIn, aby p\u0159ekonala n\u011bkter\u00e1 omezen\u00ed tradi\u010dn\u00edch zprost\u0159edkovatel\u016f zpr\u00e1v a vyhnula se nutnosti nakonfigurovat n\u011bkolik zprost\u0159edkovatel\u016f zpr\u00e1v pro r\u016fzn\u00e1 \u201epoint-to-point\u201c zpracov\u00e1n\u00ed, co\u017e je pops\u00e1no v t\u00e9to knize v \u010d\u00e1sti \u201eVertik\u00e1ln\u00ed a horizont\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed\u201c na stran\u011b 28. Pou\u017eit\u00ed ve spole\u010dnosti LinkedIn bylo p\u0159ev\u00e1\u017en\u011b zalo\u017eeno na jednosm\u011brn\u00e9m z\u00edsk\u00e1v\u00e1n\u00ed velmi velk\u00fdch objem\u016f dat, jako jsou kliknut\u00ed na str\u00e1nk\u00e1ch a z\u00e1znamy p\u0159\u00edstupu, p\u0159i\u010dem\u017e se umo\u017enilo vyu\u017e\u00edvat tato data n\u011bkolika syst\u00e9m\u016fm, ani\u017e by to m\u011blo vliv na v\u00fdkon producent\u016f nebo dal\u0161\u00edch konzument\u016f. Ve skute\u010dnosti je d\u016fvodem existence Kafky dosa\u017een\u00ed architektury v\u00fdm\u011bny zpr\u00e1v, kterou popisuje Universal Data Pipeline.<\/p>\n<p>S ohledem na tento kone\u010dn\u00fd c\u00edl se p\u0159irozen\u011b objevily i dal\u0161\u00ed po\u017eadavky. Kafka mus\u00ed:<\/p>\n<ul>\n<li>B\u00fdt extr\u00e9mn\u011b rychl\u00e1<\/li>\n<li>Poskytovat velkou propustnost p\u0159i pr\u00e1ci se zpr\u00e1vami<\/li>\n<li>Podporovat modely \u201ePublisher-Subscriber\u201c a \u201ePoint-to-Point\u201c<\/li>\n<li>Nesni\u017eovat v\u00fdkon se zvy\u0161uj\u00edc\u00edm se po\u010dtem konzument\u016f. Nap\u0159\u00edklad v\u00fdkon a fronty a t\u00e9mata v ActiveMQ se zhor\u0161uj\u00ed s rostouc\u00edm po\u010dtem konzument\u016f na adrese<\/li>\n<li>B\u00fdt horizont\u00e1ln\u011b \u0161k\u00e1lovateln\u00e1; pokud jeden broker, kter\u00fd uchov\u00e1v\u00e1 (persists) zpr\u00e1vy, m\u016f\u017ee to prov\u00e1d\u011bt pouze maxim\u00e1ln\u00ed rychlost\u00ed disku, pak m\u00e1 smysl p\u0159ekro\u010dit hranice jednoho instance brokera pro zv\u00fd\u0161en\u00ed v\u00fdkonu<\/li>\n<li>Odd\u011blovat p\u0159\u00edstup k ukl\u00e1d\u00e1n\u00ed a op\u011btovn\u00e9mu vyhled\u00e1v\u00e1n\u00ed zpr\u00e1v<\/li>\n<\/ul>\n<p>\nAby toho v\u0161eho dos\u00e1hli, byla v Kafce p\u0159ijata architektura, kter\u00e1 redefinovala role a povinnosti klient\u016f a zprost\u0159edkovatel\u016f v\u00fdm\u011bny zpr\u00e1v. Model JMS je velmi orientov\u00e1n na zprost\u0159edkovatele, kde zprost\u0159edkovatel odpov\u00edd\u00e1 za distribuci zpr\u00e1v, zat\u00edmco klienti se mus\u00ed starat pouze o odes\u00edl\u00e1n\u00ed a p\u0159\u00edjem zpr\u00e1v. Kafka je naopak orientov\u00e1na na klienta, p\u0159i\u010dem\u017e klient p\u0159eb\u00edr\u00e1 mnoh\u00e9 funkce tradi\u010dn\u00edho zprost\u0159edkovatele, jako je spravedliv\u00e9 rozd\u011blen\u00ed relevantn\u00edch zpr\u00e1v mezi spot\u0159ebitele, a na opl\u00e1tku z\u00edsk\u00e1v\u00e1 extr\u00e9mn\u011b rychl\u00e9ho a \u0161k\u00e1lovateln\u00e9ho zprost\u0159edkovatele. Pro lidi, kte\u0159\u00ed pracovali s tradi\u010dn\u00edmi syst\u00e9my v\u00fdm\u011bny zpr\u00e1v, vy\u017eaduje pr\u00e1ce s Kafkou z\u00e1sadn\u00ed zm\u011bny v n\u00e1zorech.<br \/>\nTento in\u017een\u00fdrsk\u00fd sm\u011br vedl k vytvo\u0159en\u00ed infrastruktury v\u00fdm\u011bny zpr\u00e1v, schopn\u00e9 zv\u00fd\u0161it propustnost o mnoho \u0159\u00e1d\u016f ve srovn\u00e1n\u00ed s b\u011b\u017en\u00fdm zprost\u0159edkovatelem. Jak uvid\u00edme, tento p\u0159\u00edstup souvis\u00ed s kompromisy, kter\u00e9 znamenaj\u00ed, \u017ee Kafka nen\u00ed vhodn\u00e1 pro ur\u010dit\u00e9 typy z\u00e1t\u011b\u017e\u00ed a zaveden\u00e9ho softwaru.<\/p>\n<h3>Ucelen\u00fd model adres\u00e1ta<\/h3>\n<p>\nAby splnila v\u00fd\u0161e uveden\u00e9 po\u017eadavky, Kafka spojila v\u00fdm\u011bnu zpr\u00e1v typu \"publikace-p\u0159ihl\u00e1\u0161en\u00ed\" a \"bod-bod\" v r\u00e1mci jednoho typu adres\u00e1ta \u2014 <i>t\u00e9matu<\/i>. To mate lidi, kte\u0159\u00ed pracovali se syst\u00e9my v\u00fdm\u011bny zpr\u00e1v, kde slovo \"t\u00e9ma\" odkazuje na \u0161irokop\u00e1smov\u00fd mechanismus, ze kter\u00e9ho (z t\u00e9matu) \u010dten\u00ed nen\u00ed spolehliv\u00e9 (niedurable). T\u00e9mata Kafky je t\u0159eba ch\u00e1pat jako hybridn\u00ed typ adres\u00e1ta, v souladu s definic\u00ed uvedenou v \u00favodu t\u00e9to knihy.<\/p>\n<blockquote><p>V zbytek t\u00e9to kapitoly, pokud v\u00fdslovn\u011b neuv\u00e1d\u00edme jinak, bude term\u00edn \"t\u00e9ma\" odkazovat na t\u00e9ma Kafky.<\/p><\/blockquote>\n<p>\nAbychom pln\u011b porozum\u011bli, jak se t\u00e9mata chovaj\u00ed a jak\u00e9 z\u00e1ruky poskytuj\u00ed, mus\u00edme nejprve zv\u00e1\u017eit, jak jsou v Kafce implementov\u00e1na.<br \/>\n<i>Ka\u017ed\u00e9 t\u00e9ma v Kafce m\u00e1 sv\u016fj vlastn\u00ed den\u00edk.<\/i><br \/>\nProducenti, kte\u0159\u00ed pos\u00edlaj\u00ed zpr\u00e1vy do Kafky, zapisuj\u00ed do tohoto protokolu a konzumenti jej \u010dtou pomoc\u00ed ukazatel\u016f, kter\u00e9 se neust\u00e1le posouvaj\u00ed dop\u0159edu. Periodicky Kafka odstra\u0148uje ty nejstar\u0161\u00ed \u010d\u00e1sti protokolu, nez\u00e1visle na tom, zda byly zpr\u00e1vy v t\u011bchto \u010d\u00e1stech p\u0159e\u010dteny, \u010di nikoli. Centr\u00e1ln\u00edm prvkem designu Kafky je to, \u017ee broker se nestar\u00e1 o to, zda byly zpr\u00e1vy p\u0159e\u010dteny \u2014 to je odpov\u011bdnost klienta.<\/p>\n<blockquote><p>Term\u00edny \u201eprotokol\u201c a \u201eukazatel\u201c se v <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation.html\">dokumentaci Kafky<\/a><\/noindex>neobjevuj\u00ed. Tyto dob\u0159e zn\u00e1m\u00e9 term\u00edny jsou zde pou\u017e\u00edv\u00e1ny k usnadn\u011bn\u00ed porozum\u011bn\u00ed.<\/p><\/blockquote>\n<p>\nTento model se zcela li\u0161\u00ed od ActiveMQ, kde jsou zpr\u00e1vy ze v\u0161ech front ukl\u00e1d\u00e1ny do jednoho protokolu a broker ozna\u010duje zpr\u00e1vy jako odstran\u011bn\u00e9 pot\u00e9, co byly p\u0159e\u010dteny.<br \/>\nPoj\u010fme se nyn\u00ed pod\u00edvat podrobn\u011bji na protokol t\u00e9matu.<br \/>\nProtokol Kafky se skl\u00e1d\u00e1 z n\u011bkolika parti\u010dn\u00edch (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/tm\/w2\/yf\/tmw2yf3lanppqtrumxoidotplhi.png\">Obr\u00e1zek 3-1<\/a><\/noindex>). Kafka zaru\u010duje p\u0159\u00edsnou uspo\u0159\u00e1danost v ka\u017ed\u00e9 partii. To znamen\u00e1, \u017ee zpr\u00e1vy zapsan\u00e9 do partie v ur\u010dit\u00e9m po\u0159ad\u00ed budou p\u0159e\u010dteny ve stejn\u00e9m po\u0159ad\u00ed. Ka\u017ed\u00e1 parta je implementov\u00e1na jako cyklick\u00fd (rolling) protokol, kter\u00fd obsahuje <i>podmno\u017einu <\/i>(subset) v\u0161ech zpr\u00e1v odeslan\u00fdch do t\u00e9matu jeho producenty. Vytvo\u0159en\u00e9 t\u00e9ma obsahuje ve v\u00fdchoz\u00edm nastaven\u00ed jednu partu. My\u0161lenka parti\u00ed je centr\u00e1ln\u00ed my\u0161lenkou Kafky pro horizont\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Pochopen\u00ed zprost\u0159edkovatel\u016f zpr\u00e1v. Studium mechaniky v\u00fdm\u011bny zpr\u00e1v prost\u0159ednictv\u00edm ActiveMQ a Kafka. Kapitola 3. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/39f41ebcb73ec247656c0dea438158a9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Obr\u00e1zek 3-1. Partice Kafky<\/i><\/p>\n<p>Kdy\u017e producent ode\u0161le zpr\u00e1vu do Kafky, rozhodne, do kter\u00e9 partie zpr\u00e1vu poslat. Na to se pod\u00edv\u00e1me podrobn\u011bji pozd\u011bji.<\/p>\n<h2>\u010cten\u00ed zpr\u00e1v<\/h2>\n<p>\nKlient, kter\u00fd chce \u010d\u00edst zpr\u00e1vy, spravuje pojmenovan\u00fd ukazatel, naz\u00fdvan\u00fd <i>skupina konzument\u016f (consumer group)<\/i>, kter\u00fd ukazuje na <i>offset<\/i> zpr\u00e1vy v partii. Offset je pozice s rostouc\u00edm \u010d\u00edslem, kter\u00e9 za\u010d\u00edn\u00e1 od 0 na za\u010d\u00e1tku partie. Tato skupina konzument\u016f, na kterou odkazuj\u00ed v API prost\u0159ednictv\u00edm u\u017eivatelsky definovan\u00e9ho identifik\u00e1toru group_id, odpov\u00edd\u00e1 <i>jednomu logick\u00e9mu spot\u0159ebiteli nebo syst\u00e9mu<\/i>.<\/p>\n<p>V\u011bt\u0161ina syst\u00e9m\u016f vyu\u017e\u00edvaj\u00edc\u00edch v\u00fdm\u011bnu zpr\u00e1v \u010dte data z adres\u00e1ta prost\u0159ednictv\u00edm n\u011bkolika instanc\u00ed a vl\u00e1ken pro paraleln\u00ed zpracov\u00e1n\u00ed zpr\u00e1v. Obvykle tedy bude mnoho instanc\u00ed konzument\u016f, kter\u00e9 spole\u010dn\u011b vyu\u017e\u00edvaj\u00ed stejnou skupinu konzument\u016f.<\/p>\n<p>Probl\u00e9m \u010dten\u00ed lze vyj\u00e1d\u0159it n\u00e1sleduj\u00edc\u00edm zp\u016fsobem:<\/p>\n<ul>\n<li>T\u00e9ma m\u00e1 n\u011bkolik parti\u010dn\u00edch \u010d\u00e1st\u00ed<\/li>\n<li>Pou\u017e\u00edv\u00e1n\u00ed t\u00e9matu m\u016f\u017ee b\u00fdt sou\u010dasn\u011b mnoho skupin spot\u0159ebitel\u016f<\/li>\n<li>Skupina spot\u0159ebitel\u016f m\u016f\u017ee m\u00edt n\u011bkolik samostatn\u00fdch instanc\u00ed<\/li>\n<\/ul>\n<p>\nToto je netrivi\u00e1ln\u00ed probl\u00e9m \"mnoho k mnoha\". Abychom pochopili, jak Kafka zach\u00e1z\u00ed s vztahy mezi skupinami spot\u0159ebitel\u016f, instancemi spot\u0159ebitel\u016f a parti\u010dn\u00edmi \u010d\u00e1stmi, prozkoumejme \u0159adu postupn\u011b slo\u017eit\u011bj\u0161\u00edch sc\u00e9n\u00e1\u0159\u016f \u010dten\u00ed.<\/p>\n<h3>Spot\u0159ebitel\u00e9 a skupiny spot\u0159ebitel\u016f<\/h3>\n<p>\nVezm\u011bme jako v\u00fdchoz\u00ed bod t\u00e9ma s jednou parti\u010dn\u00ed \u010d\u00e1st\u00ed (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/6z\/tz\/dh\/6ztzdhqmjweck-z15htxb2xbe28.png\">Obr\u00e1zek 3-2<\/a><\/noindex>).<\/p>\n<p><img decoding=\"async\" alt=\"Pochopen\u00ed zprost\u0159edkovatel\u016f zpr\u00e1v. Studium mechaniky v\u00fdm\u011bny zpr\u00e1v prost\u0159ednictv\u00edm ActiveMQ a Kafka. Kapitola 3. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/46c92e6bd38774dfef3be4bd198bf35d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Obr\u00e1zek 3-2. Spot\u0159ebitel \u010dte z parti\u010dn\u00ed \u010d\u00e1sti<\/i><\/p>\n<p>Kdy\u017e se instance spot\u0159ebitele p\u0159ipoj\u00ed se sv\u00fdm vlastn\u00edm group_id k tomuto t\u00e9matu, je j\u00ed p\u0159i\u0159azena parti\u010dn\u00ed \u010d\u00e1st k \u010dten\u00ed a offset v t\u00e9to parti\u010dn\u00ed \u010d\u00e1sti. Poloha tohoto offsetu je konfigurov\u00e1na v klientovi, jako\u017eto ukazatel na posledn\u00ed pozici (nejnov\u011bj\u0161\u00ed zpr\u00e1vu) nebo nejstar\u0161\u00ed pozici (nejstar\u0161\u00ed zpr\u00e1vu). Spot\u0159ebitel \u017e\u00e1d\u00e1 (polls) zpr\u00e1vy z t\u00e9matu, co\u017e vede k jejich sekven\u010dn\u00edmu \u010dten\u00ed z den\u00edku.<br \/>\nPoloha offsetu se pravideln\u011b pos\u00edl\u00e1 zp\u011bt do Kafky a ukl\u00e1d\u00e1 se jako zpr\u00e1vy ve vnit\u0159n\u00edm t\u00e9matu <i>_consumer_offsets<\/i>. P\u0159e\u010dten\u00e9 zpr\u00e1vy se p\u0159esto neodstra\u0148uj\u00ed, na rozd\u00edl od b\u011b\u017en\u00e9ho brokera, a klient m\u016f\u017ee posunout (rewind) offset, aby znovu zpracoval ji\u017e zobrazen\u00e9 zpr\u00e1vy.<\/p>\n<p>Kdy\u017e se p\u0159ipoj\u00ed druh\u00fd logick\u00fd spot\u0159ebitel, pou\u017e\u00edvaj\u00edc\u00ed jin\u00fd group_id, spravuje druh\u00fd ukazatel, kter\u00fd nen\u00ed z\u00e1visl\u00fd na prvn\u00edm (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/qe\/v1\/yk\/qev1yktga3s-g1gqlynylbe3n9w.png\">Obr\u00e1zek 3-3<\/a><\/noindex>). T\u00edmto zp\u016fsobem t\u00e9ma Kafka funguje jako fronta, kde existuje jeden spot\u0159ebitel a jako b\u011b\u017en\u00e9 t\u00e9ma publisher-subscriber (pub-sub), na kter\u00e9 se p\u0159ihl\u00e1silo n\u011bkolik spot\u0159ebitel\u016f, s dal\u0161\u00edm v\u00fdhodou, \u017ee v\u0161echny zpr\u00e1vy jsou uchov\u00e1v\u00e1ny a mohou b\u00fdt zpracov\u00e1ny v\u00edcekr\u00e1t.<\/p>\n<p><img decoding=\"async\" alt=\"Pochopen\u00ed zprost\u0159edkovatel\u016f zpr\u00e1v. Studium mechaniky v\u00fdm\u011bny zpr\u00e1v prost\u0159ednictv\u00edm ActiveMQ a Kafka. Kapitola 3. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/e9e8b9063ef7367005254d36abb47f4f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Obr\u00e1zek 3-3. Dva spot\u0159ebitel\u00e9 ve r\u016fzn\u00fdch skupin\u00e1ch spot\u0159ebitel\u016f \u010dtou z jedn\u00e9 parti\u010dn\u00ed \u010d\u00e1sti<\/i><\/p>\n<h3>Spot\u0159ebitel\u00e9 ve skupin\u011b spot\u0159ebitel\u016f<\/h3>\n<p>\nKdy\u017e jedna instance spot\u0159ebitele \u010dte data z parti\u010dn\u00ed \u010d\u00e1sti, pln\u011b kontroluje ukazatel a zpracov\u00e1v\u00e1 zpr\u00e1vy, jak je pops\u00e1no v p\u0159edchoz\u00ed sekci.<br \/>\nPokud bylo n\u011bkolik instanc\u00ed spot\u0159ebitel\u016f p\u0159ipojeno se stejn\u00fdm group_id k t\u00e9matu s jednou parti\u010dn\u00ed, pak posledn\u00ed p\u0159ipojen\u00fd instanci bude p\u0159ed\u00e1n kontrola nad ukazatelem a od t\u00e9to chv\u00edle bude p\u0159ij\u00edmat v\u0161echny zpr\u00e1vy (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/0j\/ao\/f2\/0jaof2mdwg3cqvmwemhtxkrltuq.png\">Obr\u00e1zek 3-4<\/a><\/noindex>).<\/p>\n<p><img decoding=\"async\" alt=\"Pochopen\u00ed zprost\u0159edkovatel\u016f zpr\u00e1v. Studium mechaniky v\u00fdm\u011bny zpr\u00e1v prost\u0159ednictv\u00edm ActiveMQ a Kafka. Kapitola 3. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/ec6af819445dad4028f65449a735ae22.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Obr\u00e1zek 3-4. Dva spot\u0159ebitel\u00e9 ve stejn\u00e9 skupin\u011b spot\u0159ebitel\u016f \u010dtou z jedn\u00e9 parti\u010dn\u00ed<\/i><\/p>\n<p>Tento zp\u016fsob zpracov\u00e1n\u00ed, ve kter\u00e9m po\u010det instanc\u00ed spot\u0159ebitel\u016f p\u0159esahuje po\u010det parti\u010dn\u00edch, lze pova\u017eovat za variantu monopoln\u00edho spot\u0159ebitele. M\u016f\u017ee b\u00fdt u\u017eite\u010dn\u00e9, pokud pot\u0159ebujete 'aktivn\u011b-pasivn\u00ed' (nebo 'horkou-teplou') klasteraci va\u0161ich instanc\u00ed spot\u0159ebitel\u016f, i kdy\u017e paraleln\u00ed pr\u00e1ce n\u011bkolika spot\u0159ebitel\u016f ('aktivn\u011b-aktivn\u00ed' nebo 'hork\u00e1-hork\u00e1') je mnohem b\u011b\u017en\u011bj\u0161\u00ed ne\u017e spot\u0159ebitel\u00e9 v re\u017eimu \u010dek\u00e1n\u00ed.<\/p>\n<blockquote><p>Takov\u00e9 chov\u00e1n\u00ed distribuce zpr\u00e1v, popsan\u00e9 v\u00fd\u0161e, m\u016f\u017ee b\u00fdt p\u0159ekvapiv\u00e9 ve srovn\u00e1n\u00ed s t\u00edm, jak funguje b\u011b\u017en\u00e1 fronta JMS. V tomto modelu budou zpr\u00e1vy odes\u00edlan\u00e9 do fronty rovnom\u011brn\u011b rozd\u011bleny mezi dva spot\u0159ebitele.<\/p><\/blockquote>\n<p>\nNej\u010dast\u011bji, kdy\u017e vytv\u00e1\u0159\u00edme n\u011bkolik instanc\u00ed spot\u0159ebitel\u016f, d\u011bl\u00e1me to bu\u010f pro paraleln\u00ed zpracov\u00e1n\u00ed zpr\u00e1v, nebo pro zv\u00fd\u0161en\u00ed rychlosti \u010dten\u00ed, nebo pro zv\u00fd\u0161en\u00ed odolnosti procesu \u010dten\u00ed. Proto\u017ee \u010d\u00edst data z parti\u010dn\u00ed m\u016f\u017ee sou\u010dasn\u011b jen jedna instance spot\u0159ebitele, jak se to dosahuje v Kafce?<\/p>\n<p>Jedn\u00edm ze zp\u016fsob\u016f, jak toho dos\u00e1hnout, je pou\u017e\u00edt jednu instanci spot\u0159ebitele, aby p\u0159e\u010detla v\u0161echny zpr\u00e1vy a p\u0159edala je do fondu vl\u00e1ken. A\u010dkoli tento p\u0159\u00edstup zvy\u0161uje propustnost zpracov\u00e1n\u00ed, zvy\u0161uje slo\u017eitost logiky spot\u0159ebitel\u016f a nic ned\u011bl\u00e1 pro zv\u00fd\u0161en\u00ed odolnosti syst\u00e9mu \u010dten\u00ed. Pokud jedna instance spot\u0159ebitele sel\u017ee kv\u016fli v\u00fdpadku nap\u00e1jen\u00ed nebo podobn\u00e9 ud\u00e1losti, pak \u010dten\u00ed skon\u010d\u00ed.<\/p>\n<p>Kanonick\u00fdm zp\u016fsobem \u0159e\u0161en\u00ed tohoto probl\u00e9mu v Kafce je pou\u017e\u00edt v\u00edce parti\u010dn\u00edch.<i>O<\/i>Partitioning<\/p>\n<h3>Partice jsou z\u00e1kladn\u00edm mechanismem paralelizace \u010dten\u00ed a \u0161k\u00e1lov\u00e1n\u00ed t\u00e9matu nad propustnost jednoho instance brokera. Abychom to l\u00e9pe pochopili, pod\u00edvejme se na situaci, kdy existuje t\u00e9ma se dv\u011bma parti\u010dn\u00edmi a na toto t\u00e9ma se p\u0159ihl\u00e1s\u00ed jeden spot\u0159ebitel (<\/h3>\n<p>\nObr\u00e1zek 3-5<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/en\/9g\/ct\/en9gct0o017cqp8buawguwlscty.png\">Obr\u00e1zek 3-5<\/a><\/noindex>).<\/p>\n<p><img decoding=\"async\" alt=\"Pochopen\u00ed zprost\u0159edkovatel\u016f zpr\u00e1v. Studium mechaniky v\u00fdm\u011bny zpr\u00e1v prost\u0159ednictv\u00edm ActiveMQ a Kafka. Kapitola 3. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/cc766bf69af22698aacc3f1ac70b067f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Obr\u00e1zek 3-5. Jeden konzument \u010dte z n\u011bkolika parti\u010dn\u00ed<\/i><\/p>\n<p>V tomto sc\u00e9n\u00e1\u0159i m\u00e1 konzument kontrolu nad ukazateli odpov\u00eddaj\u00edc\u00edmi jeho group_id v obou parti\u010dn\u00edch a za\u010d\u00edn\u00e1 \u010d\u00edst zpr\u00e1vy z obou parti\u010dn\u00edch.<br \/>\nKdy\u017e je do tohoto t\u00e9matu p\u0159id\u00e1n dal\u0161\u00ed konzument pro stejn\u00e9 group_id, Kafka p\u0159evede (reallocate) jednu z parti\u010dn\u00ed z prvn\u00edho na druh\u00e9ho konzumenta. Pot\u00e9 ka\u017ed\u00fd instance konzumenta bude \u010d\u00edst z jedn\u00e9 parti\u010dn\u00ed t\u00e9matu (<noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/8b\/a0\/um\/8ba0umn2yzr9yy3vztonhdfiub0.png\">Obr\u00e1zek 3-6<\/a><\/noindex>).<\/p>\n<p>Aby byla zaji\u0161t\u011bna paraleln\u00ed zpracov\u00e1n\u00ed zpr\u00e1v ve 20 vl\u00e1knech, pot\u0159ebujete alespo\u0148 20 parti\u010dn\u00ed. Pokud jich bude m\u00e9n\u011b, z\u016fstanou v\u00e1m konzumenti, kte\u0159\u00ed nemaj\u00ed co d\u011blat, co\u017e bylo pops\u00e1no d\u0159\u00edve v diskusi o monopoln\u00edch konzument\u016f.<\/p>\n<p><img decoding=\"async\" alt=\"Pochopen\u00ed zprost\u0159edkovatel\u016f zpr\u00e1v. Studium mechaniky v\u00fdm\u011bny zpr\u00e1v prost\u0159ednictv\u00edm ActiveMQ a Kafka. Kapitola 3. Kafka\" src=\"\/wp-content\/uploads\/2019\/09\/a3c4001e4a5b92d53b6f529b2633254a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Obr\u00e1zek 3-6. Dva konzumenti ve stejn\u00e9 skupin\u011b konzument\u016f \u010dtou z r\u016fzn\u00fdch parti\u010dn\u00edch<\/i><\/p>\n<p>Tento syst\u00e9m v\u00fdrazn\u011b sni\u017euje slo\u017eitost pr\u00e1ce brokera Kafka ve srovn\u00e1n\u00ed s distribuc\u00ed zpr\u00e1v, kter\u00e1 je pot\u0159ebn\u00e1 pro podporu fronty JMS. Zde nen\u00ed nutn\u00e9 se starat o n\u00e1sleduj\u00edc\u00ed z\u00e1le\u017eitosti:<\/p>\n<ul>\n<li>Kter\u00fd konzument by m\u011bl obdr\u017eet dal\u0161\u00ed zpr\u00e1vu na z\u00e1klad\u011b cyklick\u00e9ho (round-robin) rozd\u011blen\u00ed, aktu\u00e1ln\u00ed kapacity buffer\u016f p\u0159edb\u011b\u017en\u00e9ho v\u00fdb\u011bru nebo p\u0159edchoz\u00edch zpr\u00e1v (jak pro skupiny zpr\u00e1v JMS).<\/li>\n<li>Jak\u00e9 zpr\u00e1vy byly odesl\u00e1ny kter\u00fdm konzument\u016fm a m\u011bly by b\u00fdt znovu doru\u010deny v p\u0159\u00edpad\u011b selh\u00e1n\u00ed.<\/li>\n<\/ul>\n<p>\nV\u0161e, co broker Kafka mus\u00ed ud\u011blat, je postupn\u011b p\u0159ed\u00e1vat zpr\u00e1vy konzumentovi, kdy\u017e si je ten posledn\u00ed vy\u017e\u00e1d\u00e1.<\/p>\n<p>Av\u0161ak po\u017eadavky na paraleln\u00ed \u010dten\u00ed a znovu odes\u00edl\u00e1n\u00ed ne\u00fasp\u011b\u0161n\u00fdch zpr\u00e1v nikam nezmizely \u2014 odpov\u011bdnost za n\u011b se jednodu\u0161e p\u0159esunula od brokera k klientovi. To znamen\u00e1, \u017ee mus\u00ed b\u00fdt zohledn\u011bny ve va\u0161em k\u00f3du.<\/p>\n<h2>Odes\u00edl\u00e1n\u00ed zpr\u00e1v<\/h2>\n<p>\nOdpov\u011bdnost za rozhodnut\u00ed, do kter\u00e9 parti\u010dn\u00ed odeslat zpr\u00e1vu, je na producentovi t\u00e9to zpr\u00e1vy. Abychom porozum\u011bli mechanismu, kter\u00fdm se to prov\u00e1d\u00ed, nejprve se mus\u00edme pod\u00edvat na to, co vlastn\u011b odes\u00edl\u00e1me.<\/p>\n<p>Zat\u00edmco v JMS pou\u017e\u00edv\u00e1me strukturu zpr\u00e1vy s metadaty (hlavi\u010dkami a vlastnostmi) a t\u011blem obsahuj\u00edc\u00edm u\u017eite\u010dn\u00e9 zat\u00ed\u017een\u00ed (payload), v Kafce je zpr\u00e1va <i>p\u00e1rem \u201ekl\u00ed\u010d-hodnota\u201c<\/i>Zpr\u00e1va s u\u017eite\u010dn\u00fdm zat\u00ed\u017een\u00edm je odesl\u00e1na jako hodnota (value). Kl\u00ed\u010d se na druh\u00e9 stran\u011b pou\u017e\u00edv\u00e1 p\u0159edev\u0161\u00edm pro parti\u0161ov\u00e1n\u00ed a m\u011bl by obsahovat <i>kl\u00ed\u010d specifick\u00fd pro obchodn\u00ed logiku<\/i>, aby se souvisej\u00edc\u00ed zpr\u00e1vy um\u00edstily do stejn\u00e9 partice.<\/p>\n<p>V kapitole 2 jsme diskutovali sc\u00e9n\u00e1\u0159 online s\u00e1zek, kdy by m\u011bly b\u00fdt souvisej\u00edc\u00ed ud\u00e1losti zpracov\u00e1v\u00e1ny v po\u0159ad\u00ed jedn\u00edm spot\u0159ebitelem:<\/p>\n<ol>\n<li>U\u017eivatelsk\u00fd \u00fa\u010det je nastaven.<\/li>\n<li>Pen\u00edze jsou p\u0159ips\u00e1ny na \u00fa\u010det.<\/li>\n<li>S\u00e1zka je provedena, co\u017e vy\u017eaduje pen\u00edze z \u00fa\u010dtu.<\/li>\n<\/ol>\n<p>\nPokud ka\u017ed\u00e1 ud\u00e1lost p\u0159edstavuje zpr\u00e1vu odeslanou do t\u00e9matu, pak p\u0159irozen\u00fdm kl\u00ed\u010dem bude identifik\u00e1tor \u00fa\u010dtu.<br \/>\nKdy\u017e je zpr\u00e1va odesl\u00e1na pomoc\u00ed Kafka Producer API, je p\u0159ed\u00e1na funkci parti\u0161ov\u00e1n\u00ed, kter\u00e1, vezmouc v \u00favahu zpr\u00e1vu a aktu\u00e1ln\u00ed stav klastra Kafka, vrac\u00ed identifik\u00e1tor partice, do kter\u00e9 by m\u011bla b\u00fdt zpr\u00e1va odesl\u00e1na. Tato funkce je implementov\u00e1na v Jav\u011b prost\u0159ednictv\u00edm rozhran\u00ed Partitioner.<\/p>\n<p>Toto rozhran\u00ed vypad\u00e1 takto:<\/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>\nImplementace Partitioner pro ur\u010den\u00ed partice pou\u017e\u00edv\u00e1 v\u00fdchoz\u00ed algoritmus ha\u0161ov\u00e1n\u00ed kl\u00ed\u010de (general-purpose hashing algorithm over the key) nebo cyklick\u00e9 proch\u00e1zen\u00ed (round-robin), pokud nen\u00ed kl\u00ed\u010d uveden. Toto v\u00fdchoz\u00ed chov\u00e1n\u00ed funguje dob\u0159e ve v\u011bt\u0161in\u011b p\u0159\u00edpad\u016f. V budoucnu v\u0161ak budete cht\u00edt napsat svou vlastn\u00ed.<\/p>\n<h3>Naps\u00e1n\u00ed vlastn\u00ed strategie parti\u0161ov\u00e1n\u00ed<\/h3>\n<p>\nUva\u017eujme p\u0159\u00edklad, kdy chcete odeslat metadata spolu s u\u017eite\u010dn\u00fdm zat\u00ed\u017een\u00edm zpr\u00e1vy. U\u017eite\u010dn\u00e9 zat\u00ed\u017een\u00ed v na\u0161em p\u0159\u00edkladu je pokyn k proveden\u00ed vkladu na hern\u00ed \u00fa\u010det. Pokyn je to, co bychom cht\u011bli zaru\u010den\u011b nem\u011bnit p\u0159i p\u0159enosu a chceme si b\u00fdt jisti, \u017ee pouze d\u016fv\u011bryhodn\u00fd nad\u0159azen\u00fd syst\u00e9m m\u016f\u017ee tento pokyn iniciovat. V takov\u00e9m p\u0159\u00edpad\u011b se odes\u00edlaj\u00edc\u00ed a p\u0159ij\u00edmaj\u00edc\u00ed syst\u00e9my dohodnou na pou\u017eit\u00ed podpisu k ov\u011b\u0159en\u00ed autenticity zpr\u00e1vy.<br \/>\nV b\u011b\u017en\u00e9m JMS jednodu\u0161e definujeme vlastnost \u201epodpis zpr\u00e1vy\u201c a p\u0159id\u00e1v\u00e1me ji k zpr\u00e1v\u011b. Nicm\u00e9n\u011b, Kafka n\u00e1m neposkytuje mechanismus pro p\u0159enos metadat \u2013 pouze kl\u00ed\u010d a hodnotu.<\/p>\n<p>Proto\u017ee hodnota je u\u017eite\u010dn\u00e1 z\u00e1t\u011b\u017e bankovn\u00edho p\u0159evodu (bank transfer payload), jej\u00ed\u017e integritu chceme zachovat, m\u00e1me jedinou mo\u017enost, a to definovat strukturu dat pro pou\u017eit\u00ed v kl\u00ed\u010di. P\u0159edpokl\u00e1d\u00e1me, \u017ee pot\u0159ebujeme identifik\u00e1tor \u00fa\u010dtu pro partitioning, proto\u017ee v\u0161echny zpr\u00e1vy t\u00fdkaj\u00edc\u00ed se \u00fa\u010dtu je nutn\u00e9 zpracov\u00e1vat v po\u0159ad\u00ed, vymysl\u00edme n\u00e1sleduj\u00edc\u00ed strukturu JSON:<\/p>\n<pre><code class=\"json\">{\n  \"signature\": \"541661622185851c248b41bf0cea7ad0\",\n  \"accountId\": \"10007865234\"\n}<\/code><\/pre>\n<p>\nProto\u017ee hodnota podpisu se bude li\u0161it v z\u00e1vislosti na u\u017eite\u010dn\u00e9 z\u00e1t\u011b\u017ei, v\u00fdchoz\u00ed strategie hashov\u00e1n\u00ed rozhran\u00ed Partitioner nebude spolehliv\u011b seskupovat souvisej\u00edc\u00ed zpr\u00e1vy. Proto budeme pot\u0159ebovat napsat vlastn\u00ed strategii, kter\u00e1 analyzuje tento kl\u00ed\u010d a rozd\u011bl\u00ed (partition) hodnotu accountId.<\/p>\n<blockquote><p>Kafka zahrnuje kontroln\u00ed sou\u010dty pro detekci po\u0161kozen\u00ed zpr\u00e1v v \u00falo\u017ei\u0161ti a m\u00e1 \u00faplnou sadu bezpe\u010dnostn\u00edch funkc\u00ed. I p\u0159esto se ob\u010das objevuj\u00ed specifick\u00e9 po\u017eadavky na odv\u011btv\u00ed, jako je uvedeno v\u00fd\u0161e.<\/p><\/blockquote>\n<p>\nVlastn\u00ed strategie partitioningu by m\u011bla zajistit, \u017ee v\u0161echny souvisej\u00edc\u00ed zpr\u00e1vy se ocitnou v jedn\u00e9 partition. I kdy\u017e se to zd\u00e1 jednoduch\u00e9, toto po\u017eadavek m\u016f\u017ee b\u00fdt komplikov\u00e1n d\u016fle\u017eitost\u00ed uspo\u0159\u00e1d\u00e1n\u00ed souvisej\u00edc\u00edch zpr\u00e1v a t\u00edm, jak pevn\u011b je po\u010det partitions v t\u00e9matu stanoven.<\/p>\n<p>Po\u010det partitions v t\u00e9matu se m\u016f\u017ee \u010dasem m\u011bnit, jeliko\u017e je mo\u017en\u00e9 je p\u0159id\u00e1vat, pokud provoz p\u0159es\u00e1hne p\u016fvodn\u00ed o\u010dek\u00e1v\u00e1n\u00ed. Kl\u00ed\u010de zpr\u00e1v tak mohou b\u00fdt spojeny s partition, do kter\u00e9 byly p\u016fvodn\u011b odesl\u00e1ny, co\u017e nazna\u010duje \u010d\u00e1st stavu, kter\u00e1 by m\u011bla b\u00fdt rozd\u011blena mezi instance producenta.<\/p>\n<p>Dal\u0161\u00edm faktorem, kter\u00fd je t\u0159eba zv\u00e1\u017eit, je rovnom\u011brnost distribuce zpr\u00e1v mezi partitions. Obecn\u011b plat\u00ed, \u017ee kl\u00ed\u010de nejsou rovnom\u011brn\u011b rozlo\u017eeny mezi zpr\u00e1vy a hashovac\u00ed funkce nezaru\u010duj\u00ed spravedlivou distribuci zpr\u00e1v pro malou skupinu kl\u00ed\u010d\u016f.<br \/>\nJe d\u016fle\u017eit\u00e9 poznamenat, \u017ee bez ohledu na to, jak se rozhodnete rozd\u011blit zpr\u00e1vy, bude pravd\u011bpodobn\u011b pot\u0159eba op\u011btovn\u011b pou\u017e\u00edt samotn\u00fd d\u011blitel.<\/p>\n<p>Zv\u00e1\u017e\u00edme po\u017eadavek na replikaci dat mezi klastrem Kafka v r\u016fzn\u00fdch geografick\u00fdch poloh\u00e1ch. K tomu \u00fa\u010delu je Kafka dod\u00e1v\u00e1na s n\u00e1strojem p\u0159\u00edkazov\u00e9ho \u0159\u00e1dku nazvan\u00fdm MirrorMaker, kter\u00fd se pou\u017e\u00edv\u00e1 k \u010dten\u00ed zpr\u00e1v z jednoho klastru a jejich p\u0159enosu do druh\u00e9ho.<\/p>\n<p>MirrorMaker mus\u00ed rozum\u011bt kl\u00ed\u010d\u016fm replikovan\u00e9ho t\u00e9matu, aby udr\u017eel relativn\u00ed po\u0159ad\u00ed mezi zpr\u00e1vami p\u0159i replikaci mezi klastry, proto\u017ee po\u010det partition pro toto t\u00e9ma se m\u016f\u017ee v obou klastrech li\u0161it.<\/p>\n<p>U\u017eivatelsk\u00e9 strategie partition se vyskytuj\u00ed relativn\u011b z\u0159\u00eddka, proto\u017ee v\u00fdchoz\u00ed hashov\u00e1n\u00ed nebo cyklick\u00e9 rozd\u011blen\u00ed \u00fasp\u011b\u0161n\u011b funguj\u00ed ve v\u011bt\u0161in\u011b sc\u00e9n\u00e1\u0159\u016f. Nicm\u00e9n\u011b, pokud pot\u0159ebujete p\u0159\u00edsn\u00e9 z\u00e1ruky po\u0159ad\u00ed nebo mus\u00edte extrahovat metadata z payload\u016f, m\u011blo by v\u00e1s partitionov\u00e1n\u00ed zaj\u00edmat v\u00edc.<\/p>\n<p>V\u00fdhody \u0161k\u00e1lovatelnosti a v\u00fdkonu Kafka jsou zp\u016fsobeny p\u0159enesen\u00edm n\u011bkter\u00fdch povinnost\u00ed tradi\u010dn\u00edho brokera na klienta. V tomto p\u0159\u00edpad\u011b se rozhoduje o rozd\u011blen\u00ed potenci\u00e1ln\u011b souvisej\u00edc\u00edch zpr\u00e1v mezi n\u011bkolika paraleln\u011b pracuj\u00edc\u00edmi konsumenty.<\/p>\n<blockquote><p>JMS broke\u0159i tak\u00e9 mus\u00ed \u0159e\u0161it takov\u00e9 po\u017eadavky. Zaj\u00edmav\u00e9 je, \u017ee mechanismus pos\u00edl\u00e1n\u00ed souvisej\u00edc\u00edch zpr\u00e1v jednomu a tomu sam\u00e9mu consumerovi, realizovan\u00fd prost\u0159ednictv\u00edm JMS Message Groups (typ strategie vyva\u017eov\u00e1n\u00ed z\u00e1t\u011b\u017ee sticky load balancing (SLB)), tak\u00e9 vy\u017eaduje, aby odes\u00edlatel ozna\u010dil zpr\u00e1vy jako souvisej\u00edc\u00ed. V p\u0159\u00edpad\u011b JMS je broker odpov\u011bdn\u00fd za odesl\u00e1n\u00ed t\u00e9to skupiny souvisej\u00edc\u00edch zpr\u00e1v jednomu konsumentovi z mnoha a p\u0159enos vlastnictv\u00ed skupiny, pokud konsument sel\u017ee.<\/p><\/blockquote>\n<p><\/p>\n<h2>Dohody o producentovi<\/h2>\n<p>\nPartitionov\u00e1n\u00ed nen\u00ed jedin\u00e1 v\u011bc, kterou je t\u0159eba zv\u00e1\u017eit p\u0159i odes\u00edl\u00e1n\u00ed zpr\u00e1v. Poj\u010fme se pod\u00edvat na metody send() t\u0159\u00eddy Producer v Java API:<\/p>\n<pre><code class=\"java\">Future  send(ProducerRecord  record);\nFuture  send(ProducerRecord  record, Callback callback);<\/code><\/pre>\n<p>\nJe t\u0159eba hned poznamenat, \u017ee ob\u011b metody vracej\u00ed Future, co\u017e nazna\u010duje, \u017ee operace odesl\u00e1n\u00ed nen\u00ed vykon\u00e1na okam\u017eit\u011b. V d\u016fsledku toho se zpr\u00e1va (ProducerRecord) zapisuje do odes\u00edlac\u00edho bufferu pro ka\u017edou aktivn\u00ed partition a je p\u0159ed\u00e1v\u00e1na brokerovi na pozad\u00ed klientsk\u00e9 knihovny Kafka. A\u010dkoli to \u010din\u00ed pr\u00e1ci neuv\u011b\u0159iteln\u011b rychlou, znamen\u00e1 to, \u017ee neobratn\u011b napsan\u00e1 aplikace m\u016f\u017ee ztratit zpr\u00e1vy, pokud bude proces zastaven.<\/p>\n<p>Jak u\u017e bylo \u0159e\u010deno, existuje zp\u016fsob, jak u\u010dinit operaci odesl\u00e1n\u00ed spolehliv\u011bj\u0161\u00ed na \u00fakor v\u00fdkonu. Velikost tohoto bufferu lze nastavit na 0, a t\u00edm bude vl\u00e1kno odes\u00edlaj\u00edc\u00ed aplikace muset \u010dekat, a\u017e se p\u0159enos zpr\u00e1vy brokerovi dokon\u010d\u00ed, n\u00e1sleduj\u00edc\u00edm zp\u016fsobem:<\/p>\n<pre><code class=\"java\">RecordMetadata metadata = producer.send(record).get();<\/code><\/pre>\n<p><\/p>\n<h2>Znovu o \u010dten\u00ed zpr\u00e1v<\/h2>\n<p>\n\u010cten\u00ed zpr\u00e1v m\u00e1 dal\u0161\u00ed slo\u017eitosti, o kter\u00fdch je t\u0159eba uva\u017eovat. Na rozd\u00edl od API JMS, kter\u00e9 m\u016f\u017ee spustit poslucha\u010de zpr\u00e1v (message listener) jako reakci na p\u0159\u00edchoz\u00ed zpr\u00e1vu, rozhran\u00ed <i>Consumer <\/i>Kafka pouze prov\u00e1d\u00ed poll (dotazov\u00e1n\u00ed). Poj\u010fme se pod\u00edvat bl\u00ed\u017ee na metodu <i>poll ()<\/i>, kter\u00e1 se pou\u017e\u00edv\u00e1 k tomuto \u00fa\u010delu:<\/p>\n<pre><code class=\"java\">ConsumerRecords  poll(long timeout);<\/code><\/pre>\n<p>\nN\u00e1vratov\u00e1 hodnota metody je kontejnerov\u00e1 struktura obsahuj\u00edc\u00ed n\u011bkolik objekt\u016f <i>ConsumerRecord <\/i>z potenci\u00e1ln\u011b n\u011bkolika partition. <i>ConsumerRecord <\/i>s\u00e1m o sob\u011b je dr\u017eitelem objekt\u016f pro p\u00e1r kl\u00ed\u010d-hodnota s p\u0159\u00edslu\u0161n\u00fdmi metadaty, jako je partition, ze kter\u00e9 byl z\u00edsk\u00e1n.<\/p>\n<p>Jak bylo prodiskutov\u00e1no v kapitole 2, mus\u00edme neust\u00e1le m\u00edt na pam\u011bti, co se d\u011bje se zpr\u00e1vami po jejich \u00fasp\u011b\u0161n\u00e9m nebo ne\u00fasp\u011b\u0161n\u00e9m zpracov\u00e1n\u00ed, nap\u0159\u00edklad pokud klient nem\u016f\u017ee zpr\u00e1vu zpracovat nebo pokud dojde k jeho selh\u00e1n\u00ed. V JMS bylo to \u0159e\u0161eno prost\u0159ednictv\u00edm re\u017eimu potvrzen\u00ed (acknowledgement mode). Broker bu\u010f odstran\u00ed \u00fasp\u011b\u0161n\u011b zpracovanou zpr\u00e1vu, nebo znovu doru\u010d\u00ed nezpracovanou nebo selhanou (za p\u0159edpokladu, \u017ee byly pou\u017eity transakce). <br \/>\nKafka funguje \u00fapln\u011b jinak. Zpr\u00e1vy nejsou odstra\u0148ov\u00e1ny brokerem po p\u0159e\u010dten\u00ed a odpov\u011bdnost za to, co se stane p\u0159i selh\u00e1n\u00ed, le\u017e\u00ed na samotn\u00e9m \u010dtec\u00edm k\u00f3du.<\/p>\n<p>Jak jsme ji\u017e zm\u00ednili, skupina konzument\u016f je spojena s offsetem v logu. Pozice v logu spojen\u00e1 s t\u00edmto offsetem odpov\u00edd\u00e1 n\u00e1sleduj\u00edc\u00ed zpr\u00e1v\u011b, kter\u00e1 bude vyhozena jako odpov\u011b\u010f na <i>poll ()<\/i>Rozhoduj\u00edc\u00ed v\u00fdznam p\u0159i \u010dten\u00ed m\u00e1 okam\u017eik, kdy se tento posun zvy\u0161uje.<\/p>\n<p>Pokud se vr\u00e1t\u00edme k modelu \u010dten\u00ed, kter\u00fd byl diskutov\u00e1n d\u0159\u00edve, zpracov\u00e1n\u00ed zpr\u00e1vy se skl\u00e1d\u00e1 ze t\u0159\u00ed f\u00e1z\u00ed:<\/p>\n<ol>\n<li>Extrahovat zpr\u00e1vu pro \u010dten\u00ed.<\/li>\n<li>Zpracovat zpr\u00e1vu.<\/li>\n<li>Potvrdit zpr\u00e1vu.<\/li>\n<\/ol>\n<p>\nKonzument Kafka p\u0159ich\u00e1z\u00ed s mo\u017enost\u00ed konfigurace <i>enable.auto.commit<\/i>. To je \u010dasto pou\u017e\u00edvan\u00e9 nastaven\u00ed ve v\u00fdchoz\u00edm nastaven\u00ed, jak je obvykl\u00e9 u nastaven\u00ed obsahuj\u00edc\u00edch slovo \u201eauto\u201c.<\/p>\n<p>P\u0159ed verz\u00ed Kafka 0.10 klient, kter\u00fd pou\u017eil tento parametr, poslal posun posledn\u00ed p\u0159e\u010dten\u00e9 zpr\u00e1vy p\u0159i n\u00e1sledn\u00e9m vyvol\u00e1n\u00ed <i>poll ()<\/i> po zpracov\u00e1n\u00ed. To znamenalo, \u017ee v\u0161echny zpr\u00e1vy, kter\u00e9 ji\u017e byly extrahov\u00e1ny, mohly b\u00fdt znovu zpracov\u00e1ny, pokud je klient ji\u017e zpracoval, ale byl neo\u010dek\u00e1van\u011b zni\u010den p\u0159ed vyvol\u00e1n\u00edm <i>poll ()<\/i>. Vzhledem k tomu, \u017ee broker neuchov\u00e1v\u00e1 \u017e\u00e1dn\u00fd stav ohledn\u011b toho, kolikr\u00e1t byla zpr\u00e1va p\u0159e\u010dtena, n\u00e1sleduj\u00edc\u00ed konzument, kter\u00fd tuto zpr\u00e1vu na\u010dte, nebude v\u011bd\u011bt, \u017ee do\u0161lo k n\u011bjak\u00e9 chyb\u011b. Toto chov\u00e1n\u00ed bylo pseudotransak\u010dn\u00ed. Posunut\u00ed bylo provedeno pouze p\u0159i \u00fasp\u011b\u0161n\u00e9m zpracov\u00e1n\u00ed zpr\u00e1vy, ale pokud klient p\u0159eru\u0161il \u010dinnost, broker znovu zaslal stejnou zpr\u00e1vu jin\u00e9mu klientovi. Toto chov\u00e1n\u00ed odpov\u00eddalo garanci doru\u010den\u00ed zpr\u00e1v \u201e<i>alespo\u0148 jednou<\/i>&#171;.<\/p>\n<p>Ve verzi Kafka 0.10 byl k\u00f3d klienta zm\u011bn\u011bn tak, aby se potvrzen\u00ed spou\u0161t\u011blo periodicky knihovnou klienta, podle nastaven\u00ed <i>auto.commit.interval.ms<\/i>. Toto chov\u00e1n\u00ed le\u017e\u00ed n\u011bkde mezi re\u017eimy JMS AUTO_ACKNOWLEDGE a DUPS_OK_ACKNOWLEDGE. P\u0159i pou\u017e\u00edv\u00e1n\u00ed auto potvrzen\u00ed mohly b\u00fdt zpr\u00e1vy potvrzeny bez ohledu na to, zda byly skute\u010dn\u011b zpracov\u00e1ny \u2014 mohlo k tomu doj\u00edt v p\u0159\u00edpad\u011b pomal\u00e9ho konzumenta. Pokud klient p\u0159eru\u0161il \u010dinnost, zpr\u00e1vy byly extrahov\u00e1ny dal\u0161\u00edm konzumentem od potvrzen\u00e9 pozice, co\u017e mohlo v\u00e9st k p\u0159esko\u010den\u00ed zpr\u00e1v. V tomto p\u0159\u00edpad\u011b Kafka neztr\u00e1cela zpr\u00e1vy, pouze k\u00f3d \u010dtouc\u00ed je nezpracov\u00e1val.<\/p>\n<p>Tento re\u017eim m\u00e1 stejn\u00e9 vyhl\u00eddky jako ve verzi 0.9: zpr\u00e1vy mohou b\u00fdt zpracov\u00e1ny, ale v p\u0159\u00edpad\u011b selh\u00e1n\u00ed m\u016f\u017ee b\u00fdt posun neopotvrzen, co\u017e potenci\u00e1ln\u011b m\u016f\u017ee v\u00e9st k duplikaci doru\u010den\u00ed. \u010c\u00edm v\u00edce zpr\u00e1v extrahujete b\u011bhem <i>poll ()<\/i>, t\u00edm v\u011bt\u0161\u00ed je tento probl\u00e9m.<\/p>\n<p>Jak bylo diskutov\u00e1no v \u010d\u00e1sti \u201e\u010cten\u00ed zpr\u00e1v z fronty\u201c na str. 21, v syst\u00e9mu zas\u00edl\u00e1n\u00ed zpr\u00e1v neexistuje pojem o jednor\u00e1zov\u00e9 dod\u00e1vce zpr\u00e1vy, pokud vezmeme v \u00favahu re\u017eimy selh\u00e1n\u00ed.<\/p>\n<p>V Kafce existuj\u00ed dva zp\u016fsoby, jak potvrdit (komitovat) offset: automaticky a ru\u010dn\u011b. V obou p\u0159\u00edpadech mohou b\u00fdt zpr\u00e1vy zpracov\u00e1ny v\u00edce ne\u017e jednou, pokud byla zpr\u00e1va zpracov\u00e1na, ale do\u0161lo k selh\u00e1n\u00ed p\u0159ed potvrzen\u00edm. Tak\u00e9 m\u016f\u017eete zpr\u00e1vu v\u016fbec nezpracovat, pokud bylo potvrzen\u00ed provedeno na pozad\u00ed a v\u00e1\u0161 k\u00f3d byl ukon\u010den d\u0159\u00edve, ne\u017e za\u010dal zpracov\u00e1vat (to m\u016f\u017ee b\u00fdt v Kafce 0.9 a star\u0161\u00edch verz\u00edch).<\/p>\n<p>Spravovat proces potvrzov\u00e1n\u00ed offsetu ru\u010dn\u011b lze v API konzumenta Kafky, nastaven\u00edm parametru <i>enable.auto.commit<\/i> na hodnotu false a explicitn\u00edm vyvol\u00e1n\u00edm jednoho z n\u00e1sleduj\u00edc\u00edch metod:<\/p>\n<pre><code class=\"java\">void commitSync();\nvoid commitAsync();<\/code><\/pre>\n<p>\nPokud se sna\u017e\u00edte zpracovat zpr\u00e1vu \u201ealespo\u0148 jednou\u201c, mus\u00edte ru\u010dn\u011b potvrdit offset pomoc\u00ed <i>commitSync ()<\/i>, proveden\u00edm tohoto p\u0159\u00edkazu ihned po zpracov\u00e1n\u00ed zpr\u00e1v.<\/p>\n<p>Tyto metody neumo\u017e\u0148uj\u00ed potvrzovat (acknowledged) zpr\u00e1vy, dokud nejsou zpracov\u00e1ny, ale nic ned\u011blaj\u00ed k odstran\u011bn\u00ed potenci\u00e1ln\u00edho zdvojen\u00ed zpracov\u00e1n\u00ed, p\u0159i\u010dem\u017e vytv\u00e1\u0159ej\u00ed dojem transak\u010dnosti. V Kafce chyb\u00ed transakce. Klient nem\u00e1 mo\u017enost ud\u011blat n\u00e1sleduj\u00edc\u00ed:<\/p>\n<ul>\n<li>Automaticky vr\u00e1tit (roll back) selhanou zpr\u00e1vu. Konzumenti mus\u00ed sami zpracovat v\u00fdjimky, kter\u00e9 vznikaj\u00ed v d\u016fsledku probl\u00e9mov\u00fdch payload\u016f a odpojen\u00ed backendu, jeliko\u017e nemohou spol\u00e9hat na opakovanou dod\u00e1vku zpr\u00e1v brokerem.<\/li>\n<li>Odeslat zpr\u00e1vy do n\u011bkolika t\u00e9mat v r\u00e1mci jedn\u00e9 atom\u00e1rn\u00ed operace. Jak brzy uvid\u00edme, kontrola nad r\u016fzn\u00fdmi t\u00e9maty a partitiony m\u016f\u017ee b\u00fdt na r\u016fzn\u00fdch stroj\u00edch v klastru Kafky, kter\u00e9 nekontroluj\u00ed transakce p\u0159i odes\u00edl\u00e1n\u00ed. K okam\u017eiku naps\u00e1n\u00ed tohoto \u010dl\u00e1nku byla provedena ur\u010dit\u00e1 pr\u00e1ce, aby se to stalo mo\u017en\u00fdm pomoc\u00ed KIP-98.<\/li>\n<li>Sv\u00e1zat \u010dten\u00ed jedn\u00e9 zpr\u00e1vy z jednoho t\u00e9matu s odesl\u00e1n\u00edm jin\u00e9 zpr\u00e1vy do jin\u00e9ho t\u00e9matu. Znovu, architektura Kafky z\u00e1vis\u00ed na mnoha nez\u00e1visl\u00fdch stroj\u00edch, kter\u00e9 funguj\u00ed jako jedna sb\u011brnice a nen\u00ed d\u011bl\u00e1na \u017e\u00e1dn\u00e1 snaha to skr\u00fdt. Nap\u0159\u00edklad neexistuj\u00ed komponenty API, kter\u00e9 by umo\u017enily sv\u00e1zat <i>Konzument <\/i>a <i>Producent <\/i>v transakci. V JMS je to zaji\u0161t\u011bno objektem <i>Session<\/i>, ze kter\u00e9ho se vytv\u00e1\u0159ej\u00ed <i>MessageProducers <\/i>a <i>MessageConsumers<\/i>.<\/li>\n<\/ul>\n<p>\nPokud se nem\u016f\u017eeme spol\u00e9hat na transakce, jak m\u016f\u017eeme zajistit s\u00e9mantiku, kter\u00e1 se v\u00edce bl\u00ed\u017e\u00ed t\u00e9, kterou poskytuj\u00ed tradi\u010dn\u00ed syst\u00e9my v\u00fdm\u011bny zpr\u00e1v?<\/p>\n<p>Pokud existuje pravd\u011bpodobnost, \u017ee offset spot\u0159ebitele se m\u016f\u017ee zv\u00fd\u0161it d\u0159\u00edve, ne\u017e byla zpr\u00e1va zpracov\u00e1na, nap\u0159\u00edklad b\u011bhem selh\u00e1n\u00ed spot\u0159ebitele, nem\u00e1 spot\u0159ebitel \u017e\u00e1dn\u00fd zp\u016fsob, jak zjistit, zda jeho skupina spot\u0159ebitel\u016f zme\u0161kala zpr\u00e1vy, kdy\u017e j\u00ed byla p\u0159id\u011blena partition. Jednou ze strategi\u00ed je vr\u00e1tit (rewind) offset na p\u0159edchoz\u00ed pozici. API spot\u0159ebitele Kafka poskytuje n\u00e1sleduj\u00edc\u00ed metody pro to:<\/p>\n<pre><code class=\"java\">void seek(TopicPartition partition, long offset);\nvoid seekToBeginning(Collection  partitions);<\/code><\/pre>\n<p>\nMetoda <i>seek ()<\/i> lze pou\u017e\u00edt s metodou <br \/>\n<i>offsetsForTimes (Map timestampsToSearch)<\/i> pro vr\u00e1cen\u00ed do stavu v n\u011bjak\u00e9m konkr\u00e9tn\u00edm okam\u017eiku v minulosti.<\/p>\n<p>Z\u00e1rove\u0148 pou\u017e\u00edv\u00e1n\u00ed tohoto p\u0159\u00edstupu znamen\u00e1, \u017ee je vysoce pravd\u011bpodobn\u00e9, \u017ee n\u011bkter\u00e9 zpr\u00e1vy, kter\u00e9 byly d\u0159\u00edve zpracov\u00e1ny, budou p\u0159e\u010dteny a zpracov\u00e1ny znovu. Abychom tomu p\u0159ede\u0161li, m\u016f\u017eeme pou\u017e\u00edt idempotentn\u00ed \u010dten\u00ed, jak je pops\u00e1no v kapitole 4, k sledov\u00e1n\u00ed d\u0159\u00edve sledovan\u00fdch zpr\u00e1v a vylou\u010den\u00ed duplicit.<\/p>\n<p>Jako alternativa m\u016f\u017ee b\u00fdt k\u00f3d va\u0161eho spot\u0159ebitele jednoduch\u00fd, pokud je mo\u017en\u00e9 ztratit nebo duplikovat zpr\u00e1vy. Kdy\u017e zva\u017eujeme sc\u00e9n\u00e1\u0159e pou\u017eit\u00ed, pro kter\u00e9 je Kafka obvykle pou\u017e\u00edv\u00e1na, nap\u0159\u00edklad zpracov\u00e1n\u00ed ud\u00e1lost\u00ed log\u016f, metrik, sledov\u00e1n\u00ed kliknut\u00ed atd., pochop\u00edme, \u017ee ztr\u00e1ta jednotliv\u00fdch zpr\u00e1v pravd\u011bpodobn\u011b nebude m\u00edt v\u00fdznamn\u00fd dopad na okoln\u00ed aplikace. V t\u011bchto p\u0159\u00edpadech jsou v\u00fdchoz\u00ed hodnoty zcela p\u0159ijateln\u00e9. Na druh\u00e9 stran\u011b, pokud va\u0161e aplikace pot\u0159ebuje zpracov\u00e1vat platby, mus\u00ed pe\u010dliv\u011b db\u00e1t na ka\u017edou jednotlivou zpr\u00e1vu. V\u0161echno se to odv\u00edj\u00ed od kontextu.<\/p>\n<p>Osobn\u00ed pozorov\u00e1n\u00ed ukazuj\u00ed, \u017ee s rostouc\u00ed intenzitou zpr\u00e1v kles\u00e1 hodnota ka\u017ed\u00e9 jednotliv\u00e9 zpr\u00e1vy. Velk\u00e9 objemy zpr\u00e1v se obvykle st\u00e1vaj\u00ed cenn\u00fdmi, pokud jsou zva\u017eov\u00e1ny v agregovan\u00e9 form\u011b.<\/p>\n<h2>Vysok\u00e1 dostupnost (High Availability)<\/h2>\n<p>\nP\u0159\u00edstup Kafka k vysok\u00e9 dostupnosti se v\u00fdrazn\u011b li\u0161\u00ed od p\u0159\u00edstupu ActiveMQ. Kafka je navr\u017eena na z\u00e1klad\u011b horizont\u00e1ln\u011b \u0161k\u00e1lovateln\u00fdch klastr\u016f, kde v\u0161echny instance brokera p\u0159ij\u00edmaj\u00ed a distribuuj\u00ed zpr\u00e1vy sou\u010dasn\u011b.<\/p>\n<p>Klastar Kafka se skl\u00e1d\u00e1 z n\u011bkolika instanc\u00ed brokera pracuj\u00edc\u00edch na r\u016fzn\u00fdch serverech. Kafka byla navr\u017eena pro provoz na b\u011b\u017en\u00e9m autonomn\u00edm hardwaru, p\u0159i\u010dem\u017e ka\u017ed\u00fd uzel m\u00e1 sv\u00e9 vlastn\u00ed dedikovan\u00e9 \u00falo\u017ei\u0161t\u011b. Pou\u017eit\u00ed s\u00ed\u0165ov\u00fdch \u00falo\u017ei\u0161\u0165 (SAN) se nedoporu\u010duje, proto\u017ee v\u00edce v\u00fdpo\u010detn\u00edch uzl\u016f m\u016f\u017ee sout\u011b\u017eit o \u010dasov\u00e9 intervaly \u00falo\u017ei\u0161t\u011b a vytv\u00e1\u0159et konflikty.<i>M<\/i>\u00ed<\/p>\n<p>Kafka je <i>trvale zapnut\u00e1<\/i> syst\u00e9m. Mnoz\u00ed velc\u00ed u\u017eivatel\u00e9 Kafka nikdy nevyp\u00ednaj\u00ed sv\u00e9 klastry a software v\u017edy zaji\u0161\u0165uje aktualizaci prost\u0159ednictv\u00edm sekven\u010dn\u00edho restartu. Toho je dosa\u017eeno zaji\u0161t\u011bn\u00edm kompatibility s p\u0159edchoz\u00ed verz\u00ed pro zpr\u00e1vy a interakce mezi brokery.<\/p>\n<p>Brokery jsou p\u0159ipojeny k cloudu server\u016f <noindex><a rel=\"nofollow\" href=\"http:\/\/zookeeper.apache.org\">ZooKeeper<\/a><\/noindex>, kter\u00fd funguje jako registr konfigura\u010dn\u00edch dat a slou\u017e\u00ed k udr\u017eov\u00e1n\u00ed koordinace rol\u00ed ka\u017ed\u00e9ho brokera. ZooKeeper je tak\u00e9 distribuovan\u00fd syst\u00e9m, kter\u00fd zaji\u0161\u0165uje vysokou dostupnost prost\u0159ednictv\u00edm replikace informac\u00ed pomoc\u00ed nastaven\u00ed <i>kv\u00f3ra.<\/i>.<\/p>\n<p>V z\u00e1kladn\u00edm p\u0159\u00edpad\u011b je t\u00e9ma vytvo\u0159eno v klastru Kafka s n\u00e1sleduj\u00edc\u00edmi vlastnostmi:<\/p>\n<ul>\n<li>Po\u010det partition. Jak ji\u017e bylo d\u0159\u00edve diskutov\u00e1no, p\u0159esn\u00e1 hodnota pou\u017e\u00edvan\u00e1 zde z\u00e1vis\u00ed na po\u017eadovan\u00e9 \u00farovni paraleln\u00edho \u010dten\u00ed.<\/li>\n<li>Faktor replikace ur\u010duje, kolik instanc\u00ed brokera v klastru by m\u011blo m\u00edt protokoly pro tuto partition.<\/li>\n<\/ul>\n<p>\nD\u00edky koordinaci pomoc\u00ed ZooKeepera se Kafka sna\u017e\u00ed spravedliv\u011b rozd\u011blit nov\u00e9 partition mezi brokery v klastru. Toho dosahuje jedna instance, kter\u00e1 vykon\u00e1v\u00e1 roli kontrol\u00e9ru.<\/p>\n<p>V b\u011bhu <i>pro ka\u017edou partition t\u00e9matu<\/i> <i>Ovlada\u010d <\/i>p\u0159i\u0159azuje brokerovi role <i>l\u00eddera <\/i>(leader, master, vedouc\u00ed) a <i>n\u00e1sledovn\u00edk\u016f <\/i>(n\u00e1sledovn\u00edk\u016f, otrok\u016f, pod\u0159\u00edzen\u00fdch). Broker, kter\u00fd slou\u017e\u00ed jako l\u00eddr pro tuto partition, je odpov\u011bdn\u00fd za p\u0159\u00edjem v\u0161ech zpr\u00e1v, kter\u00e9 mu producenti pos\u00edlaj\u00ed, a za distribuci zpr\u00e1v mezi spot\u0159ebitele. P\u0159i odes\u00edl\u00e1n\u00ed zpr\u00e1v do partition t\u00e9matu se replikuj\u00ed na v\u0161echny uzly brokera, kter\u00e9 slou\u017e\u00ed jako n\u00e1sledovn\u00edci pro tuto partition. Ka\u017ed\u00fd uzel, kter\u00fd m\u00e1 logy pro partition, se naz\u00fdv\u00e1 <i>replikou<\/i>. Broker m\u016f\u017ee slou\u017eit jako l\u00eddr pro n\u011bkter\u00e9 partition a jako n\u00e1sledovn\u00edk pro jin\u00e9.<\/p>\n<p>N\u00e1sledovn\u00edk, kter\u00fd obsahuje v\u0161echny zpr\u00e1vy ulo\u017een\u00e9 u l\u00eddra, se naz\u00fdv\u00e1 <i>synchronizovan\u00e1 replika<\/i> (replica in-sync). Pokud se broker, kter\u00fd slou\u017e\u00ed jako l\u00eddr pro partition, odpoj\u00ed, jak\u00fdkoli broker, kter\u00fd je v koherentn\u00edm nebo synchronizovan\u00e9m stavu pro tuto partition, m\u016f\u017ee p\u0159evz\u00edt roli l\u00eddra. To je extr\u00e9mn\u011b odoln\u00fd design.<\/p>\n<p>Sou\u010d\u00e1st\u00ed konfigurace producenta je parametr <i>acks<\/i>, kter\u00fd ur\u010duje, kolik replik mus\u00ed potvrdit (acknowledge) p\u0159ijet\u00ed zpr\u00e1vy, ne\u017e aplikace pokra\u010duje v odes\u00edl\u00e1n\u00ed: 0, 1 nebo v\u0161echno. Pokud je nastavena hodnota <i>all<\/i>, pak p\u0159i p\u0159ijet\u00ed zpr\u00e1vy l\u00eddr ode\u0161le potvrzen\u00ed (confirmation) zp\u011bt producentovi, jakmile obdr\u017e\u00ed potvrzen\u00ed (acknowledgements) z\u00e1pisu od n\u011bkolika replik (v\u010detn\u011b sebe), ur\u010den\u00fdch nastaven\u00edm t\u00e9matu <i>min.insync.replicas<\/i> (v\u00fdchoz\u00ed hodnota 1). Pokud se zpr\u00e1vu nelze \u00fasp\u011b\u0161n\u011b replikovat, producent vyvol\u00e1 v\u00fdjimku pro aplikaci (<i>NotEnoughReplicas<\/i> nebo <i>NotEnoughReplicasAfterAppend<\/i>).<\/p>\n<p>V typick\u00e9 konfiguraci se vytv\u00e1\u0159\u00ed t\u00e9ma s replikac\u00ed 3 (1 l\u00eddr, 2 n\u00e1sledovn\u00edci pro ka\u017edou partition) a parametr <i>min.insync.replicas<\/i> je nastaven na hodnotu 2. V tomto p\u0159\u00edpad\u011b cluster umo\u017en\u00ed, aby se jeden z broker\u016f spravuj\u00edc\u00edch partition t\u00e9matu mohl odpojit bez vlivu na klientsk\u00e9 aplikace.<\/p>\n<p>To n\u00e1s vrac\u00ed k ji\u017e zn\u00e1m\u00e9mu kompromisu mezi v\u00fdkonem a spolehlivost\u00ed. Replikace se d\u011bje na \u00fakor dodate\u010dn\u00e9ho \u010dasu pot\u0159ebn\u00e9ho na potvrzen\u00ed (acknowledgments) od n\u00e1sledovn\u00edk\u016f. I kdy\u017e se prov\u00e1d\u00ed paraleln\u011b, replikace, alespo\u0148 na t\u0159i uzly, m\u00e1 v\u00fdkon stejn\u00fd jako na dva (ignorujme zv\u00fd\u0161en\u00e9 vyu\u017eit\u00ed \u0161\u00ed\u0159ky p\u00e1sma s\u00edt\u011b).<\/p>\n<p>Pou\u017eit\u00edm tohoto sch\u00e9matu replikace se Kafka \u0161ikovn\u011b vyh\u00fdb\u00e1 nutnosti fyzicky zapisovat ka\u017edou zpr\u00e1vu na disk pomoc\u00ed operace <i>sync()<\/i>. Ka\u017ed\u00e1 zpr\u00e1va odeslan\u00e1 producentem bude zaps\u00e1na do den\u00edku partition, ale jak bylo diskutov\u00e1no v Kapitole 2, z\u00e1pis do souboru se nejprve prov\u00e1d\u00ed v pam\u011bti opera\u010dn\u00edho syst\u00e9mu. Pokud je tato zpr\u00e1va replikov\u00e1na na jinou instanci Kafka a nach\u00e1z\u00ed se v jej\u00ed pam\u011bti, ztr\u00e1ta v\u016fdce neznamen\u00e1, \u017ee sama zpr\u00e1va byla ztracena \u2014 jej\u00edmu p\u0159evzet\u00ed se m\u016f\u017ee ujmout synchronizovan\u00e1 replikace.<br \/>\nOdstran\u011bn\u00ed pot\u0159eby prov\u00e1d\u011bt operaci <i>sync()<\/i> znamen\u00e1, \u017ee Kafka m\u016f\u017ee p\u0159ij\u00edmat zpr\u00e1vy rychlost\u00ed, s jakou je m\u016f\u017ee zapisovat do pam\u011bti. A naopak, \u010d\u00edm d\u00e9le lze vyhnout vypr\u00e1zdn\u011bn\u00ed (flush) pam\u011bti na disk, t\u00edm l\u00e9pe. Z tohoto d\u016fvodu nen\u00ed neobvykl\u00e9, \u017ee broker\u016fm Kafka je p\u0159id\u011bleno 64 GB pam\u011bti nebo v\u00edce. Takov\u00e9 pou\u017e\u00edv\u00e1n\u00ed pam\u011bti znamen\u00e1, \u017ee jedna instance Kafka m\u016f\u017ee snadno fungovat p\u0159i rychlostech tis\u00edckr\u00e1t rychlej\u0161\u00edch ne\u017e tradi\u010dn\u00ed broker zpr\u00e1v.<\/p>\n<p>Kafka m\u016f\u017ee b\u00fdt tak\u00e9 nakonfigurov\u00e1na pro aplikaci operace <i>sync()<\/i> na bal\u00ed\u010dky zpr\u00e1v. Vzhledem k tomu, \u017ee v\u0161e v Kafka je zam\u011b\u0159eno na pr\u00e1ci s bal\u00ed\u010dky, ve skute\u010dnosti to dob\u0159e funguje pro mnoh\u00e9 vyu\u017eit\u00ed a je to u\u017eite\u010dn\u00fd n\u00e1stroj pro u\u017eivatele, kte\u0159\u00ed vy\u017eaduj\u00ed velmi siln\u00e9 z\u00e1ruky. V\u011bt\u0161ina \u010dist\u00e9ho v\u00fdkonu Kafka souvis\u00ed se zpr\u00e1vami, kter\u00e9 jsou odes\u00edl\u00e1ny brokerovi ve form\u011b bal\u00ed\u010dk\u016f, a s t\u00edm, \u017ee tyto zpr\u00e1vy jsou \u010dteny z brokera po sekven\u010dn\u00edch bloc\u00edch pomoc\u00ed <noindex><a rel=\"nofollow\" href=\"http:\/\/www.linuxjournal.com\/article\/6345\">zero-copy<\/a><\/noindex> operac\u00ed (operacemi, b\u011bhem nich\u017e se neprov\u00e1d\u00ed \u00fakol kop\u00edrov\u00e1n\u00ed dat z jedn\u00e9 oblasti pam\u011bti do druh\u00e9). To posledn\u00ed je velk\u00fdm ziskem z hlediska v\u00fdkonu a zdroj\u016f a je mo\u017en\u00e9 pouze d\u00edky pou\u017eit\u00ed z\u00e1kladn\u00ed struktury datov\u00e9ho den\u00edku, kter\u00e1 ur\u010duje sch\u00e9ma partition.<\/p>\n<p>V klastru Kafka je mo\u017en\u00e9 dos\u00e1hnout mnohem vy\u0161\u0161\u00edho v\u00fdkonu ne\u017e p\u0159i pou\u017eit\u00ed jednoho brokera Kafka, proto\u017ee partitiony t\u00e9matu mohou horizont\u00e1ln\u011b \u0161k\u00e1lovat na mnoha samostatn\u00fdch stroj\u00edch.<\/p>\n<h2>Z\u00e1v\u011bry<\/h2>\n<p>\nV t\u00e9to kapitole jsme prozkoumali, jak architektura Kafka p\u0159ehodnocuje vztahy mezi klienty a brokery, aby zajistila mimo\u0159\u00e1dn\u011b odoln\u00fd kan\u00e1l pro p\u0159enos zpr\u00e1v, s propustnost\u00ed mnohokr\u00e1t vy\u0161\u0161\u00ed ne\u017e u b\u011b\u017en\u00e9ho brokeru zpr\u00e1v. Diskutovali jsme o funkcionalit\u011b, kterou k dosa\u017een\u00ed tohoto c\u00edle pou\u017e\u00edv\u00e1, a stru\u010dn\u011b se pod\u00edvali na architekturu aplikac\u00ed, kter\u00e9 tuto funkcionalitu zaji\u0161\u0165uj\u00ed. V n\u00e1sleduj\u00edc\u00ed kapitole se budeme zab\u00fdvat b\u011b\u017en\u00fdmi probl\u00e9my, kter\u00e9 mus\u00ed aplikace zalo\u017een\u00e9 na v\u00fdm\u011bn\u011b zpr\u00e1v \u0159e\u0161it, a prodiskutujeme strategie jejich \u0159e\u0161en\u00ed. Kapitolu zakon\u010d\u00edme n\u00e1\u010drtem, jak uva\u017eovat o technologi\u00edch v\u00fdm\u011bny zpr\u00e1v obecn\u011b, abyste mohli posoudit jejich vhodnost pro va\u0161e sc\u00e9n\u00e1\u0159e pou\u017eit\u00ed.<\/p>\n<p>P\u0159edchoz\u00ed p\u0159elo\u017een\u00e1 \u010d\u00e1st: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/466385\/\">Porozum\u011bn\u00ed zprost\u0159edkovatel\u016fm zpr\u00e1v. Studium mechaniky v\u00fdm\u011bny zpr\u00e1v prost\u0159ednictv\u00edm ActiveMQ a Kafka. Kapitola 1<\/a><\/noindex><\/p>\n<p><b> P\u0159eklad byl proveden: <noindex><a rel=\"nofollow\" href=\"http:\/\/tele.gg\/middle_java\">tele.gg\/middle_java<\/a><\/noindex><\/b><\/p>\n<p><i>Pokra\u010dov\u00e1n\u00ed p\u0159\u00ed\u0161t\u011b\u2026<\/i><\/p>\n<p class=\"for_users_only_msg\">Pouze registrovan\u00ed u\u017eivatel\u00e9 se mohou \u00fa\u010dastnit ankety. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">P\u0159ihlaste se<\/a><\/noindex>, pros\u00edm.<\/p>\n<h2 class=\"default-block__polling-title\">Pou\u017e\u00edv\u00e1 se Kafka ve va\u0161\u00ed organizaci?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ano<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ne<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    D\u0159\u00edve se pou\u017e\u00edvala, nyn\u00ed ne<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Pl\u00e1nujeme pou\u017e\u00edvat<\/p>\n<\/li>\n<\/ul>\n<p>    Hlasovalo 38 u\u017eivatel\u016f. Zdr\u017eelo se 8 u\u017eivatel\u016f.<br \/>\n<br \/>Zdroj: <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\/cs\/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=\"cs_CZ\" \/>\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\/cs\/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\udd47Pochopen\u00ed broker\u016f zpr\u00e1v. Studium mechaniky v\u00fdm\u011bny zpr\u00e1v pomoc\u00ed ActiveMQ a Kafka. Kapitola 3. Kafka | ProHoster","description":"Pokra\u010dov\u00e1n\u00ed p\u0159ekladu mal\u00e9 knihy: \u201eUnderstanding Message Brokers\u201c, autor: Jakub Korab, vydavatelstv\u00ed: O'Reilly Media, Inc., datum vyd\u00e1n\u00ed: \u010derven 2017, ISBN: 9781492049296. P\u0159edchoz\u00ed p\u0159eklad.","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/38172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=38172"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/38172\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=38172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=38172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=38172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}