{"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\/et\/blog\/administrirovanie\/kak-kafka-stala-bylyu","title":{"rendered":"Kuidas Kafka sai reaalsuseks","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kuidas Kafka sai reaalsuseks\" src=\"\/wp-content\/uploads\/2019\/12\/e61bf54b10e4e44a5c680185b0c16655.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tere, Habr!<\/p>\n<p><\/p>\n<p>T\u00f6\u00f6tan Tinkoffi meeskonnas, mis tegeleb enda teavituskeskuse arendamisega. Enamasti arendan Java-s, kasutades Spring Boot'i, ja lahendan erinevaid tehnilisi probleeme, mis projektis ilmnevad.<\/p>\n<p><\/p>\n<p>Enamik meie mikroteenustest suhtleb omavahel as\u00fcnkroonselt s\u00f5numite vahendaja kaudu. Varem kasutasime brokerina IBM MQ-d, mis ei suutnud koormuse t\u00f5ttu enam hakkama saada, kuid pakkus siiski k\u00f5rgeid kohaletoimetamise garantiisid.<\/p>\n<p><\/p>\n<p>Asenduseks pakuti meile Apache Kafka, mis omab suurt skaleeritavuse potentsiaali, kuid n\u00f5uab paraku praktiliselt individuaalset l\u00e4henemist erinevate stsenaariumide seadistamisel. Lisaks ei v\u00f5imaldanud vaikimisi t\u00f6\u00f6tav at least once delivery mehhanism Kafkas s\u00e4ilitada vajalikku j\u00e4rjepidevuse taset. Edasi jagan meie kogemust Kafka seadistamisel, milles r\u00e4\u00e4gin, kuidas seadistada ja elada exactly once delivery'ga.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"garantirovannaya-dostavka-i-ne-tolko\">Kohustatud kohaletoimetamine ja mitte ainult<\/h2>\n<p><\/p>\n<p>Seadistused, millest r\u00e4\u00e4gime, aitavad v\u00e4ltida rida probleeme vaikeseadistustega. Kuid enne tahaksin p\u00f6\u00f6rata t\u00e4helepanu \u00fchele seadistusele, mis lihtsustab v\u00f5imalikku veaotsingut.<\/p>\n<p><\/p>\n<p>Sellel aitab <strong>client.id<\/strong> Produceri ja Consumeri jaoks. Esmapilgul saab v\u00e4\u00e4rtusena kasutada rakenduse nime ja enamikul juhtudel see ka toimib. Siiski, olukord, kus rakenduses kasutatakse mitu Consumer'i ja seadistate neile \u00fche ja sama client.id, toob kaasa j\u00e4rgmise hoiatuse:<\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.utils.AppInfoParser \u2014 Veateade AppInfo mbean'i registreerimisel javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0<\/code><\/pre>\n<p><\/p>\n<p>Kui soovite kasutada JMX-i rakenduses Kafkaga, v\u00f5ib see olla probleem. Sellise juhtumi jaoks on k\u00f5ige parem kasutada client.id v\u00e4\u00e4rtusena rakenduse nime ja n\u00e4iteks teema nime kombinatsiooni. Meie seadistuse tulemust saab vaadata k\u00e4su <strong>kafka-consumer-groups<\/strong> Confluenti utiliidilt:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kuidas Kafka sai reaalsuseks\" src=\"\/wp-content\/uploads\/2019\/12\/f807a93f36f262522a613161a549eb91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00fc\u00fcd vaatame \u00fcle s\u00f5numi garantii kohaletoimetamise stsenaariumi. Kafkal on Produceril parameeter <strong>acks<\/strong>, mille abil saab seadistada, p\u00e4rast kui palju tunnustusi peab klastriliider s\u00f5numit edukaks kirjutamiseks lugema. Sellel parameetril v\u00f5ivad olla j\u00e4rgmised v\u00e4\u00e4rtused:<\/p>\n<p><\/p>\n<ul>\n<li>0 \u2014 tunnustusi ei arvestata.<\/li>\n<li>1 \u2014 vaikimisi parameeter, n\u00f5uab tunnustust ainult 1 repliigilt.<\/li>\n<li>\u22121 \u2014 vajalik tunnustus k\u00f5ikidelt s\u00fcnkroniseeritud repliikidelt (klastriseade <strong>min.insync.replicas<\/strong>).<\/li>\n<\/ul>\n<p><\/p>\n<p>Loetletud v\u00e4\u00e4rtustest on n\u00e4ha, et acks, mille v\u00e4\u00e4rtus on \u22121, tagab k\u00f5ige tugevama kinnituse, et s\u00f5num ei kao. <\/p>\n<p><\/p>\n<p>Kuna me k\u00f5ik teame, on jaotatud s\u00fcsteemid ebausaldusv\u00e4\u00e4rsed. Ajutiste t\u00f5rgete kaitsmiseks pakub Kafka Producer parameetrit <strong>retries<\/strong>, mis v\u00f5imaldab m\u00e4\u00e4rata saatmise katsete arvu jooksul <strong>delivery.timeout.ms<\/strong>. Kuna parameetri retries vaikimisi v\u00e4\u00e4rtus on Integer.MAX_VALUE (2147483647), saab s\u00f5numi korduskatsete arvu reguleerida, muutes ainult delivery.timeout.ms.<\/p>\n<p><\/p>\n<h2 id=\"dvizhemsya-k-exactly-once-delivery\">Liigume edasi exactly once delivery<\/h2>\n<p><\/p>\n<p>Loetletud seaded v\u00f5imaldavad meie Producer'itel s\u00f5numeid k\u00f5rge garantii j\u00e4rgi edastada. R\u00e4\u00e4gime n\u00fc\u00fcd, kuidas tagada, et ainult \u00fcks koopia s\u00f5numist salvestatakse Kafka teemas? K\u00f5ige lihtsamal juhul peab Producer seadma parameetri <strong>enable.idempotence<\/strong> t\u00f5eks. Idempotentsus tagab, et konstateeritakse ainult \u00fcks s\u00f5num kindlasse partitsiooni \u00fches teemas. Idempotentsuse aktiveerimise eelduseks on v\u00e4\u00e4rtused <strong>acks = all, retry &gt; 0, max.in.flight.requests.per.connection \u2264 5<\/strong>. Kui need parameetrid pole arendaja poolt m\u00e4\u00e4ratud, m\u00e4\u00e4ratakse automaatselt eespool loetletud v\u00e4\u00e4rtused.<\/p>\n<p><\/p>\n<p>Kui idempotentsus on seadistatud, tuleb tagada, et samad s\u00f5numid j\u00f5uavad iga kord samadesse partitsioonidesse. Seda saab teha tootja v\u00f5tme ja parameetri partitioner.class seadistamisega. Alustame v\u00f5tmega. Iga saatmise korral peab see olema sama. Seda on lihtne saavutada, kasutades m\u00f5nda \u00e4ridentifikaatorit algsest s\u00f5numist. Parameetri partitioner.class vaikimisi v\u00e4\u00e4rtus on <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>. Selle vaikimisi partitsioneerimise strateegia kohaselt toimime j\u00e4rgmiselt:<\/p>\n<p><\/p>\n<ul>\n<li>Kui partitsioon on selges\u00f5naliselt m\u00e4\u00e4ratud s\u00f5numi saatmise ajal, siis kasutame seda.<\/li>\n<li>Kui partitsioon ei ole m\u00e4\u00e4ratud, kuid v\u00f5ti on m\u00e4\u00e4ratud \u2014 valime partitsiooni v\u00f5tme hash'i p\u00f5hjal.<\/li>\n<li>Kui partitsioon ja v\u00f5ti ei ole m\u00e4\u00e4ratud \u2014 valime partitsioonide j\u00e4rgnevuse alusel (round-robin).<\/li>\n<\/ul>\n<p><\/p>\n<p>Lisaks sellele p\u00f5hjustab v\u00f5ti ja idempotentne saatmine parameetriga <strong>max.in.flight.requests.per.connection = 1<\/strong> annab teie jaoks korrastatud s\u00f5numite t\u00f6\u00f6tlemise Consumeris. Oluline on meeles pidada, et kui teie klastris on seadistatud juurdep\u00e4\u00e4su haldamine, vajate \u00f5igusi idempotentseks kirjutamiseks teemasse.<\/p>\n<p><\/p>\n<p>Kui teil on puudus idempotentsest saatmisest v\u00f5tme j\u00e4rgi v\u00f5i Produceri poolel n\u00f5uab loogika erinevate partitsioonide vahel andmete j\u00e4rjepidevuse s\u00e4ilitamist, tulevad appi tehingud. Lisaks saab ketittehingute abil tinglikult s\u00fcnkroonida kirjutamist Kafka's, n\u00e4iteks andmebaasi kirjaga. Tehingulise saatmise lubamiseks peab Producer omama idempotentsust ja lisaks m\u00e4\u00e4rama <strong>transactional.id<\/strong>. Kui teie Kafka klastris on seadistatud juurdep\u00e4\u00e4su haldamine, vajate tehinguliste kirjutiste jaoks, nagu ka idempotentsete jaoks, kirjutamis\u00f5igusi, mis v\u00f5ivad olla antud maskeeri kaudu, kasutades v\u00e4\u00e4rtust, mis on salvestatud transactional.id-sse.<\/p>\n<p><\/p>\n<p>Formaalselt v\u00f5ib tehingu identifikaatorina kasutada mistahes stringi, n\u00e4iteks rakenduse nime. Kuid kui k\u00e4itate mitut sarnase nimega rakenduse instantsi sama transactional.id-ga, peatub esmak\u00e4ivitunud instants t\u00f5rge t\u00f5ttu, kuna Kafka peab seda zombiprotsessiks. <\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.errors.ProducerFencedException: Producer \u00fcritas toimingut vanas ajas. V\u00f5i on olemas uuem tootja sama transactionalId-ga v\u00f5i tootja tehingu on brokeri poolt aegunud.<\/code><\/pre>\n<p><\/p>\n<p>Selle probleemi lahendamiseks lisame rakenduse nimele sufiksi, milleks on hostinimi, mille saame keskkonnamuutujatest. <\/p>\n<p><\/p>\n<p>Producer on seadistatud, kuid tehingud Kafka's haldavad vaid s\u00f5numi n\u00e4htavuse ulatus. Olenemata tehingu staatust on s\u00f5num vahetult teema juurde viidud, kuid sellel on t\u00e4iendavad s\u00fcsteemi atribuudid.<\/p>\n<p><\/p>\n<p>Et selliseid s\u00f5numeid ei loetaks Consumer'i poolt liiga vara, tuleb tal seada parameeter <strong>isolation.level<\/strong> v\u00e4\u00e4rtusele read_committed. Selline Consumer suudab lugeda mitte-tehingulisi s\u00f5numeid nagu varem, kuid tehingulisi ainult p\u00e4rast kinnitamist.<br \/>\nKui olete seadistanud k\u00f5ik eelnevalt loetletud seaded, olete seadistanud exactly once delivery. Palju \u00f5nne!<\/p>\n<p><\/p>\n<p>Kuid on veel \u00fcks n\u00fcanss. Transactional.id, mida me \u00fclal seadistasime, on tegelikult tehingu eelosa. Tehingu halduri juurde lisatakse sellele j\u00e4rjestusnumber. Saadud identifikaator v\u00e4ljastatakse <strong>transactional.id.expiration.ms<\/strong>, mis on konfigureeritud Kafka klastris ja mille vaikimisi v\u00e4\u00e4rtus on \u201e7 p\u00e4eva\u201c. Kui selle aja jooksul rakendus ei saa mingeid s\u00f5numeid, siis j\u00e4rgmise tehingu saatmise katse korral saate <strong>InvalidPidMappingException<\/strong>. P\u00e4rast seda annab tehingute koordineerija j\u00e4rgmise tehingu jaoks uue j\u00e4rjestusnumbri. Samuti v\u00f5ib s\u00f5num kaduda, kui InvalidPidMappingException ei k\u00e4sitleta \u00f5igesti. <\/p>\n<p><\/p>\n<h2 id=\"vmesto-itogov\">Kokkuv\u00f5tete asemel<\/h2>\n<p><\/p>\n<p>Nagu n\u00e4ha, ei piisa lihtsalt s\u00f5numite saatmisest Kafka-sse. Tuleb valida parameetrite kombinatsioon ja olla valmis kiireteks muutusteks. Selles artiklis p\u00fc\u00fcdsin detailides n\u00e4idata exactly once delivery seadistust ja kirjeldasin mitmeid client.id ja transactional.id konfiguratsiooni probleeme, millega me kokku puutusime. Allpool on l\u00fchidalt toodud tootja ja tarbija seadistused.<\/p>\n<p><\/p>\n<p>Tootja:<\/p>\n<p><\/p>\n<ol>\n<li>acks = k\u00f5ik<\/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 j\u00e4rjekorras saatmiseks)<\/li>\n<li>transactional.id = ${application-name}-${hostname}<\/li>\n<\/ol>\n<p><\/p>\n<p>Tarbija:<\/p>\n<p><\/p>\n<ol>\n<li>isolation.level = read_committed<\/li>\n<\/ol>\n<p><\/p>\n<p>Tulevaste rakenduste vigade minimeerimiseks l\u00f5ime oma m\u00e4hise spring-konfiguratsiooni \u00fcmber, kus on juba seatud v\u00e4\u00e4rtused m\u00f5nele \u00fclalnimetatud parameetrile.<\/p>\n<p><\/p>\n<p>Ja siin on paar materjali iseseisvaks \u00f5ppimiseks:<\/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\">Seadistuste kirjeldus <\/a><\/noindex><\/li>\n<\/ul>\n<p>Allikas: <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.1.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\/et\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47Kuidas Kafka sai t\u00f5elisuseks | ProHoster","description":"Tere, Habr! T\u00f6\u00f6tan Tinkoffi meeskonnas.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-kafka-stala-bylyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/54431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=54431"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/54431\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=54431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=54431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=54431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}