{"id":82734,"date":"2020-05-24T13:42:22","date_gmt":"2020-05-24T11:42:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch"},"modified":"2020-05-24T13:42:22","modified_gmt":"2020-05-24T11:42:22","slug":"optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch","title":{"rendered":"Ottimizzazione del carico su un progetto Highload con ElasticSearch","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ciao, Habr! Mi chiamo Maxim Vasiliev, lavoro come analista e project manager in FINCH. Oggi vorrei raccontare come, utilizzando ElasticSearch, siamo riusciti a elaborare 15 milioni di richieste in 6 minuti e ottimizzare i carichi quotidiani sul sito di uno dei nostri clienti. Sfortunatamente, dovremo fare a meno dei nomi, poich\u00e9 abbiamo un NDA, speriamo che il contenuto dell'articolo non ne risenta. Let`s go.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Come \u00e8 strutturato il progetto<\/h2>\n<p>\nSul nostro backend creiamo servizi che garantiscono il funzionamento dei siti e dell'applicazione mobile del nostro cliente. La struttura generale pu\u00f2 essere vista nello schema:<\/p>\n<p><img decoding=\"async\" alt=\"Ottimizzazione del carico su un progetto Highload con ElasticSearch\" src=\"\/wp-content\/uploads\/2020\/05\/7bda10a9965163c2b175b501f50bc342.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNel processo di lavoro elaboriamo un grande numero di transazioni: acquisti, pagamenti, operazioni con i saldi degli utenti, per i quali conserviamo molti log, oltre a importare ed esportare questi dati in sistemi esterni. <\/p>\n<p>Ci sono anche processi inversi, quando riceviamo dati dal cliente e li trasmettiamo agli utenti. Inoltre, esistono anche processi relativi ai pagamenti e ai programmi di premi.<\/p>\n<h2>Breve introduzione<\/h2>\n<p>\nInizialmente utilizzavamo PostgreSQL come unica soluzione di archiviazione dei dati. I suoi standard vantaggi per DBMS: disponibilit\u00e0 di transazioni, un linguaggio di query avanzato, un'ampia gamma di strumenti per l'integrazione; insieme a buone prestazioni, soddisfacevano le nostre esigenze per un bel po' di tempo. <\/p>\n<p>Conservavamo in Postgres tutti i dati: dalle transazioni alle notizie. Ma il numero di utenti cresceva, e con esso anche il numero di richieste.<\/p>\n<p><i>Per capire, il numero annuale di sessioni nel 2017 solo sul sito desktop era di 131 milioni. Nel 2018 era di 125 milioni. Nel 2019 ancora 130 milioni. Aggiungi altro 100-200 milioni dalla versione mobile del sito e dall'app mobile, e otterrai un numero colossale di richieste. <\/i><\/p>\n<p>Con la crescita del progetto, Postgres ha smesso di far fronte al carico, eravamo in ritardo - \u00e8 emerso un gran numero di richieste diverse, per le quali non abbiamo potuto creare un numero sufficiente di indici. <\/p>\n<p>Abbiamo capito che c'era bisogno di altri sistemi di archiviazione dei dati, che soddisfacessero le nostre esigenze e riducessero il carico su PostgreSQL. Abbiamo considerato come opzioni Elasticsearch e MongoDB. Quest'ultimo perdeva su questi punti:<\/p>\n<ol>\n<li>La velocit\u00e0 di indicizzazione lenta con l'aumento del volume dei dati negli indici. Con Elastic, la velocit\u00e0 non dipende dal volume dei dati.<\/li>\n<li>Nessuna ricerca full-text<\/li>\n<\/ol>\n<p>\nCos\u00ec abbiamo scelto Elastic e ci siamo preparati alla migrazione. <\/p>\n<h2>Migrazione a Elastic<\/h2>\n<p>\n1. Abbiamo iniziato la migrazione dal servizio di ricerca dei punti vendita. Il nostro cliente ha un totale di circa 70.000 punti vendita e sono necessari diversi tipi di ricerca sul sito e nell'app:<\/p>\n<ul>\n<li>Ricerca testuale per nome della localit\u00e0<\/li>\n<li>Ricerca geolocalizzata entro un certo raggio da un punto specifico. Ad esempio, se un utente vuole vedere quali punti vendita sono pi\u00f9 vicini a casa sua.<\/li>\n<li>Ricerca all'interno di un quadrato specificato: l'utente disegna un quadrato sulla mappa e gli vengono mostrati tutti i punti in quel raggio. <\/li>\n<li>Ricerca tramite filtri aggiuntivi. I punti vendita differiscono tra loro per assortimento. <\/li>\n<\/ul>\n<p>\nParlando dell'organizzazione, in Postgres abbiamo una fonte di dati sia per la mappa che per le notizie, mentre in Elastic vengono creati snapshot dei dati originali. Il problema \u00e8 che inizialmente Postgres non riusciva a gestire la ricerca su tutti i criteri. Non solo c'erano molti indici, ma potevano anche sovrapporsi, quindi il planner di Postgres si confondeva e non capiva quale indice utilizzare. <\/p>\n<p>2. Il prossimo passo \u00e8 stato la sezione notizie. Ogni giorno appaiono pubblicazioni sul sito; per evitare che l'utente si perda nel flusso di informazioni, i dati devono essere ordinati prima della visualizzazione. A questo serve la ricerca: sul sito \u00e8 possibile cercare per corrispondenza testuale e, in aggiunta, attivare filtri supplementari, poich\u00e9 anche questi sono implementati tramite Elastic. <\/p>\n<p>3. Poi abbiamo trasferito l'elaborazione delle transazioni. Gli utenti possono acquistare determinati prodotti sul sito e partecipare all'estrazione di premi. Dopo tali acquisti, elaboriamo una grande quantit\u00e0 di dati, specialmente nei fine settimana e durante le festivit\u00e0. Per fare un confronto, nei giorni normali il numero di acquisti si aggira intorno ai 1,5-2 milioni, mentre durante le festivit\u00e0 pu\u00f2 arrivare fino a 53 milioni.<\/p>\n<p>Nel frattempo, i dati devono essere elaborati nel minor tempo possibile: gli utenti non amano aspettare giorni per un risultato. Attraverso Postgres non si possono ottenere tali tempi \u2014 ricevevamo spesso blocchi e, mentre elaboravamo tutte le richieste, gli utenti non potevano verificare se avevano vinto premi o meno. Questo non \u00e8 molto gradito per il business, quindi abbiamo trasferito l'elaborazione in Elasticsearch.<\/p>\n<h2>Frequenza<\/h2>\n<p>\nAttualmente gli aggiornamenti sono impostati per eventi, secondo le seguenti condizioni:<\/p>\n<ol>\n<li>Punti vendita. Non appena riceviamo dati da una fonte esterna, avviamo immediatamente l'aggiornamento. <\/li>\n<li>Notizie. Appena una notizia viene modificata sul sito, essa viene automaticamente inviata a Elastic.<\/li>\n<\/ol>\n<p>\nQui vale la pena ripetere i vantaggi di Elastic. In Postgres, durante l'invio della richiesta, bisogna attendere che elabori onestamente tutte le registrazioni. In Elastic \u00e8 possibile inviare 10.000 registrazioni e iniziare a lavorare immediatamente, senza attendere che le registrazioni vengano distribuite tra tutti i Shard. Certo, qualche Shard o Replica potrebbe non vedere immediatamente i dati, ma molto presto tutto sar\u00e0 accessibile.<\/p>\n<h2>Metodi di integrazione<\/h2>\n<p>\nCi sono 2 metodi di integrazione con Elastic:<\/p>\n<ol>\n<li>Attraverso il client nativo via TCP. Il driver nativo \u00e8 in via di estinzione: non \u00e8 pi\u00f9 supportato ed ha una sintassi molto scomoda. Pertanto, lo utilizziamo praticamente mai e cerchiamo di rinunciare completamente ad esso.<\/li>\n<li>Attraverso l'interfaccia HTTP, nella quale \u00e8 possibile utilizzare sia richieste JSON che la sintassi Lucene. Quest'ultima \u00e8 il motore testuale che utilizza Elastic. In questa modalit\u00e0 otteniamo la possibilit\u00e0 di Batch tramite richieste JSON via HTTP. \u00c8 proprio questa modalit\u00e0 che cerchiamo di utilizzare.<\/li>\n<\/ol>\n<p>\nGrazie all'interfaccia HTTP possiamo utilizzare librerie che forniscono un'implementazione asincrona del client HTTP. Possiamo approfittare del Batch e delle API asincrone, il che alla fine offre elevate prestazioni, che sono state molto utili nei giorni di grandi eventi (di questo parleremo pi\u00f9 avanti)<\/p>\n<p>Alcuni numeri per il confronto: <\/p>\n<ul>\n<li>Salvataggio degli utenti che hanno ricevuto premi in Postgres in 20 thread senza raggruppamenti: 460.713 registrazioni in 42 secondi<\/li>\n<li>Elastic + client reattivo su 10 thread + batch su 1000 elementi: 596.749 registrazioni in 11 secondi<\/li>\n<li>Elastic + client reattivo su 10 thread + batch su 1000 elementi: <b>23.801.684 registrazioni in 4 minuti<\/b><\/li>\n<\/ul>\n<p>\nAttualmente abbiamo scritto un gestore di richieste HTTP che costruisce JSON, come Batch\/non Batch, e invia attraverso qualsiasi client HTTP indipendentemente dalla libreria. \u00c8 anche possibile scegliere di inviare richieste in modo sincrono o asincrono.<\/p>\n<p>In alcune integrazioni utilizziamo ancora il client di trasporto ufficiale, ma \u00e8 solo una questione di una prossima rifattorizzazione. Nel frattempo, per l'elaborazione utilizziamo un client proprietario costruito sulla base di Spring WebClient.<\/p>\n<p><img decoding=\"async\" alt=\"Ottimizzazione del carico su un progetto Highload con ElasticSearch\" src=\"\/wp-content\/uploads\/2020\/05\/112bf3261c93ce585d8559b420e79f64.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Grande evento<\/h2>\n<p>\nUna volta all'anno, nel progetto si svolge una grande promozione per gli utenti: \u00e8 il famoso Highload, poich\u00e9 in questo periodo lavoriamo con decine di milioni di utenti contemporaneamente.<\/p>\n<p>Di solito, i picchi di carico si verificano durante i giorni festivi, ma questa promozione \u00e8 su un altro livello. Nell'anno precedente, nel giorno della promozione, abbiamo venduto 27.580.890 unit\u00e0 di prodotto. I dati sono stati elaborati per pi\u00f9 di mezz'ora, causando disagi agli utenti. Gli utenti hanno ricevuto premi per la partecipazione, ma \u00e8 diventato chiaro che il processo doveva essere accelerato. <\/p>\n<p>All'inizio del 2019, abbiamo deciso che ci voleva ElasticSearch. Per un intero anno, abbiamo organizzato l'elaborazione dei dati ricevuti in Elastic e la loro fornitura nell'api dell'app mobile e del sito. Di conseguenza, l'anno successivo, durante la promozione abbiamo elaborato <b>15.131.783 record in 6 minuti. <\/b><\/p>\n<p>Poich\u00e9 abbiamo molti utenti interessati ad acquistare prodotti e partecipare all'estrazione dei premi nelle promozioni, si tratta di una misura temporanea. Attualmente, inviamo informazioni aggiornate a Elastic, ma in futuro prevediamo di trasferire le informazioni archiviate dei mesi passati in Postgres, come archivio permanente. Cos\u00ec da non intasare l'indice Elastic, che ha anch'esso le sue limitazioni.<\/p>\n<h2>Conclusioni<\/h2>\n<p>\nAl momento, abbiamo trasferito su Elastic tutti i servizi che volevamo e per ora ci siamo fermati. Ora stiamo costruendo un indice in Elastic sopra il principale archivio persistente in Postgres, che si occupa del carico degli utenti.<\/p>\n<p>In futuro, prevediamo di trasferire i servizi se comprendiamo che le richieste di dati stanno diventando troppo variegate e vengono ricercate su un numero illimitato di colonne. Questo \u00e8 gi\u00e0 un compito che non si adatta a Postgres.<\/p>\n<p>Se avremo bisogno di ricerca full-text nelle funzionalit\u00e0 o se ci saranno molti criteri di ricerca diversi, sappiamo gi\u00e0 che dobbiamo trasferirlo in Elastic.<\/p>\n<h2>\u2318\u2318\u2318<\/h2>\n<p>\nGrazie per aver letto. Se nella vostra azienda utilizzate anche ElasticSearch e avete casi di implementazione propri, fatecelo sapere. Sarebbe interessante scoprire come lavorano gli altri \ud83d\ude42<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/503214\/\">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! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 FINCH. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ElasticSearch, \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c 15 \u043c\u043b\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430 6 \u043c\u0438\u043d\u0443\u0442 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u0438\u043c\u0451\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043d\u0430\u0441 NDA, \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":82735,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-82734","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.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 FINCH.\" \/>\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\/it\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 Highload-\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ElasticSearch | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 FINCH.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch\" \/>\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=\"2020-05-24T11:42:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-24T11:42:22+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\udd47Ottimizzazione del carico su un progetto Highload utilizzando ElasticSearch - ProHoster","description":"Ciao, Habr! Mi chiamo Maxim Vasiliev, lavoro come analista e project manager in FINCH.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 Highload-\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ElasticSearch | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u043c \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 FINCH.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/optimizacziya-nagruzki-na-highload-proekte-s-pomoshhyu-elasticsearch","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":"2020-05-24T11:42:22+00:00","article:modified_time":"2020-05-24T11:42:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"82734","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 15:32:25","updated":"2022-09-28 21:13:07","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/82734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=82734"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/82734\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/82735"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=82734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=82734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=82734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}