{"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\/cs\/blog\/administrirovanie\/kak-kafka-stala-bylyu","title":{"rendered":"Jak se Kafka stala skute\u010dnost\u00ed","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Jak se Kafka stala skute\u010dnost\u00ed\" 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>Pracuji v t\u00fdmu Tinkoff, kter\u00fd se zab\u00fdv\u00e1 v\u00fdvojem vlastn\u00edho centra notifikac\u00ed. V\u011bt\u0161inou vyv\u00edj\u00edm na Java pomoc\u00ed Spring Boot a \u0159e\u0161\u00edm r\u016fzn\u00e9 technick\u00e9 probl\u00e9my, kter\u00e9 v projektu vznikaj\u00ed.<\/p>\n<p><\/p>\n<p>V\u011bt\u0161ina na\u0161ich mikroservis\u016f vz\u00e1jemn\u011b asynchronn\u011b komunikuj\u00ed prost\u0159ednictv\u00edm zpr\u00e1vov\u00e9ho brokera. D\u0159\u00edve jsme jako broker pou\u017e\u00edvali IBM MQ, kter\u00fd p\u0159estal zvl\u00e1dat z\u00e1t\u011b\u017e, ale m\u011bl vysok\u00e9 z\u00e1ruky dod\u00e1vky.<\/p>\n<p><\/p>\n<p>Jako n\u00e1hradu n\u00e1m nab\u00eddli Apache Kafka, kter\u00e1 m\u00e1 vysok\u00fd potenci\u00e1l \u0161k\u00e1lov\u00e1n\u00ed, ale bohu\u017eel vy\u017eaduje t\u00e9m\u011b\u0159 individu\u00e1ln\u00ed p\u0159\u00edstup k konfiguraci pro r\u016fzn\u00e9 sc\u00e9n\u00e1\u0159e. Krom\u011b toho mechanismus at least once delivery, kter\u00fd v Kafce funguje jako v\u00fdchoz\u00ed, ne\u017e umo\u017e\u0148oval udr\u017eovat pot\u0159ebnou \u00farove\u0148 konzistence z krabice. D\u00e1le se pod\u011bl\u00edm o na\u0161e zku\u0161enosti s konfigurac\u00ed Kafky, konkr\u00e9tn\u011b o tom, jak nastavit a \u017e\u00edt 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\u00e1 dod\u00e1vka a nejen to<\/h2>\n<p><\/p>\n<p>Parametry, o kter\u00fdch se bude d\u00e1le hovo\u0159it, pomohou p\u0159edej\u00edt \u0159ad\u011b probl\u00e9m\u016f s v\u00fdchoz\u00edmi nastaven\u00edmi p\u0159ipojen\u00ed. Ale nejprve bych cht\u011bl v\u011bnovat pozornost jednomu parametru, kter\u00fd usnadn\u00ed p\u0159\u00edpadn\u00fd debugging.<\/p>\n<p><\/p>\n<p>Tomu pom\u016f\u017ee <strong>client.id<\/strong> pro Producer a Consumer. Na prvn\u00ed pohled lze jako hodnotu pou\u017e\u00edt jm\u00e9no aplikace, a ve v\u011bt\u0161in\u011b p\u0159\u00edpad\u016f to bude fungovat. I kdy\u017e situace, kdy aplikace pou\u017e\u00edv\u00e1 v\u00edce Consumer\u016f a vy nastav\u00edte stejn\u00fd client.id, vede k n\u00e1sleduj\u00edc\u00edmu upozorn\u011bn\u00ed:<\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.utils.AppInfoParser \u2014 Chyba p\u0159i registraci AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0<\/code><\/pre>\n<p><\/p>\n<p>Pokud chcete pou\u017e\u00edvat JMX v aplikaci s Kafkou, m\u016f\u017ee to b\u00fdt probl\u00e9m. Pro tuto situaci je nejlep\u0161\u00ed pou\u017e\u00edt jako hodnotu client.id kombinaci jm\u00e9na aplikace a nap\u0159\u00edklad n\u00e1zvu topiku. V\u00fdsledek na\u0161\u00ed konfigurace si m\u016f\u017eete prohl\u00e9dnout ve v\u00fdstupu p\u0159\u00edkazu <strong>kafka-consumer-groups<\/strong> z n\u00e1stroj\u016f od Confluent:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jak se Kafka stala skute\u010dnost\u00ed\" src=\"\/wp-content\/uploads\/2019\/12\/f807a93f36f262522a613161a549eb91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nyn\u00ed se pod\u00edvejme na sc\u00e9n\u00e1\u0159 zaru\u010den\u00e9ho doru\u010den\u00ed zpr\u00e1vy. Kafkov\u00fd Producer m\u00e1 parametr <strong>acks<\/strong>, kter\u00fd umo\u017e\u0148uje nastavit, po kolika potvrzen\u00edch mus\u00ed v\u016fdce clusteru pova\u017eovat zpr\u00e1vu za \u00fasp\u011b\u0161n\u011b zapsanou. Tento parametr m\u016f\u017ee m\u00edt n\u00e1sleduj\u00edc\u00ed hodnoty:<\/p>\n<p><\/p>\n<ul>\n<li>0 \u2014 potvrzen\u00ed se nebudou po\u010d\u00edtat.<\/li>\n<li>1 \u2014 v\u00fdchoz\u00ed parametr, vy\u017eaduje potvrzen\u00ed pouze od 1 repliky.<\/li>\n<li>\u22121 \u2014 je nutn\u00e9 potvrzen\u00ed od v\u0161ech synchronizovan\u00fdch replik (nastaven\u00ed clustera <strong>min.insync.replicas<\/strong>).<\/li>\n<\/ul>\n<p><\/p>\n<p>Z uveden\u00fdch hodnot je vid\u011bt, \u017ee acks rovn\u00fd \u22121 poskytuje nejvy\u0161\u0161\u00ed z\u00e1ruky, \u017ee zpr\u00e1va nebude ztracena. <\/p>\n<p><\/p>\n<p>Jak v\u0161ichni v\u00edme, distribuovan\u00e9 syst\u00e9my jsou nespolehliv\u00e9. Abychom se chr\u00e1nili p\u0159ed do\u010dasn\u00fdmi poruchami, poskytuje Kafka Producer parametr <strong>retries<\/strong>, kter\u00fd umo\u017e\u0148uje nastavit po\u010det pokus\u016f o op\u011btovn\u00e9 odesl\u00e1n\u00ed b\u011bhem <strong>delivery.timeout.ms<\/strong>. Proto\u017ee m\u00e1 parametr retries ve v\u00fdchoz\u00edm nastaven\u00ed hodnotu Integer.MAX_VALUE (2147483647), lze po\u010det op\u011btovn\u00fdch odesl\u00e1n\u00ed zpr\u00e1vy regulovat zm\u011bnou pouze delivery.timeout.ms.<\/p>\n<p><\/p>\n<h2 id=\"dvizhemsya-k-exactly-once-delivery\">P\u0159ech\u00e1z\u00edme k exactly once delivery<\/h2>\n<p><\/p>\n<p>Uveden\u00e1 nastaven\u00ed umo\u017e\u0148uj\u00ed na\u0161emu Produceru doru\u010dovat zpr\u00e1vy s vysokou z\u00e1rukou. Nyn\u00ed si promluvme o tom, jak zajistit z\u00e1znam pouze jedn\u00e9 kopie zpr\u00e1vy v Kafka-topiku? V nejjednodu\u0161\u0161\u00edm p\u0159\u00edpad\u011b je t\u0159eba na Produceru nastavit parametr <strong>enable.idempotence<\/strong> na hodnotu true. Idempotence zaru\u010duje z\u00e1znam pouze jedn\u00e9 zpr\u00e1vy do konkr\u00e9tn\u00ed partition jednoho topiku. P\u0159edpokladem pro zapnut\u00ed idempotence jsou hodnoty <strong>acks = all, retry &gt; 0, max.in.flight.requests.per.connection \u2264 5<\/strong>. Pokud tyto parametry nejsou nastaveny v\u00fdvoj\u00e1\u0159em, automaticky budou nastaveny uveden\u00e9 v\u00fd\u0161e.<\/p>\n<p><\/p>\n<p>Kdy\u017e je idempotence nastavena, je nutn\u00e9 zajistit, aby stejn\u00e9 zpr\u00e1vy p\u0159ich\u00e1zely v\u017edy do stejn\u00fdch partitions. Toho lze dos\u00e1hnout nastaven\u00edm kl\u00ed\u010de a parametru partitioner.class na Produceru. Poj\u010fme za\u010d\u00edt s kl\u00ed\u010dem. Pro ka\u017ed\u00e9 odesl\u00e1n\u00ed mus\u00ed b\u00fdt stejn\u00fd. Toho lze snadno dos\u00e1hnout pou\u017eit\u00edm jak\u00e9hokoli obchodn\u00edho identifik\u00e1toru z p\u016fvodn\u00ed zpr\u00e1vy. Parametr partitioner.class m\u00e1 ve v\u00fdchoz\u00edm nastaven\u00ed 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>. P\u0159i t\u00e9to standardn\u00ed strategii partitioningu postupujeme takto:<\/p>\n<p><\/p>\n<ul>\n<li>Pokud je partition v\u00fdslovn\u011b uvedena p\u0159i odes\u00edl\u00e1n\u00ed zpr\u00e1vy, pou\u017eijeme ji.<\/li>\n<li>Pokud partition nen\u00ed uvedena, ale je uveden kl\u00ed\u010d \u2014 vybereme partition podle hash kl\u00ed\u010de.<\/li>\n<li>Pokud partition a kl\u00ed\u010d nejsou uvedeny \u2014 vybereme partitiony podle po\u0159ad\u00ed (round-robin).<\/li>\n<\/ul>\n<p><\/p>\n<p>Krom\u011b toho pou\u017eit\u00ed kl\u00ed\u010de a idempotentn\u00edho odes\u00edl\u00e1n\u00ed s parametrem <strong>max.in.flight.requests.per.connection = 1<\/strong> poskytuje uspo\u0159\u00e1dan\u00e9 zpracov\u00e1n\u00ed zpr\u00e1v na Consumer. Je tak\u00e9 d\u016fle\u017eit\u00e9 si pamatovat, \u017ee pokud je v va\u0161em clusteru nastavena spr\u00e1va p\u0159\u00edstupu, budete pot\u0159ebovat opr\u00e1vn\u011bn\u00ed k idempotentn\u00edmu z\u00e1pisu do t\u00e9matu.<\/p>\n<p><\/p>\n<p>Pokud v\u00e1m n\u00e1hodou chyb\u00ed mo\u017enosti idempotentn\u00edho odes\u00edl\u00e1n\u00ed podle kl\u00ed\u010de nebo logika na stran\u011b Producer vy\u017eaduje zachov\u00e1n\u00ed konzistence dat mezi r\u016fzn\u00fdmi partition, p\u0159ich\u00e1zej\u00ed na pomoc transakce. Pomoc\u00ed \u0159et\u011bzov\u00e9 transakce je tak\u00e9 mo\u017en\u00e9 podm\u00edn\u011bn\u011b synchronizovat z\u00e1pis v Kafka, nap\u0159\u00edklad se z\u00e1pisem v DB. Pro povolen\u00ed transak\u010dn\u00edho odes\u00edl\u00e1n\u00ed na Produceru je nutn\u00e9, aby byl idempotentn\u00ed, a nav\u00edc nastavit <strong>transactional.id<\/strong>. Pokud je ve va\u0161em Kafka clusteru nastavena spr\u00e1va p\u0159\u00edstupu, pak pro transak\u010dn\u00ed z\u00e1pis, stejn\u011b jako pro idempotentn\u00ed, budete pot\u0159ebovat opr\u00e1vn\u011bn\u00ed k z\u00e1pisu, kter\u00e9 mohou b\u00fdt poskytnuta pomoc\u00ed masky s hodnotou ulo\u017eenou v transactional.id.<\/p>\n<p><\/p>\n<p>Form\u00e1ln\u011b m\u016f\u017ee b\u00fdt jako identifik\u00e1tor transakce pou\u017eita jak\u00e1koli posloupnost znak\u016f, nap\u0159\u00edklad n\u00e1zev aplikace. Ale pokud spou\u0161t\u00edte n\u011bkolik instanc\u00ed jedn\u00e9 aplikace se stejn\u00fdm transactional.id, prvn\u00ed spu\u0161t\u011bn\u00e1 instance bude zastavena s chybou, proto\u017ee Kafka ji bude pova\u017eovat za zombie proces. <\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.errors.ProducerFencedException: Producer se pokusil prov\u00e9st operaci se starou epochou. Bu\u010f existuje nov\u011bj\u0161\u00ed producer se stejn\u00fdm transactionalId, nebo byla transakce producery vypr\u0161ena brokerem.<\/code><\/pre>\n<p><\/p>\n<p>Abychom tento probl\u00e9m vy\u0159e\u0161ili, p\u0159id\u00e1me k n\u00e1zvu aplikace p\u0159\u00edponu v podob\u011b n\u00e1zvu hostitele, kter\u00fd z\u00edsk\u00e1me z prom\u011bnn\u00fdch prost\u0159ed\u00ed. <\/p>\n<p><\/p>\n<p>Producer je nastaven, ale transakce v Kafka \u0159\u00edd\u00ed pouze oblast viditelnosti zpr\u00e1v. Bez ohledu na stav transakce zpr\u00e1va okam\u017eit\u011b vstupuje do t\u00e9matu, ale m\u00e1 dal\u0161\u00ed syst\u00e9mov\u00e9 atributy.<\/p>\n<p><\/p>\n<p>Aby tyto zpr\u00e1vy nebyly Consumerem na\u010dteny p\u0159ed\u010dasn\u011b, mus\u00ed nastavit parametr <strong>isolation.level<\/strong> na hodnotu read_committed. Takov\u00fd Consumer bude moct \u010d\u00edst netransak\u010dn\u00ed zpr\u00e1vy jako d\u0159\u00edv, zat\u00edmco transak\u010dn\u00ed \u2014 pouze po potvrzen\u00ed.<br \/>\nPokud jste nastavili v\u0161echny v\u00fd\u0161e uveden\u00e9 nastaven\u00ed, nastavili jste exactly once delivery. Gratuluji!<\/p>\n<p><\/p>\n<p>Ale existuje je\u0161t\u011b jedna nuan\u010dn\u00ed. Transactional.id, kter\u00fd jsme nastavovali v\u00fd\u0161e, je ve skute\u010dnosti prefixem transakce. K n\u011bmu je na spr\u00e1vci transakc\u00ed p\u0159id\u00e1n po\u0159adov\u00fd \u010d\u00edslo. Z\u00edskan\u00fd identifik\u00e1tor je vyd\u00e1n na <strong>transactional.id.expiration.ms<\/strong>, kter\u00fd je konfigurov\u00e1n na Kafka clusteru a m\u00e1 v\u00fdchoz\u00ed hodnotu \u201e7 dn\u00ed\u201c. Pokud aplikace b\u011bhem t\u00e9to doby nep\u0159ijme \u017e\u00e1dn\u00e9 zpr\u00e1vy, p\u0159i pokusu o dal\u0161\u00ed transak\u010dn\u00ed odesl\u00e1n\u00ed obdr\u017e\u00edte <strong>InvalidPidMappingException<\/strong>. Po tomto kroku koordinator transakc\u00ed vygeneruje nov\u00e9 po\u0159adov\u00e9 \u010d\u00edslo pro dal\u0161\u00ed transakci. P\u0159itom m\u016f\u017ee b\u00fdt zpr\u00e1va ztracena, pokud nebude InvalidPidMappingException spr\u00e1vn\u011b zpracov\u00e1n. <\/p>\n<p><\/p>\n<h2 id=\"vmesto-itogov\">Nam\u00edsto z\u00e1v\u011br\u016f<\/h2>\n<p><\/p>\n<p>Jak u\u017e bylo zm\u00edn\u011bno, nesta\u010d\u00ed jen pos\u00edlat zpr\u00e1vy do Kafka. Je pot\u0159eba vyb\u00edrat kombinaci parametr\u016f a b\u00fdt p\u0159ipraven na rychl\u00e9 \u00fapravy. V tomto \u010dl\u00e1nku jsem se sna\u017eil podrobn\u011b uk\u00e1zat konfiguraci exactly once delivery a popsal n\u011bkolik probl\u00e9m\u016f s konfiguracemi client.id a transactional.id, se kter\u00fdmi jsme se setkali. N\u00ed\u017ee jsou stru\u010dn\u011b uvedeny nastaven\u00ed 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 pro se\u0159azen\u00e9 odes\u00edl\u00e1n\u00ed)<\/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>Abychom minimalizovali chyby v budouc\u00edch aplikac\u00edch, vytvo\u0159ili jsme na\u0161i vlastn\u00ed ob\u00e1lku nad spring-konfigurac\u00ed, kde jsou ji\u017e n\u011bkter\u00e9 z uveden\u00fdch parametr\u016f nastaveny.<\/p>\n<p><\/p>\n<p>A zde je p\u00e1r materi\u00e1l\u016f pro samostudium:<\/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 and Transactional Messaging<\/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.3 - 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\/cs\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\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\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\/cs\/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\udd47Jak se Kafka stala skute\u010dnost\u00ed | ProHoster","description":"Ahoj, Habr! Pracuji v t\u00fdmu Tinkoff.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-kafka-stala-bylyu","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\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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/54431","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=54431"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/54431\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=54431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=54431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=54431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}