{"id":54431,"date":"2019-12-26T00:00:00","date_gmt":"2019-12-25T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-kafka-stala-bylyu"},"modified":"2020-02-18T14:02:26","modified_gmt":"2020-02-18T11:02:26","slug":"kak-kafka-stala-bylyu","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-kafka-stala-bylyu","title":{"rendered":"Ako sa Kafka stala realitou","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Ako sa Kafka stala realitou\" src=\"\/wp-content\/uploads\/2019\/12\/e61bf54b10e4e44a5c680185b0c16655.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahoj, Habr!<\/p>\n<p><\/p>\n<p>Pracujem v t\u00edme Tinkoff, ktor\u00fd sa zaober\u00e1 v\u00fdvojom vlastn\u00e9ho centra notifik\u00e1ci\u00ed. V\u00e4\u010d\u0161inou vyv\u00edjam v Jave pomocou Spring boot a rie\u0161im r\u00f4zne technick\u00e9 probl\u00e9my, ktor\u00e9 sa v projekte objavuj\u00fa.<\/p>\n<p><\/p>\n<p>V\u00e4\u010d\u0161ina na\u0161ich mikroservisov asynchr\u00f3nne interaguje navz\u00e1jom prostredn\u00edctvom spr\u00e1vy. Predt\u00fdm sme ako broker pou\u017e\u00edvali IBM MQ, ktor\u00fd u\u017e nezvl\u00e1dal za\u0165a\u017eenie, ale mal vysok\u00e9 z\u00e1ruky dodania.<\/p>\n<p><\/p>\n<p>Na jeho nahradenie n\u00e1m navrhli Apache Kafka, ktor\u00e1 m\u00e1 vysok\u00fd potenci\u00e1l na \u0161k\u00e1lovanie, ale bohu\u017eia\u013e si vy\u017eaduje prakticky individu\u00e1lny pr\u00edstup k konfigur\u00e1cii pre r\u00f4zne scen\u00e1re. Okrem toho mechanzimus at least once delivery, ktor\u00fd v Kafke pracuje ako predvolen\u00e9 nastavenie, neumo\u017enil udr\u017eiava\u0165 potrebn\u00fa \u00farove\u0148 konzistencie priamo z krabice. \u010ealej sa podel\u00edm o na\u0161e sk\u00fasenosti s konfigur\u00e1ciou Kafky, konkr\u00e9tne o tom, ako nastavi\u0165 a \u017ei\u0165 s exactly once delivery.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"garantirovannaya-dostavka-i-ne-tolko\">Zaru\u010den\u00e9 dodanie a nielen to<\/h2>\n<p><\/p>\n<p>Parametre, o ktor\u00fdch sa bude hovori\u0165 \u010falej, pom\u00f4\u017eu zabr\u00e1ni\u0165 mno\u017estvu probl\u00e9mov s predvolen\u00fdmi pripojovac\u00edmi nastaveniami. Ale najprv chcem venova\u0165 pozornos\u0165 jedn\u00e9mu parametru, ktor\u00fd u\u013eah\u010d\u00ed mo\u017en\u00fd debugging.<\/p>\n<p><\/p>\n<p>S t\u00fdmto pom\u00f4\u017ee <strong>client.id<\/strong> pre Producer a Consumer. Na prv\u00fd poh\u013ead m\u00f4\u017ee by\u0165 ako hodnota pou\u017eit\u00e9 meno aplik\u00e1cie, a vo v\u00e4\u010d\u0161ine pr\u00edpadov to bude fungova\u0165. Hoci situ\u00e1cia, ke\u010f aplik\u00e1cia pou\u017e\u00edva viacero Consumerov a vy im nastav\u00edte rovnak\u00fd client.id, vedie k nasleduj\u00facemu varovaniu:<\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.utils.AppInfoParser \u2014 Chyba pri registr\u00e1cii AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0<\/code><\/pre>\n<p><\/p>\n<p>Ak chcete v aplik\u00e1cii s Kafkou pou\u017e\u00edva\u0165 JMX, m\u00f4\u017ee to by\u0165 probl\u00e9m. Pre tento pr\u00edpad je najlep\u0161ie pou\u017ei\u0165 ako hodnotu client.id kombin\u00e1ciu mena aplik\u00e1cie a napr\u00edklad mena topiku. V\u00fdsledok na\u0161ej konfigur\u00e1cie si m\u00f4\u017eete pozrie\u0165 vo v\u00fdstupu pr\u00edkazu <strong>kafka-consumer-groups<\/strong> z n\u00e1strojov od Confluent:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Ako sa Kafka stala realitou\" src=\"\/wp-content\/uploads\/2019\/12\/f807a93f36f262522a613161a549eb91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz si prejdime scen\u00e1r zaru\u010den\u00e9ho dodania spr\u00e1vy. Kafka Producer m\u00e1 parameter <strong>acks<\/strong>, ktor\u00fd umo\u017e\u0148uje nastavi\u0165, po ko\u013ek\u00fdch potvrdeniach by mal l\u00edder klastru pova\u017eova\u0165 spr\u00e1vu za \u00faspe\u0161ne zap\u00edsan\u00fa. Tento parameter m\u00f4\u017ee nadob\u00fada\u0165 nasleduj\u00face hodnoty:<\/p>\n<p><\/p>\n<ul>\n<li>0 \u2014 potvrdenia sa nebud\u00fa bra\u0165 do \u00favahy.<\/li>\n<li>1 \u2014 predvolen\u00e9 nastavenie, potvrdenie je potrebn\u00e9 len od 1 repliky.<\/li>\n<li>\u22121 \u2014 je potrebn\u00e9 potvrdenie od v\u0161etk\u00fdch synchronizovan\u00fdch replik (nastavenie klastera <strong>min.insync.replicas<\/strong>).<\/li>\n<\/ul>\n<p><\/p>\n<p>Z uveden\u00fdch hodn\u00f4t je vidie\u0165, \u017ee acks rovn\u00fd \u22121 poskytuje najsilnej\u0161ie z\u00e1ruky, \u017ee spr\u00e1va nebude straten\u00e1. <\/p>\n<p><\/p>\n<p>Ako v\u0161etci vieme, distribuovan\u00e9 syst\u00e9my nie s\u00fa spo\u013eahliv\u00e9. Aby sme sa chr\u00e1nili pred do\u010dasn\u00fdmi poruchami, Kafka Producer poskytuje parameter <strong>retries<\/strong>, ktor\u00fd umo\u017e\u0148uje nastavi\u0165 po\u010det pokusov o op\u00e4tovn\u00e9 odoslanie po\u010das <strong>delivery.timeout.ms<\/strong>. Ke\u010f\u017ee parameter retries m\u00e1 predvolen\u00fa hodnotu Integer.MAX_VALUE (2147483647), po\u010det op\u00e4tovn\u00fdch odoslan\u00ed spr\u00e1vy sa d\u00e1 regulova\u0165, zmenou len delivery.timeout.ms.<\/p>\n<p><\/p>\n<h2 id=\"dvizhemsya-k-exactly-once-delivery\">Prech\u00e1dzame k presne raz dod\u00e1vke<\/h2>\n<p><\/p>\n<p>Uveden\u00e9 nastavenia umo\u017e\u0148uj\u00fa n\u00e1\u0161mu Producerovi dod\u00e1va\u0165 spr\u00e1vy s vysokou z\u00e1rukou. Po\u010fme teraz hovori\u0165 o tom, ako zabezpe\u010di\u0165 z\u00e1pis len jednej k\u00f3pie spr\u00e1vy do Kafka-topic? V najjednoduch\u0161om pr\u00edpade je potrebn\u00e9 na Produceri nastavi\u0165 parameter <strong>enable.idempotence<\/strong> na hodnotu true. Idempotencia zaru\u010duje z\u00e1pis len jednej spr\u00e1vy do konkr\u00e9tnej part\u00edcie jedn\u00e9ho topicu. Predpokladom pre zapnutie idempotencie s\u00fa hodnoty <strong>acks = all, retry &gt; 0, max.in.flight.requests.per.connection \u2264 5<\/strong>. Ak tieto parametre nie s\u00fa nastaven\u00e9 v\u00fdvoj\u00e1rom, automaticky sa nastavia uveden\u00e9 vy\u0161\u0161ie hodnoty.<\/p>\n<p><\/p>\n<p>Ke\u010f je idempotencia nastaven\u00e1, je potrebn\u00e9 dosiahnu\u0165, aby rovnak\u00e9 spr\u00e1vy prich\u00e1dzali zaka\u017ed\u00fdm do t\u00fdch ist\u00fdch part\u00edci\u00ed. Toho mo\u017eno dosiahnu\u0165 nastaven\u00edm k\u013e\u00fa\u010da a parametru partitioner.class na Producer. Po\u010fme za\u010da\u0165 s k\u013e\u00fa\u010dom. Pre ka\u017ed\u00e9 odoslanie by mal by\u0165 rovnak\u00fd. To sa \u013eahko dosiahne pou\u017eit\u00edm nejak\u00e9ho obchodn\u00e9ho identifik\u00e1tora z p\u00f4vodnej spr\u00e1vy. Parameter partitioner.class m\u00e1 predvolen\u00fa hodnotu \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apache\/kafka\/blob\/trunk\/clients\/src\/main\/java\/org\/apache\/kafka\/clients\/producer\/internals\/DefaultPartitioner.java\">DefaultPartitioner<\/a><\/noindex>. Pri tejto strat\u00e9gii paritizovania v predvolenom nastaven\u00ed postupujeme takto:<\/p>\n<p><\/p>\n<ul>\n<li>Ak je part\u00edcia Explicitne ur\u010den\u00e1 pri odoslan\u00ed spr\u00e1vy, pou\u017eijeme ju.<\/li>\n<li>Ak part\u00edcia nie je ur\u010den\u00e1, ale k\u013e\u00fa\u010d je ur\u010den\u00fd \u2014 vyberieme part\u00edciu pod\u013ea hash k\u013e\u00fa\u010da.<\/li>\n<li>Ak nie s\u00fa ur\u010den\u00e9 ani part\u00edcia, ani k\u013e\u00fa\u010d \u2014 vyber\u00e1me part\u00edcie pod\u013ea poradia (round-robin).<\/li>\n<\/ul>\n<p><\/p>\n<p>Okrem toho, pou\u017eitie k\u013e\u00fa\u010da a idempotentn\u00e9ho odosielania s parametrom <strong>max.in.flight.requests.per.connection = 1<\/strong> poskytuje usporiadan\u00e9 spracovanie spr\u00e1v na Consumer. Je d\u00f4le\u017eit\u00e9 si uvedomi\u0165, \u017ee ak m\u00e1te na svojom klastri nastaven\u00e9 riadenie pr\u00edstupu, potrebujete pr\u00e1va na idempotentn\u00e9 zapisovanie do t\u00e9my.<\/p>\n<p><\/p>\n<p>Ak n\u00e1hodou potrebujete viac mo\u017enost\u00ed idempotentn\u00e9ho odosielania pod\u013ea k\u013e\u00fa\u010da alebo logika na strane Producer vy\u017eaduje zachovanie konzistencie d\u00e1t medzi r\u00f4znymi partiami, transakcie prich\u00e1dzaj\u00fa na pomoc. Okrem toho pomocou re\u0165azovej transakcie m\u00f4\u017eete podmiene\u010dne synchronizova\u0165 z\u00e1pis do Kafka, napr\u00edklad so z\u00e1pisom do DB. Na zapnutie transak\u010dn\u00e9ho odosielania na Producer mus\u00ed by\u0165 idempotentn\u00fd a navy\u0161e prida\u0165 <strong>transactional.id<\/strong>. Ak m\u00e1te vo svojom Kafka klastri nastaven\u00e9 riadenie pr\u00edstupu, potom pre transak\u010dn\u00e9 zapisovanie, rovnako ako pre idempotentn\u00e9, budete potrebova\u0165 pr\u00e1va na z\u00e1pis, ktor\u00e9 m\u00f4\u017eu by\u0165 poskytnut\u00e9 pomocou masky s pou\u017eit\u00edm hodnoty ulo\u017een\u00e9 v transactional.id.<\/p>\n<p><\/p>\n<p>Form\u00e1lne ako identifik\u00e1tor transakcie m\u00f4\u017eete pou\u017ei\u0165 ak\u00fdko\u013evek re\u0165azec, napr\u00edklad n\u00e1zov aplik\u00e1cie. Ale ak sp\u00fa\u0161\u0165ate nieko\u013eko in\u0161tanci\u00ed tej istej aplik\u00e1cie s rovnak\u00fdm transactional.id, prv\u00e1 spusten\u00e1 in\u0161tancia sa zastav\u00ed s chybou, preto\u017ee Kafka ju pova\u017euje za zombie proces. <\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.errors.ProducerFencedException: Producer sa pok\u00fasil o oper\u00e1ciu so star\u00fdm epochom. Bu\u010f existuje nov\u0161\u00ed producer so rovnak\u00fdm transactionalId, alebo transakcia producer bola vypr\u0161an\u00e1 brokerom.<\/code><\/pre>\n<p><\/p>\n<p>Aby sme tento probl\u00e9m vyrie\u0161ili, prid\u00e1me k n\u00e1zvu aplik\u00e1cie suffix vo forme n\u00e1zvu hostite\u013ea, ktor\u00fd z\u00edskame z premenn\u00fdch prostredia. <\/p>\n<p><\/p>\n<p>Producer je nastaven\u00fd, ale transakcie v Kafka riadia iba oblas\u0165 vidite\u013enosti spr\u00e1vy. Bez oh\u013eadu na stav transakcie spr\u00e1va okam\u017eite putuje do t\u00e9my, ale m\u00e1 \u010fal\u0161ie syst\u00e9mov\u00e9 atrib\u00faty.<\/p>\n<p><\/p>\n<p>Aby tak\u00e9to spr\u00e1vy neboli pre\u010d\u00edtan\u00e9 Consumerom pred\u010dasne, mus\u00ed si nastavi\u0165 parameter <strong>isolation.level<\/strong> na hodnotu read_committed. Tak\u00fdto Consumer m\u00f4\u017ee \u010d\u00edta\u0165 netransak\u010dn\u00e9 spr\u00e1vy ako predt\u00fdm, ale transak\u010dn\u00e9 iba po commite.<br \/>\nAk ste nastavili v\u0161etky predch\u00e1dzaj\u00face nastavenia, nastavili ste exactly once delivery. Gratulujem!<\/p>\n<p><\/p>\n<p>Ale existuje e\u0161te jeden detail. Transactional.id, ktor\u00fd sme nastavili vy\u0161\u0161ie, je v skuto\u010dnosti prefix transakcie. K nemu sa v mana\u017e\u00e9ri transakci\u00ed dopisuje poradov\u00e9 \u010d\u00edslo. Z\u00edskan\u00fd identifik\u00e1tor sa vyd\u00e1va na <strong>transactional.id.expiration.ms<\/strong>, ktor\u00fd sa konfiguruje na Kafka klasteri a m\u00e1 predvolen\u00fa hodnotu \u201e7 dn\u00ed\u201c. Ak po\u010das tohto obdobia aplik\u00e1cia nedost\u00e1va \u017eiadne spr\u00e1vy, pri pokuse o nasleduj\u00face transak\u010dn\u00e9 odoslanie dostanete <strong>InvalidPidMappingException<\/strong>. Po tom koordin\u00e1tor transakci\u00ed pridel\u00ed nov\u00e9 poradov\u00e9 \u010d\u00edslo pre nasleduj\u00facu transakciu. V tomto pr\u00edpade m\u00f4\u017ee by\u0165 spr\u00e1va straten\u00e1, ak nebude InvalidPidMappingException spr\u00e1vne spracovan\u00fd. <\/p>\n<p><\/p>\n<h2 id=\"vmesto-itogov\">Namiesto s\u00fahrnov<\/h2>\n<p><\/p>\n<p>Ako m\u00f4\u017eete vidie\u0165, nesta\u010d\u00ed len posiela\u0165 spr\u00e1vy do Kafka. Je potrebn\u00e9 vybra\u0165 kombin\u00e1ciu parametrov a by\u0165 pripraven\u00fd na r\u00fdchle zmeny. V tomto \u010dl\u00e1nku som sa podrobne sna\u017eil uk\u00e1za\u0165 nastavenie exactly once delivery a op\u00edsal nieko\u013eko probl\u00e9mov konfigur\u00e1ci\u00ed client.id a transactional.id, s ktor\u00fdmi sme sa stretli. Ni\u017e\u0161ie v stru\u010dnej forme s\u00fa uveden\u00e9 nastavenia Producer a Consumer.<\/p>\n<p><\/p>\n<p>Producer:<\/p>\n<p><\/p>\n<ol>\n<li>acks = all<\/li>\n<li>retries &gt; 0<\/li>\n<li>enable.idempotence = true<\/li>\n<li>max.in.flight.requests.per.connection \u2264 5 (1 \u2014 pre usporiadan\u00e9 odosielanie)<\/li>\n<li>transactional.id = ${application-name}-${hostname}<\/li>\n<\/ol>\n<p><\/p>\n<p>Consumer:<\/p>\n<p><\/p>\n<ol>\n<li>isolation.level = read_committed<\/li>\n<\/ol>\n<p><\/p>\n<p>Aby sme minimalizovali chyby v bud\u00facich aplik\u00e1ci\u00e1ch, vytvorili sme si vlastn\u00fd wrapper nad spring konfigur\u00e1ciou, kde s\u00fa u\u017e nastaven\u00e9 hodnoty pre niektor\u00e9 z uveden\u00fdch parametrov.<\/p>\n<p><\/p>\n<p>A tu je p\u00e1r materi\u00e1lov na samostatn\u00e9 \u0161t\u00fadium:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/KAFKA\/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging\">KIP-98 \u2014 Exactly Once Delivery a Transak\u010dn\u00e9 Spr\u00e1vy<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/#configuration\">Popis nastaven\u00ed <\/a><\/noindex><\/li>\n<\/ul>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/481784\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u041f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u043d\u0430 Java \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring boot \u0438 \u0440\u0435\u0448\u0430\u044e \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0420\u0430\u043d\u0435\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 IBM MQ, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441 [&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-54431","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff.\" \/>\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\/sk\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a Kafka \u0441\u0442\u0430\u043b\u0430 \u0431\u044b\u043b\u044c\u044e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\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-12-25T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:02:26+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\udd47Ako sa Kafka stala skuto\u010dnos\u0165ou | ProHoster","description":"Ahoj, Habr! Pracujem v t\u00edme Tinkoff.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-kafka-stala-bylyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a Kafka \u0441\u0442\u0430\u043b\u0430 \u0431\u044b\u043b\u044c\u044e | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff.","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-kafka-stala-bylyu","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-12-25T21:00:00+00:00","article:modified_time":"2020-02-18T11:02:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54431","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-24 11:22:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:06:37","updated":"2026-01-24 11:22:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/54431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=54431"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/54431\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=54431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=54431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=54431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}