{"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\/sl\/blog\/administrirovanie\/kak-kafka-stala-bylyu","title":{"rendered":"Kako je Kafka postala resni\u010dnost","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kako je Kafka postala resni\u010dnost\" src=\"\/wp-content\/uploads\/2019\/12\/e61bf54b10e4e44a5c680185b0c16655.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hello, Habr!<\/p>\n<p><\/p>\n<p>Delam v timu Tinkoff, ki se ukvarja z razvojem lastnega centra za obvestila. Ve\u010dinoma razvijam v Javi z uporabo Spring boota in re\u0161evam razli\u010dne tehni\u010dne te\u017eave, ki se pojavijo v projektu.<\/p>\n<p><\/p>\n<p>Ve\u010dina na\u0161ih mikroservisov asinkrono komunicira drug z drugim preko sporo\u010dilnega posrednika. Prej smo uporabljali IBM MQ, ki ni ve\u010d zmo\u017een obvladovati bremena, a je hkrati zagotavljal visoke stopnje dostave.<\/p>\n<p><\/p>\n<p>Kot zamenjavo so nam predlagali Apache Kafka, ki ponuja veliko potenciala za skaliranje, a zahteva prakti\u010dno individualen pristop k konfiguraciji za razli\u010dne scenarije. Poleg tega mehanizem 'at least once delivery', ki deluje v Kafki privzeto, ne omogo\u010da vzdr\u017eevanja potrebne ravni konsistence kar tako. V nadaljevanju bom delil na\u0161e izku\u0161nje s konfiguracijo Kafke, \u0161e posebej kako nastaviti in \u017eiveti z 'exactly once delivery'.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"garantirovannaya-dostavka-i-ne-tolko\">Zagotovljena dostava in \u0161e ve\u010d<\/h2>\n<p><\/p>\n<p>Parametri, o katerih bomo govorili naprej, bodo pomagali prepre\u010diti vrsto te\u017eav s privzetimi nastavitvami povezav. A najprej bi rad osvetlil en parameter, ki bo olaj\u0161al morebitno odpravljanje napak.<\/p>\n<p><\/p>\n<p>Pri tem bo v pomo\u010d <strong>client.id<\/strong> za Producer in Consumer. Na prvi pogled je mo\u017eno uporabiti ime aplikacije kot vrednost, kar bo v ve\u010dini primerov delovalo. Vendar situacija, ko v aplikaciji uporabljate ve\u010d Consumer-jev in jim dodelite enako client.id, vodi do naslednjega opozorila:<\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.utils.AppInfoParser \u2014 Napaka pri registraciji AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0<\/code><\/pre>\n<p><\/p>\n<p>\u010ce \u017eelite uporabiti JMX v aplikaciji s Kafko, je to lahko te\u017eava. Za to situacijo je najbolje uporabiti kombinacijo imena aplikacije in, na primer, imena topic-a kot vrednost za client.id. Rezultat na\u0161e konfiguracije lahko vidite v izhodu ukaza <strong>kafka-consumer-groups<\/strong> iz orodij podjetja Confluent:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kako je Kafka postala resni\u010dnost\" src=\"\/wp-content\/uploads\/2019\/12\/f807a93f36f262522a613161a549eb91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zdaj razmislimo o scenariju zagotavljene dostave sporo\u010dila. Kafka Producer ima parameter <strong>acks<\/strong>, ki omogo\u010da nastavitev, po katerem \u0161tevilu potrditev mora vodja gru\u010de \u0161teti sporo\u010dilo za uspe\u0161no zapisano. Ta parameter lahko sprejme naslednje vrednosti:<\/p>\n<p><\/p>\n<ul>\n<li>0 \u2014 potrditev ne bo \u0161tela.<\/li>\n<li>1 \u2014 privzeta nastavitev, zahtevana je potrditev le s strani 1 replike.<\/li>\n<li>\u22121 \u2014 potrebna so potrdila od vseh sinhroniziranih replik (nastavitev grozda <strong>min.insync.replicas<\/strong>).<\/li>\n<\/ul>\n<p><\/p>\n<p>Iz navedenih vrednosti je razvidno, da acks enako \u22121 zagotavlja najmo\u010dnej\u0161e jamstvo, da sporo\u010dilo ne bo izgubljeno. <\/p>\n<p><\/p>\n<p>Kot vemo, so distribuirani sistemi nezanesljivi. Da bi se za\u0161\u010ditili pred za\u010dasnimi napakami, Kafka Producer ponuja parameter <strong>retries<\/strong>, ki omogo\u010da dolo\u010ditev \u0161tevila poskusov ponovnega po\u0161iljanja v okviru <strong>delivery.timeout.ms<\/strong>. Ker ima parameter retries privzeto vrednost Integer.MAX_VALUE (2147483647), lahko \u0161tevilo ponovnih po\u0161iljanj sporo\u010dila reguliramo tako, da spreminjamo le delivery.timeout.ms.<\/p>\n<p><\/p>\n<h2 id=\"dvizhemsya-k-exactly-once-delivery\">Prehajamo na exactly once delivery<\/h2>\n<p><\/p>\n<p>Nastavitve omogo\u010dajo na\u0161emu Producerju dostavo sporo\u010dil z visokim jamstvom. Zdaj pa se pogovorimo o tem, kako zagotoviti zapis samo ene kopije sporo\u010dila v Kafka-topik? V najpreprostej\u0161em primeru je za to potrebno, da na Producerju nastavite parameter <strong>enable.idempotence<\/strong> na vrednost true. Idempotentnost zagotavlja zapis samo enega sporo\u010dila v dolo\u010deno particijo enega topika. Predhodni pogoj za vklju\u010ditev idempotentnosti so vrednosti <strong>acks = all, retry &gt; 0, max.in.flight.requests.per.connection \u2264 5<\/strong>. \u010ce teh parametrov ne nastavi razvijalec, se avtomatsko nastavi zgoraj navedene vrednosti.<\/p>\n<p><\/p>\n<p>Ko je idempotentnost nastavljena, je treba zagotoviti, da enaka sporo\u010dila vedno pridejo v iste particije. To lahko dose\u017eemo z nastavitvijo klju\u010da in parametra partitioner.class na Producerju. Za\u010dnimo s klju\u010dem. Pri vsakem po\u0161iljanju mora biti enak. To lahko enostavno dose\u017eemo z uporabo katerega koli poslovnega identifikatorja iz izvirnega sporo\u010dila. Parameter partitioner.class ima privzeto vrednost \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 tej strategiji particioniranja po privzeti nastavitvi delujemo tako:<\/p>\n<p><\/p>\n<ul>\n<li>\u010ce je particija izrecno navedena pri po\u0161iljanju sporo\u010dila, jo uporabimo.<\/li>\n<li>\u010ce particija ni navedena, ampak je naveden klju\u010d \u2014 izberemo particijo po hashu klju\u010da.<\/li>\n<li>\u010ce particija in klju\u010d nista navedena \u2014 izberemo particije po vrsti (round-robin).<\/li>\n<\/ul>\n<p><\/p>\n<p>Poleg tega uporaba klju\u010da in idempotentnega po\u0161iljanja s parametrom <strong>max.in.flight.requests.per.connection = 1<\/strong> vam daje ure\u0111en pristup porukama na Consumeru. Tako\u0111e, va\u017eno je napomenuti da, ako je na va\u0161em klasteru pode\u0161ena kontrola pristupa, bi\u0107e vam potrebna prava za idempotentno pisanje u temu.<\/p>\n<p><\/p>\n<p>Ako vam nedostaju mogu\u0107nosti idempotentnog slanja po klju\u010dnoj re\u010di ili logika na strani Producenta zahteva o\u010duvanje doslednosti podataka izme\u0111u razli\u010ditih particija, transakcije \u0107e vam pomo\u0107i. Pored toga, uz pomo\u0107u lchain transaction mo\u017ee se uslovno sinhronizovati zapis u Kafka-u, na primer, sa zapisom u bazi podataka. Da biste uklju\u010dili transakcijsko slanje na Producentu, potrebno je da on bude idempotentan i dodatno da defini\u0161e <strong>transactional.id<\/strong>. Ako je na va\u0161em Kafka klasteru postavljena kontrola pristupa, za transakcijsko pisanje, kao i za idempotentno pisanje, bi\u0107e vam potrebna prava za pisanje koja se mogu dodeliti prema maski koriste\u0107i vrednost koja se \u010duva u transactional.id.<\/p>\n<p><\/p>\n<p>Formalno, kao identifikator transakcije mo\u017ee se koristiti bilo koji string, na primer ime aplikacije. Ali ako pokre\u0107ete vi\u0161e instanci jedne aplikacije sa istim transactional.id, prva pokrenuta instanca \u0107e biti zaustavljena sa gre\u0161kom, jer \u0107e Kafka smatrati da je to zombi proces. <\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.errors.ProducerFencedException: Producent je poku\u0161ao operaciju sa starom epohom. Ili postoji noviji producent sa istim transactionalId, ili je transakcija proizvo\u0111a\u010da istekla od strane brokera.<\/code><\/pre>\n<p><\/p>\n<p>Da bismo re\u0161ili ovaj problem, dodajemo sufiks u ime aplikacije koji se sastoji od imena hosta, dobijenog iz promenljivih okru\u017eenja. <\/p>\n<p><\/p>\n<p>Producent je pode\u0161en, ali transakcije u Kafki upravljaju samo obuhvatom vidljivosti poruke. Bez obzira na status transakcije, poruka odmah ulazi u temu, ali sa dodatnim sistemskim atributima.<\/p>\n<p><\/p>\n<p>Da takve poruke ne bi bile o\u010ditane od strane Consumer-a pre vremena, potrebno je postaviti parametar <strong>isolation.level<\/strong> na vrednost read_committed. Takav Consumer mo\u0107i \u0107e da \u010dita netransakcionisane poruke kao i ranije, a transakcionisane \u2013 samo nakon potvrde.<br \/>\nAko ste postavili sve ranije navedene postavke, onda ste konfigurisali exactly once delivery. \u010cestitam!<\/p>\n<p><\/p>\n<p>Ali postoji jo\u0161 jedan aspekt. Transactional.id, koji smo ranije konfigurisali, zapravo je prefiks transakcije. Na menad\u017eeru transakcija se dodaje redni broj. Dobijeni identifikator se dodeljuje na <strong>transactional.id.expiration.ms<\/strong>, ki se konfigurira na Kafka grozdu in ima privzeto vrednost \u201e7 dni\u201c. \u010ce aplikacija v tem \u010dasu ne prejme nobenih sporo\u010dil, boste ob naslednjem poskusu transakcijskega po\u0161iljanja prejeli <strong>InvalidPidMappingException<\/strong>. Po tem bo koordinator transakcij dodelil novo zaporedno \u0161tevilko za naslednjo transakcijo. Pri tem lahko pride do izgube sporo\u010dila, \u010de InvalidPidMappingException ne bo pravilno obvladan. <\/p>\n<p><\/p>\n<h2 id=\"vmesto-itogov\">Namesto povzetkov<\/h2>\n<p><\/p>\n<p>Kot lahko opazite, ni dovolj samo po\u0161iljati sporo\u010dila v Kafka. Potrebno je izbrati kombinacijo parametrov in biti pripravljen na hitre spremembe. V tem \u010dlanku sem posku\u0161al podrobno prikazati nastavitev 'exactly once delivery' in opisal nekaj te\u017eav konfiguracij client.id in transactional.id, s katerimi smo se sre\u010dali. Spodaj so v kratki obliki navedene nastavitve Producer in 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 za urejeno po\u0161iljanje)<\/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>Da bi zmanj\u0161ali napake v prihodnjih aplikacijah, smo naredili svojo oviro nad spring konfiguracijo, kjer so \u017ee nastavljene vrednosti za nekatere od na\u0161tetih parametrov.<\/p>\n<p><\/p>\n<p>Tukaj je nekaj gradiv za samostojno \u0161tudij:<\/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\">Opis nastavitev <\/a><\/noindex><\/li>\n<\/ul>\n<p>Izvor: <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.4 - 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\/sl\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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\/sl\/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\udd47Kako je Kafka postala resni\u010dnost | ProHoster","description":"Pozdravljeni, Habr! Delam v ekipi Tinkoff.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/kak-kafka-stala-bylyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/54431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=54431"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/54431\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=54431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=54431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=54431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}