{"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\/ro\/blog\/administrirovanie\/kak-kafka-stala-bylyu","title":{"rendered":"Cum a devenit Kafka realitate","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Cum a devenit Kafka realitate\" src=\"\/wp-content\/uploads\/2019\/12\/e61bf54b10e4e44a5c680185b0c16655.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Salut, Habr!<\/p>\n<p><\/p>\n<p>Lucrez \u00een echipa Tinkoff, care se ocup\u0103 cu dezvoltarea propriei centre de notific\u0103ri. \u00cen cea mai mare parte, dezvolt pe Java folosind Spring Boot \u0219i rezolv diverse probleme tehnice care apar \u00een proiect.<\/p>\n<p><\/p>\n<p>Cele mai multe dintre microserviciile noastre interac\u021bioneaz\u0103 asincron \u00eentre ele prin intermediul unui broker de mesaje. Anterior, foloseam IBM MQ ca broker, care nu mai f\u0103cea fa\u021b\u0103 \u00eenc\u0103rc\u0103turii, dar oferea \u00een acela\u0219i timp garan\u021bii ridicate de livrare.<\/p>\n<p><\/p>\n<p>Ca alternativ\u0103, ne-a fost propus Apache Kafka, care are un poten\u021bial ridicat de scalare, dar, din p\u0103cate, necesit\u0103 practic o abordare individualizat\u0103 pentru configurarea \u00een diferite scenarii. \u00cen plus, mecanismul de livrare at least once, care func\u021bioneaz\u0103 \u00een Kafka \u00een mod implicit, nu permite sus\u021binerea nivelului necesar de consisten\u021b\u0103 din cutie. Mai departe, voi \u00eemp\u0103rt\u0103\u0219i experien\u021ba noastr\u0103 de configurare a Kafka, \u00een special voi explica cum s\u0103 configur\u0103m \u0219i s\u0103 tr\u0103im cu exactly once delivery.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"garantirovannaya-dostavka-i-ne-tolko\">Livrare garantat\u0103 \u0219i nu doar at\u00e2t<\/h2>\n<p><\/p>\n<p>Parametrii despre care vom discuta \u00een continuare te vor ajuta s\u0103 previi o serie de probleme cu set\u0103rile de conectare implicite. Dar mai \u00eent\u00e2i, a\u0219 dori s\u0103 acord aten\u021bie unui parametru care va facilita orice debugg.<\/p>\n<p><\/p>\n<p>Acest lucru te va ajuta <strong>client.id<\/strong> pentru Producer \u0219i Consumer. La prima vedere, ca valoare, po\u021bi folosi numele aplica\u021biei, \u0219i \u00een majoritatea cazurilor, asta va func\u021biona. Totu\u0219i, situa\u021bia \u00een care aplica\u021bia folose\u0219te mai mul\u021bi Consumers \u0219i le aloci acela\u0219i client.id duce la urm\u0103torul avertisment:<\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.utils.AppInfoParser \u2014 Error registering AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0<\/code><\/pre>\n<p><\/p>\n<p>Dac\u0103 vrei s\u0103 folose\u0219ti JMX \u00eentr-o aplica\u021bie cu Kafka, aceasta ar putea fi o problem\u0103. Pentru acest caz, cel mai bine este s\u0103 folose\u0219ti ca valoare client.id o combina\u021bie \u00eentre numele aplica\u021biei \u0219i, de exemplu, numele topic-ului. Rezultatul configura\u021biei noastre poate fi v\u0103zut \u00een output-ul comenzii <strong>kafka-consumer-groups<\/strong> din utilitarele de la Confluent:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cum a devenit Kafka realitate\" src=\"\/wp-content\/uploads\/2019\/12\/f807a93f36f262522a613161a549eb91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Acum s\u0103 analiz\u0103m scenariul livr\u0103rii garantate a mesajelor. Un Kafka Producer are un parametru <strong>acks<\/strong>, care permite configurarea dup\u0103 c\u00e2te acknowledge liderul cluster-ului trebuie s\u0103 considere mesajul ca fiind scris cu succes. Acest parametru poate lua urm\u0103toarele valori:<\/p>\n<p><\/p>\n<ul>\n<li>0 \u2014 acknowledge-urile nu vor fi considerate.<\/li>\n<li>1 \u2014 parametrul implicit, necesit\u0103 acknowledge doar de la 1 replic\u0103.<\/li>\n<li>\u22121 \u2014 necesare acknowledgments de la toate replicile sincronizate (configurarea cluster-ului <strong>min.insync.replicas<\/strong>).<\/li>\n<\/ul>\n<p><\/p>\n<p>Din valorile enumerate, se observ\u0103 c\u0103 acks egal cu \u22121 ofer\u0103 cele mai puternice garan\u021bii c\u0103 mesajul nu se va pierde. <\/p>\n<p><\/p>\n<p>Cum \u0219tim cu to\u021bii, sistemele distribuite sunt nesigure. Pentru a ne proteja de defec\u021biuni temporare, Kafka Producer ofer\u0103 parametrul <strong>retries<\/strong>, care permite stabilirea num\u0103rului de \u00eencerc\u0103ri de retransmitere \u00een decursul <strong>delivery.timeout.ms<\/strong>. Deoarece parametrul retries are valoarea implicit\u0103 Integer.MAX_VALUE (2147483647), num\u0103rul de retransmiteri ale mesajului poate fi reglat modific\u00e2nd doar delivery.timeout.ms.<\/p>\n<p><\/p>\n<h2 id=\"dvizhemsya-k-exactly-once-delivery\">S\u0103 ne \u00eendrept\u0103m spre livrarea exactly once<\/h2>\n<p><\/p>\n<p>Set\u0103rile enumerate permit Producer-ului nostru s\u0103 livreze mesaje cu o garan\u021bie ridicat\u0103. Acum s\u0103 discut\u0103m despre cum putem garanta scrierea unei singure copii a mesajului \u00een topicul Kafka? \u00cen cazul cel mai simplu, pentru aceasta, Producer-ul trebuie s\u0103 seteze parametrul <strong>enable.idempotence<\/strong> la true. Idempotenta garanteaz\u0103 scrierea unui singur mesaj \u00eentr-o anumit\u0103 parti\u021bie a unui topic. O precondi\u021bie pentru activarea idempotentei este setarea valorilor <strong>acks = all, retry &gt; 0, max.in.flight.requests.per.connection \u2264 5<\/strong>. Dac\u0103 ace\u0219ti parametri nu sunt defini\u021bi de dezvoltator, valorile men\u021bionate mai sus vor fi setate automat.<\/p>\n<p><\/p>\n<p>C\u00e2nd idempotenta este configurat\u0103, este esen\u021bial s\u0103 ne asigur\u0103m c\u0103 mesajele identice ajung \u00eentotdeauna \u00een acelea\u0219i parti\u021bii. Acest lucru se poate realiza prin configurarea cheii \u0219i a parametrului partitioner.class pe Producer. S\u0103 \u00eencepem cu cheia. Pentru fiecare trimitere, aceasta ar trebui s\u0103 fie constant\u0103. Este u\u0219or de realizat folosind un identifiant de afaceri din mesajul original. Parametrul partitioner.class are o valoare implicit\u0103 \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>. Cu aceast\u0103 strategie de partajare implicit\u0103, proced\u0103m astfel:<\/p>\n<p><\/p>\n<ul>\n<li>Dac\u0103 parti\u021bia este specificat\u0103 explicit la trimiterea mesajului, o folosim.<\/li>\n<li>Dac\u0103 parti\u021bia nu este specificat\u0103, dar cheia este indicat\u0103 \u2014 alegem parti\u021bia pe baza hash-ului cheii.<\/li>\n<li>Dac\u0103 nici parti\u021bia, nici cheia nu sunt specificate \u2014 alegem parti\u021biile \u00een mod secven\u021bial (round-robin).<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00cen plus, utilizarea cheii \u0219i a trimiterii idempotente cu parametrul <strong>max.in.flight.requests.per.connection = 1<\/strong> \u00ee\u021bi ofer\u0103 un proces ordonat de gestionare a mesajelor pe Consumer. Este important de re\u021binut c\u0103, dac\u0103 pe clusterul t\u0103u este activat controlul accesului, va fi nevoie de permisiuni pentru scrierea idempotent\u0103 \u00een topic.<\/p>\n<p><\/p>\n<p>Dac\u0103 sim\u021bi c\u0103 \u00ee\u021bi lipsesc func\u021bionalit\u0103\u021bile de trimitere idempotent\u0103 pe cheie sau logica pe partea Producer necesit\u0103 men\u021binerea consisten\u021bei datelor \u00eentre diferite parti\u021bii, atunci tranzac\u021biile te vor ajuta. \u00cen plus, prin intermediul unei tranzac\u021bii \u00een lan\u021b, este posibil s\u0103 sincronizezi condi\u021bionat scrierea \u00een Kafka, de exemplu, cu scrierea \u00een baza de date. Pentru a activa trimiterea tranzac\u021bional\u0103 pe Producer, acesta trebuie s\u0103 fie idempotent \u0219i s\u0103 define\u0219ti suplimentar <strong>transactional.id<\/strong>. Dac\u0103 pe clusterul t\u0103u Kafka este activat controlul accesului, va fi nevoie de permisiuni de scriere pentru scrierea tranzac\u021bional\u0103, la fel ca pentru scrierea idempotent\u0103, care pot fi furnizate printr-un model folosind valoarea stocat\u0103 \u00een transactional.id.<\/p>\n<p><\/p>\n<p>Formal, ca identificator al tranzac\u021biei, poate fi utilizat\u0103 orice urm\u0103, cum ar fi numele aplica\u021biei. Dar dac\u0103 rulezi mai multe instan\u021be ale acelea\u0219i aplica\u021bii cu acela\u0219i transactional.id, prima instan\u021b\u0103 lansat\u0103 va fi oprit\u0103 cu o eroare, deoarece Kafka o va considera un proces zombie. <\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.errors.ProducerFencedException: Producer a \u00eencercat s\u0103 execute o opera\u021biune cu o epoc\u0103 veche. Ori exist\u0103 un producer mai nou cu acela\u0219i transactionalId, ori tranzac\u021bia producer-ului a expirat de c\u0103tre broker.<\/code><\/pre>\n<p><\/p>\n<p>Pentru a rezolva aceast\u0103 problem\u0103, ad\u0103ug\u0103m la numele aplica\u021biei un sufix bazat pe numele gazdei, pe care \u00eel ob\u021binem din variabilele de mediu. <\/p>\n<p><\/p>\n<p>Producer-ul este configurat, dar tranzac\u021biile \u00een Kafka controleaz\u0103 doar domeniul de vizibilitate al mesajului. Indiferent de starea tranzac\u021biei, mesajul ajunge imediat \u00een topic, dar are atribute sistemice suplimentare.<\/p>\n<p><\/p>\n<p>Pentru ca aceste mesaje s\u0103 nu fie citite prea devreme de c\u0103tre Consumer, acesta trebuie s\u0103 stabileasc\u0103 parametrul <strong>isolation.level<\/strong> la valoarea read_committed. Un astfel de Consumer va putea citi mesajele netranzac\u021bionale ca \u00eenainte, iar pe cele tranzac\u021bionale doar dup\u0103 comitere.<br \/>\nDac\u0103 ai setat toate configur\u0103rile enumerate anterior, atunci ai configurat exactly once delivery. Felicit\u0103ri!<\/p>\n<p><\/p>\n<p>Dar mai exist\u0103 un detaliu. Transactional.id pe care l-am configurat mai sus este, de fapt, un prefix al tranzac\u021biei. La managerul de tranzac\u021bii, i se adaug\u0103 un num\u0103r secven\u021bial. Identificatorul ob\u021binut este eliberat la <strong>transactional.id.expiration.ms<\/strong>, care este configurat pe un cluster Kafka \u0219i are o valoare implicit\u0103 de \u201e7 zile\u201d. Dac\u0103 \u00een acest timp aplica\u021bia nu a primit nicio mesaj, atunci la urm\u0103toarea \u00eencercare de trimitere a unei tranzac\u021bii, ve\u021bi primi <strong>InvalidPidMappingException<\/strong>. Dup\u0103 aceasta, coordonatorul tranzac\u021biilor va atribui un nou num\u0103r secven\u021bial pentru urm\u0103toarea tranzac\u021bie. \u00cen acest caz, mesajul poate fi pierdut dac\u0103 InvalidPidMappingException nu este gestionat\u0103 corect. <\/p>\n<p><\/p>\n<h2 id=\"vmesto-itogov\">\u00cen loc de concluzii<\/h2>\n<p><\/p>\n<p>A\u0219a cum pute\u021bi observa, nu este suficient doar s\u0103 trimite\u021bi mesaje \u00een Kafka. Trebuie s\u0103 alege\u021bi o combina\u021bie de parametri \u0219i s\u0103 fi\u021bi preg\u0103ti\u021bi s\u0103 face\u021bi rapid modific\u0103ri. \u00cen acest articol, am \u00eencercat s\u0103 explic \u00een detaliu configurarea livr\u0103rii exactly once \u0219i am descris c\u00e2teva probleme legate de configurarea client.id \u0219i transactional.id cu care ne-am confruntat. Mai jos sunt prezentate pe scurt set\u0103rile pentru Producer \u0219i 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 pentru livrare ordonat\u0103)<\/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>Pentru a minimiza erorile \u00een aplica\u021biile viitoare, am creat un wrapper peste configura\u021bia spring, unde sunt deja setate valori pentru anumite din parametrii enumera\u021bi.<\/p>\n<p><\/p>\n<p>Iat\u0103 c\u00e2teva materiale pentru auto-studiu:<\/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\">Descrierea set\u0103rilor <\/a><\/noindex><\/li>\n<\/ul>\n<p>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Cum a devenit Kafka realitate | ProHoster","description":"Salut, Habr! Lucrez \u00een echipa Tinkoff.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-kafka-stala-bylyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/54431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=54431"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/54431\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=54431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=54431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=54431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}