{"id":37812,"date":"2019-10-31T22:19:55","date_gmt":"2019-10-31T19:19:55","guid":{"rendered":"https:\/\/prohoster.info\/blog\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov\/"},"modified":"2019-10-31T22:19:55","modified_gmt":"2019-10-31T19:19:55","slug":"megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","title":{"rendered":"Mega-pakke: hvordan Factorio udviklere l\u00f8ste problemet med multiplayer for 200 spillere","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Mega-pakke: hvordan Factorio udviklere l\u00f8ste problemet med multiplayer for 200 spillere\" src=\"\/wp-content\/uploads\/2019\/09\/135544365299791de479555734645ef2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI maj var jeg med som spiller i <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/d_DlvkTK9hU\">MMO-arrangementet KatherineOfSky<\/a><\/noindex>. Jeg bem\u00e6rkede, at n\u00e5r antallet af spillere n\u00e5ede et bestemt antal, s\u00e5 \"forlod\" en del af dem efter et par minutter. Heldigvis for dig (men ikke for mig) var jeg en af de spillere, der disconnectede <b>hver gang<\/b>, selv med en god forbindelse. Jeg opfattede dette som en personlig udfordring og begyndte at s\u00f8ge efter \u00e5rsagerne til problemet. Efter tre ugers fejlfinding, testning og reparationer var fejlen endelig l\u00f8st, men denne rejse var ikke s\u00e5 let som man skulle tro.<\/p>\n<p>Problemer i multiplayer-spil er meget sv\u00e6re at spore. De opst\u00e5r ofte under meget specifikke forhold af netv\u00e6rksparametre og i meget bestemte spilstater (i dette tilf\u00e6lde - n\u00e5r der er mere end 200 spillere). Og selv n\u00e5r man form\u00e5r at reproducere problemet, er det umuligt at debugge korrekt, fordi inds\u00e6ttelse af kontrolpunkter stopper spillet, forvirrer timere og normalt f\u00f8rer til, at forbindelsen afsluttes p\u00e5 grund af timeout. Men takket v\u00e6re vedholdenhed og et fantastisk v\u00e6rkt\u00f8j kaldet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jagt\/clumsy\">clumsy<\/a><\/noindex> , lykkedes det mig at finde ud af, hvad der foregik.<\/p>\n<p>Kort sagt: p\u00e5 grund af en fejl og en ufuldst\u00e6ndig implementering af simuleringen af forsinkelsesstatus, befandt klienten nogle gange sig i en situation, hvor den for \u00e9n cyklus skulle sende et netv\u00e6rkspakke best\u00e5ende af spillerens valg af omkring 400 spil-entiteter (vi kalder det \"megapakken\"). Efter dette skal serveren ikke kun korrekt modtage alle disse inputhandlinger, men ogs\u00e5 sende dem til alle andre klienter. Hvis du har 200 klienter, bliver det hurtigt et problem. Kanalen til serveren bliver hurtigt overfyldt, hvilket f\u00f8rer til pakke-tab og et kaskade af genanmodede pakker. Forsinkelse af inputhandlinger f\u00f8rer s\u00e5 til, at endnu flere klienter begynder at sende megapakker, og deres lavine bliver endnu st\u00e6rkere. De heldige klienter form\u00e5r at komme sig, alle andre \"forlader\".<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Mega-pakke: hvordan Factorio udviklere l\u00f8ste problemet med multiplayer for 200 spillere\" src=\"\/wp-content\/uploads\/2019\/09\/ff1a60d55eb6f5a4dc7be4b826d747f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nProblemet var ret grundl\u00e6ggende, og jeg brugte 2 uger p\u00e5 at l\u00f8se det. Det er ret teknisk, s\u00e5 nedenfor vil jeg forklare nogle saftige tekniske detaljer. Men f\u00f8rst skal du vide, at siden version 0.17.54, der blev udgivet den 4. juni, er multiplayer blevet mere stabil under tidsproblemer med forbindelsen, og latensskjultningen er blevet meget mindre fejlbeh\u00e6ftet (mindst forsinkelse og teleportering). Desuden \u00e6ndrede jeg m\u00e5den at skjule latensen i kamp, og jeg h\u00e5ber, at det vil g\u00f8re dem lidt mere glatte.<\/p>\n<h3>Multiplayer Megapakke \u2014 tekniske detaljer<\/h3>\n<p>\nFor at forklare det simpelt fungerer multiplayer i spillet s\u00e5dan her: alle klienter simulerer spillets tilstand ved kun at modtage og sende spillerens input (kaldet 'input handlinger', <i>Input Actions<\/i>). Hovedopgaven for serveren er at transmittere <i>Input Actions<\/i> og kontrollere, at alle klienter udf\u00f8rer de samme handlinger i en given runde. Du kan l\u00e6se mere om dette i indl\u00e6gget <noindex><a rel=\"nofollow\" href=\"https:\/\/www.factorio.com\/blog\/post\/fff-149\">FFF-149<\/a><\/noindex>.<\/p>\n<p>Da serveren skal tr\u00e6ffe beslutninger om, hvilke handlinger der skal udf\u00f8res, f\u00f8lger spillerens handlinger omtrent denne rute: spillerens handling -&gt; spilklient -&gt; netv\u00e6rk -&gt; server -&gt; netv\u00e6rk -&gt; spilklient. Dette betyder, at hver spillerhandling kun udf\u00f8res efter, at den har gjort turen frem og tilbage gennem netv\u00e6rket. P\u00e5 grund af dette ville spillet f\u00f8les frygteligt langsomt, s\u00e5 n\u00e6sten straks efter introduktionen af multiplayer i spillet blev der indf\u00f8rt en mekanisme til skjuling af latenser. Latenserens skjulning simulerer spillerens input uden at tage h\u00f8jde for handlingerne fra andre spillere og serverens beslutninger.<\/p>\n<p><img decoding=\"async\" alt=\"Mega-pakke: hvordan Factorio udviklere l\u00f8ste problemet med multiplayer for 200 spillere\" src=\"\/wp-content\/uploads\/2019\/09\/0b66a3b07d6aa2ab1d2329d782c78615.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI Factorio er der en spiltilstand <i>Game State<\/i> \u2014 det er den fulde tilstand af kortet, spilleren, entiteterne og alt andet. Det simuleres deterministisk p\u00e5 alle klienter baseret p\u00e5 de modtagne handlinger fra serveren. Spiltilstanden er hellig, og hvis den nogensinde begynder at afvige fra serveren eller en hvilken som helst anden klient, opst\u00e5r der en desynkronisering.<\/p>\n<p>Udover <i>Game State<\/i> Vi har en latensstatus <i>Latency State<\/i>. Den indeholder en lille delm\u00e6ngde af den prim\u00e6re tilstand. <i>Latency State<\/i> Den er ikke hellig og repr\u00e6senterer blot et billede af, hvordan spiltilstanden vil se ud i fremtiden baseret p\u00e5 input givet af spilleren. <i>Input Actions<\/i>.<\/p>\n<p>For dette form\u00e5l gemmer vi en kopi af de oprettede <i>Input Actions<\/i> i latenqueuen.<\/p>\n<p><img decoding=\"async\" alt=\"Mega-pakke: hvordan Factorio udviklere l\u00f8ste problemet med multiplayer for 200 spillere\" src=\"\/wp-content\/uploads\/2019\/09\/31e43263d1d2bfc79700730978fcd02a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDet vil sige, at billedet p\u00e5 klientens side ser omtrent s\u00e5dan ud i slutningen af processen:<\/p>\n<ol>\n<li>Vi anvender <i>Input Actions<\/i> alle spillerne til <i>Game State<\/i> s\u00e5dan som disse inputhandlinger blev modtaget fra serveren.<\/li>\n<li>Vi fjerner alle <i>Input Actions<\/i>, som if\u00f8lge serveren allerede er blevet anvendt p\u00e5 <i>Game State<\/i>.<\/li>\n<li>Fjerne <i>Latency State<\/i> og nulstiller det, s\u00e5 det ser n\u00f8jagtigt ud som <i>Game State<\/i>.<\/li>\n<li>Vi anvender alle handlinger fra forsinkelsesqueue'en til <i>Latency State<\/i>.<\/li>\n<li>Baseret p\u00e5 dataene <i>Game State<\/i> og <i>Latency State<\/i> renderer vi spillet for spilleren.<\/li>\n<\/ol>\n<p>\nAlt dette gentages i hver takt.<\/p>\n<p>For komplekst? Slap ikke af, det er ikke alt. For at kompensere for den ustabilitet, der kan v\u00e6re ved internetforbindelser, har vi udviklet to mekanismer:<\/p>\n<ul>\n<li>Udsatte takter: n\u00e5r serveren beslutter, at <i>Input Actions<\/i> vil finde sted i spillets takt, s\u00e5 hvis den ikke har modtaget <i>Input Actions<\/i> fra en spiller (for eksempel p\u00e5 grund af \u00f8get forsinkelse), vil den ikke vente, men informere denne klient om \"jeg har ikke taget dine <i>Input Actions<\/i>, jeg vil fors\u00f8ge at tilf\u00f8je dem i n\u00e6ste takt.\" Dette er gjort for at sikre, at kortopdateringen ikke forsinkes for alle andre p\u00e5 grund af forbindelsesproblemer (eller computerproblemer) for en enkelt spiller. Det er v\u00e6rd at bem\u00e6rke, at <i>Input Actions<\/i> ikke ignoreres, men blot uds\u00e6ttes.<\/li>\n<li>Den samlede tur-retur-forsinkelse: serveren fors\u00f8ger at forudsige, hvad datatransmissionens tur-retur-forsinkelse er mellem klienten og serveren for hver klient. Hver 5. sekund diskuterer den n\u00f8dvendigvis med klienten en ny forsinkelse (afh\u00e6ngig af, hvordan forbindelsen har opf\u00f8rt sig tidligere), og justerer tur-retur-forsinkelsen derefter.<\/li>\n<\/ul>\n<p>\nDisse mekanismer er i sig selv ret enkle, men n\u00e5r de anvendes sammen (hvilket ofte sker ved forbindelsesproblemer), bliver kode-logikken sv\u00e6r at h\u00e5ndtere og fyldt med en masse kanttilf\u00e6lde. Derudover skal serveren og forsinkelsesqueue'en, n\u00e5r disse mekanismer tr\u00e6der i kraft, korrekt implementere den s\u00e6rlige <i>Input Action<\/i> med navnet <i>StopMovementInTheNextTick<\/i>. Dermed vil karakteren ikke l\u00f8be af sig selv ved forbindelsesproblemer (for eksempel ind under et tog).<\/p>\n<p>Nu skal jeg forklare, hvordan valg af entiteter fungerer. En af de overf\u00f8rte typer <i>Input Action<\/i> \u2014 dette er \u00e6ndringen af tilstand for valg af entitet. Den informerer alle om, hvilken entitet spilleren har peget musen p\u00e5. Som man kan forst\u00e5, er dette en af de mest hyppige inputhandlinger, der sendes af klienterne, s\u00e5 for at spare b\u00e5ndbredde har vi optimeret det, s\u00e5 det fylder s\u00e5 lidt som muligt. Dette er implementeret ved, at ved valg af hver entitet, gemmes der ikke absolutte, h\u00f8jpr\u00e6cise kortkoordinater, men der gemmes en lavpr\u00e6cisions relativ forskydning fra den tidligere valg. Dette fungerer godt, fordi markering med musen typisk sker meget t\u00e6t p\u00e5 det tidligere valg. Derfor er der to vigtige krav: <i>Input Actions<\/i> de m\u00e5 aldrig springes over, og de skal udf\u00f8res i den rigtige r\u00e6kkef\u00f8lge. Disse krav opfyldes for <i>Game State<\/i>. Men da opgaven <i>Latency state<\/i> handler om at \"se godt nok ud\" for spilleren, opfyldes de ikke i tilstande med forsinkelse. <i>Latency State<\/i> tager ikke h\u00f8jde for <noindex><a rel=\"nofollow\" href=\"https:\/\/cdn.factorio.com\/assets\/img\/blog\/fff-302-megapacket-commit.jpg\">mange gr\u00e6nsetilf\u00e6lde<\/a><\/noindex>, der er relateret til at springe takter over og \u00e6ndringer i forsinkelse ved tovejskommunikation.<\/p>\n<p>Du kan allerede g\u00e6tte, hvor dette f\u00f8rer hen. Til sidst begynder vi at se \u00e5rsagerne til megapak-problemet. Problemet ligger i, at beslutningen om, hvorvidt handlingen for \u00e6ndring af valg skal sendes, logikken for valg af entiteter er afh\u00e6ngig af <i>Latency State<\/i>, og denne tilstand indeholder ikke altid korrekt information. Derfor genereres megapakken p\u00e5 f\u00f8lgende m\u00e5de:<\/p>\n<ol>\n<li>Spilleren har problemer med forbindelsen.<\/li>\n<li>Der tr\u00e6der mekanismer for at springe takter over og regulere forsinkelse ved tovejskommunikation ind.<\/li>\n<li>K\u00f8en af tilstande med forsinkelse tager ikke h\u00f8jde for disse mekanismer. Dette f\u00f8rer til, at nogle handlinger fjernes for tidligt eller udf\u00f8res i forkert r\u00e6kkef\u00f8lge, hvilket resulterer i en forkert <i>Latency State<\/i>.<\/li>\n<li>Spilleren f\u00e5r forbindelsesproblemet l\u00f8st, og han simulerer op til 400 takter for at indhente serveren.<\/li>\n<li>I hver takt genereres og forberedes en ny handling for \u00e6ndring af valg af entitet til at blive sendt til serveren.<\/li>\n<li>Klienten sender til serveren en megapakke med mere end 400 \u00e6ndringer af valg af entiteter (og andre handlinger: tilstand af skydning, gang osv. led ogs\u00e5 under dette problem).<\/li>\n<li>Serveren modtager 400 indtastningshandlinger. Da det ikke er tilladt at springe nogen indtastningshandlinger over, beder den alle klienter om at udf\u00f8re disse handlinger og sende dem over netv\u00e6rket.<\/li>\n<\/ol>\n<p>\nIronien er, at mekanismen, der skulle spare b\u00e5ndbredde, i virkeligheden skabte enorme netv\u00e6rkspakker.<\/p>\n<p>Vi l\u00f8ste dette problem ved at rette alle gr\u00e6nsetilf\u00e6lde for opdatering og st\u00f8tte af k\u00f8er med forsinkelser. Selvom det tog en del tid, var det i sidste ende v\u00e6rd at f\u00e5 det hele gjort korrekt i stedet for at stole p\u00e5 hurtige hacks.<br \/>\n<br \/>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/466135\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043c\u0430\u0435 \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u044f \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 MMO-\u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0438 KatherineOfSky. \u042f \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u044b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u0447\u0430\u0441\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u00ab\u043e\u0442\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f\u00bb. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u0432\u0430\u0441 (\u043d\u043e \u043d\u0435 \u0434\u043b\u044f \u043c\u0435\u043d\u044f), \u044f \u0431\u044b\u043b \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0442\u0435\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u043b\u0438\u0441\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u042f \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u044f\u043b \u044d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28381,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37812","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\".\" \/>\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\/da\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\u041c\u0435\u0433\u0430\u043f\u0430\u043a\u0435\u0442: \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c Factorio \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440\u043e\u043c \u043d\u0430 200 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov\" \/>\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-10-31T19:19:55+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:19:55+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\udd47Mega-pakke: hvordan udviklerne af Factorio lykkedes med at l\u00f8se problemet med multiplayer for 200 spillere | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\u041c\u0435\u0433\u0430\u043f\u0430\u043a\u0435\u0442: \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c Factorio \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440\u043e\u043c \u043d\u0430 200 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/megapaket-kak-razrabotchikam-factorio-udalos-reshit-problemu-s-multipleerom-na-200-igrokov","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-10-31T19:19:55+00:00","article:modified_time":"2019-10-31T19:19:55+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37812","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-23 19:22:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:20:22","updated":"2026-01-23 19:22:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/37812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=37812"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/37812\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/28381"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=37812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=37812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=37812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}