{"id":95804,"date":"2020-10-03T13:42:27","date_gmt":"2020-10-03T11:42:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit"},"modified":"2020-10-03T13:42:27","modified_gmt":"2020-10-03T11:42:27","slug":"istoriya-arhitektury-dodo-is-rannij-monolit","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","title":{"rendered":"Storia dell'architettura Dodo IS: monolite iniziale","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Oppure ogni sfortunata azienda con un monolite \u00e8 infelice a modo suo.<\/p>\n<p>Lo sviluppo del sistema Dodo IS \u00e8 iniziato contemporaneamente all'attivit\u00e0 di Dodo Pizza, nel 2011. Alla base c'era l'idea di una completa e totale digitalizzazione dei processi aziendali, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>con le proprie forze<\/u><\/a><\/noindex>, il che sollevava gi\u00e0 nel 2011 molte domande e scetticismo. Ma gi\u00e0 da 9 anni seguiamo questa strada \u2014 con uno sviluppo interno, iniziato con un monolite.<\/p>\n<p>Questo articolo \u00e8 una \u00abrisposta\u00bb alle domande \u00abPerch\u00e9 riscrivere l'architettura e apportare tali modifiche su larga scala e di lunga durata?\u00bb all'articolo precedente <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\u00abStoria dell'architettura Dodo IS: il percorso del back office\u00bb<\/u><\/a><\/noindex>. Inizier\u00f2 con come \u00e8 iniziato lo sviluppo di Dodo IS, come appariva l'architettura originale, come sono stati aggiunti nuovi moduli e quali problemi hanno richiesto ampie modifiche.<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>La serie di articoli \u00abCosa \u00e8 Dodo IS?\u00bb parler\u00e0 di:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>Il monolite iniziale in Dodo IS (2011-2015). (Sei qui)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">Il percorso del back office: database separati e bus<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>Il percorso della parte clienti: facciata sopra il database (2016-2017). (In corso...)<\/p>\n<\/li>\n<li>\n<p>Storia dei veri microservizi. (2018-2019). (In corso...)<\/p>\n<\/li>\n<li>\n<p>Completamento della divisione del monolite e stabilizzazione dell'architettura. (In corso...)<\/p>\n<\/li>\n<\/ol>\n<h3>Architettura originale<\/h3>\n<p>Nel 2011, l'architettura di Dodo IS appariva cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Il primo modulo nell'architettura \u00e8 la ricezione degli ordini. Il processo aziendale era il seguente:<\/p>\n<ul>\n<li>\n<p>il cliente chiama la pizzeria;<\/p>\n<\/li>\n<li>\n<p>il manager risponde al telefono;<\/p>\n<\/li>\n<li>\n<p>prende l'ordine per telefono;<\/p>\n<\/li>\n<li>\n<p>contemporaneamente lo inserisce nell'interfaccia di ricezione ordini: si tiene conto delle informazioni sul cliente, dei dettagli dell'ordine e dell'indirizzo di consegna.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>L'interfaccia del sistema informatico appariva pi\u00f9 o meno cos\u00ec\u2026<\/p>\n<p>Prima versione di ottobre 2011:<\/p>\n<p><center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f75cfa9779ba700bea78afc\" frameborder=\"0\" allowfullscreen><\/iframe><\/center>Leggermente migliorata a gennaio 2012<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/h2Cdht01gDA\">Sistema informativo Dodo Pizza Delivery Pizza Restaurant<\/a><\/noindex><\/p>\n<p>Le risorse per lo sviluppo del primo modulo di ricezione ordini erano limitate. Era necessario fare molto, in fretta e con un numero ridotto di persone. Un numero ridotto significa 2 sviluppatori, che hanno posto le basi dell'intero sistema futuro.<\/p>\n<p>La loro prima soluzione ha determinato il destino del stack tecnologico:<\/p>\n<ul>\n<li>\n<p>Backend su ASP.NET MVC, linguaggio C#. Gli sviluppatori erano esperti di .NET, questo stack era loro familiare e gradito. <\/p>\n<\/li>\n<li>\n<p>Frontend su Bootstrap e JQuery: interfacce utente con stili e script personalizzati.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Database MySQL: senza costi per le licenze, semplice da usare.<\/p>\n<\/li>\n<li>\n<p>Server su Windows Server, perch\u00e9 .NET all'epoca poteva funzionare solo su Windows (non parleremo di Mono).<\/p>\n<\/li>\n<\/ul>\n<p>Fisicamente si manifestava tutto in un \"dedicated server presso l'hosting\".&nbsp;<\/p>\n<h4>Architettura dell'applicazione per la ricezione degli ordini<\/h4>\n<p>Allora gi\u00e0 tutti parlavano di microservizi, mentre l'SOA era usato da circa 5 anni nei grandi progetti, per esempio, WCF \u00e8 uscito nel 2006. Ma a quel tempo \u00e8 stata scelta una soluzione affidabile e consolidata.<\/p>\n<p>Ecco qui.<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/688da7d4e02a6310bf7d2da1b767fe10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asp.Net MVC \u00e8 Razor, che restituisce su richiesta dal modulo o dal client una pagina HTML con rendering lato server. Sul client, gi\u00e0 CSS e script JS visualizzano le informazioni e, se necessario, eseguono richieste AJAX tramite JQuery.<\/p>\n<p>Le richieste al server arrivano nelle classi *Controller, dove il metodo elabora e genera la pagina HTML finale. I controller fanno richieste al livello di logica, chiamato *Services. Ognuno dei servizi risponde a un aspetto del business:<\/p>\n<ul>\n<li>\n<p>Ad esempio, il DepartmentStructureService forniva informazioni sulle pizzerie, sui dipartimenti. Un dipartimento \u00e8 un gruppo di pizzerie gestito da un solo franchisee.<\/p>\n<\/li>\n<li>\n<p>ReceivingOrdersService riceveva e calcolava il contenuto dell'ordine.<\/p>\n<\/li>\n<li>\n<p>E SmsService inviava SMS, richiamando API per l'invio di SMS.<\/p>\n<\/li>\n<\/ul>\n<p>I servizi elaboravano i dati dal database, conservavano la logica di business. In ogni servizio c'era uno o pi\u00f9 *Repository con nome corrispondente. All'interno c'erano gi\u00e0 le richieste a procedure memorizzate nel database e il livello dei mapper. Nelle stored procedure c'era la logica di business, specialmente in quelle che restituiscono dati di reportistica. Non \u00e8 stato utilizzato ORM, tutti si fidavano dell'SQL scritto a mano.&nbsp;<\/p>\n<p>C'era anche un livello di modello di dominio e classi helper comuni, ad esempio, la classe Order, che memorizzava l'ordine. L\u00ec, nel livello, c'era un helper per la conversione del testo di visualizzazione in base alla valuta selezionata.<\/p>\n<p>Tutto questo pu\u00f2 essere rappresentato con il seguente modello: <\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Percorso dell'ordine<\/h4>\n<p>Consideriamo il percorso iniziale semplificato per la creazione di un ordine.<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Inizialmente il sito era statico. Aveva prezzi e in alto c'era il numero di telefono e la scritta \"Vuoi una pizza - chiama il numero e ordina\". Per l'ordine dovevamo implementare un flusso semplice:&nbsp;<\/p>\n<ul>\n<li>\n<p>Il cliente visita il sito statico con i prezzi, sceglie i prodotti e chiama il numero indicato sul sito.<\/p>\n<\/li>\n<li>\n<p>Il cliente nomina i prodotti che desidera aggiungere all'ordine.<\/p>\n<\/li>\n<li>\n<p>Nomina il proprio indirizzo e il proprio nome.<\/p>\n<\/li>\n<li>\n<p>L'operatore accetta l'ordine.<\/p>\n<\/li>\n<li>\n<p>L'ordine viene visualizzato nell'interfaccia degli ordini ricevuti.<\/p>\n<\/li>\n<\/ul>\n<p>Tutto inizia con la visualizzazione del menu. Un utente operatori autenticato pu\u00f2 accettare solo un ordine alla volta. Pertanto, il carrello in bozza pu\u00f2 essere memorizzato nella sua sessione (la sessione utente \u00e8 memorizzata in memoria). L\u00ec c'\u00e8 l'oggetto Cart, in cui si trovano i prodotti e le informazioni sul cliente.<\/p>\n<p>Il cliente nomina il prodotto, l'operatore clicca su <code>+<\/code> accanto al prodotto, e viene inviata una richiesta al server. Vengono estratte informazioni dal database e aggiunte informazioni sul prodotto al carrello.<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Nota<\/strong>. S\u00ec, qui \u00e8 possibile non estrarre il prodotto dal database, ma trasmetterlo dal front-end. Ma per chiarezza ho mostrato il percorso dal database.&nbsp;<\/p>\n<p>Successivamente, inseriamo l'indirizzo e il nome del cliente.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quando si preme \"Crea ordine\":<\/p>\n<ul>\n<li>\n<p>Inviamo la richiesta a OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>Otteniamo il Cart dalla sessione, dove si trovano i prodotti nelle quantit\u00e0 necessarie.<\/p>\n<\/li>\n<li>\n<p>Completiamo il Cart con le informazioni sul cliente e lo passiamo al metodo AddOrder della classe ReceivingOrderService, dove viene salvato nel database.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Nel database ci sono tabelle con gli ordini, i dettagli degli ordini, i clienti e sono tutte collegate.<\/p>\n<\/li>\n<li>\n<p>L'interfaccia di visualizzazione degli ordini recupera gli ordini pi\u00f9 recenti e li visualizza.<\/p>\n<\/li>\n<\/ul>\n<h4>Nuovi moduli<\/h4>\n<p>L'inizio degli ordini \u00e8 stato fondamentale e necessario. Non si pu\u00f2 avviare un'attivit\u00e0 di vendita di pizze senza un sistema per gestire gli ordini. Cos\u00ec, tra il 2012 e il 2015, il sistema ha cominciato ad arricchirsi di funzionalit\u00e0. Durante questo periodo sono stati introdotti molti diversi moduli del sistema, che io chiamer\u00f2 <strong>moduli<\/strong>, in contrapposizione al concetto di servizio o prodotto.&nbsp;<\/p>\n<p>Un modulo \u00e8 un insieme di funzioni unite da un obiettivo aziendale comune. Inoltre, fisicamente si trovano in un'applicazione.<\/p>\n<p>I moduli possono essere considerati blocchi del sistema. Ad esempio, c'\u00e8 il modulo report, le interfacce di amministrazione, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>il tracker dei prodotti in cucina<\/u><\/a><\/noindex>, l'autenticazione. Questi sono tutti diversi interfacce per l'utente, alcune hanno anche stili visivi differenti. Tuttavia, restano all'interno di una stessa applicazione, uno stesso processo operativo.&nbsp;<\/p>\n<p>Tecnicamente, i moduli erano organizzati come Area (un'idea rimasta nel <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/mvc\/controllers\/areas?view=aspnetcore-3.1\"><u>asp.net core<\/u><\/a><\/noindex>). C'erano file separati per il frontend, i modelli e classi per i controllori. Alla fine, il sistema si \u00e8 trasformato da cos\u00ec\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026a cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Alcuni moduli sono stati implementati come siti separati (progetto eseguibile), a causa di funzionalit\u00e0 completamente separate e in parte a causa di uno sviluppo pi\u00f9 focalizzato e separato. Questo \u00e8:<\/p>\n<ul>\n<li>\n<p><strong>Sito<\/strong> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2013\/08\/06\/new_site_dodopizza_ru\/\"><u>prima versione<\/u><\/a><\/noindex> del sito dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Export<\/strong>: esportazione di report da Dodo IS per 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Personale<\/strong> \u2014 area personale per i dipendenti. Sviluppata separatamente con un proprio punto di accesso e un design unico.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 progetto per l'hosting di contenuti statici. In seguito abbiamo abbandonato questo approccio, migrando tutto il contenuto statico su CDN Akamai.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Gli altri blocchi erano all'interno dell'applicazione BackOffice.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Chiarimento sui nomi:<\/p>\n<ul>\n<li>\n<p>Cassa \u2014 Cassa del ristorante.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 interfacce per il ruolo di 'Manager di turno': statistiche operative sulle vendite della pizzeria, possibilit\u00e0 di inserire prodotti in una lista nera, modificare ordini.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 interfacce per il ruolo di 'Gestore della pizzeria' e 'Franchising'. Qui sono raccolte le funzionalit\u00e0 per configurare la pizzeria, le sue promozioni, gestire i dipendenti, report.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 interfacce per televisori e tablet, appesi nelle pizzerie. I televisori mostrano il menu, informazioni pubblicitarie e lo stato dell'ordine durante la consegna.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Hanno utilizzato uno strato comune di servizi, un blocco comune di classi di dominio Dodo.Core, oltre a un database condiviso. A volte si potevano anche fare transizioni tra loro. Compresi i servizi comuni a cui accedevano siti separati, come dodopizza.ru o personal.dodopizza.ru.<\/p>\n<p>Con la comparsa di nuovi moduli, si cercava di riutilizzare al massimo il codice di servizio gi\u00e0 creato, procedure memorizzate e tabelle nel database.&nbsp;<\/p>\n<p>Per una migliore comprensione della scala dei moduli realizzati nel sistema, ecco uno schema del 2012 con i piani di sviluppo:<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Entro il 2015, tutto nello schema e anche di pi\u00f9 era in produzione.<\/p>\n<ul>\n<li>\n<p>La ricezione dell'ordine \u00e8 diventata un blocco separato del Centro Contatti, dove l'ordine viene preso dall'operatore.<\/p>\n<\/li>\n<li>\n<p>Sono comparsi schermi pubblici con menu e informazioni, appesi nelle pizzerie.<\/p>\n<\/li>\n<li>\n<p>In cucina c'\u00e8 un modulo che riproduce automaticamente un messaggio vocale 'Nuova pizza' all'arrivo di un nuovo ordine e stampa anche una nota per il corriere. Questo semplifica notevolmente i processi in cucina, permettendo ai dipendenti di non distrarsi in molte operazioni semplici.<\/p>\n<\/li>\n<li>\n<p>Il blocco consegne \u00e8 diventato una Cassa di Consegna separata, dove l'ordine veniva fornito al corriere, che si era precedentemente registrato per il turno. Si considerava il suo tempo lavorativo per il calcolo della retribuzione.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Parallelamente, dal 2012 al 2015, sono emersi pi\u00f9 di 10 sviluppatori, sono state aperte 35 pizzerie, il sistema \u00e8 stato implementato in Romania e sono state preparate aperture negli Stati Uniti. Gli sviluppatori non si occupavano pi\u00f9 di tutti i compiti, ma erano suddivisi in team, ognuno specializzato nella propria parte del sistema.&nbsp;<\/p>\n<h3>Problemi<\/h3>\n<p>Tra cui l'architettura (ma non solo).<\/p>\n<h4>Caos nel database<\/h4>\n<p>Un database \u2014 \u00e8 comodo. In esso si pu\u00f2 raggiungere la coerenza, grazie agli strumenti integrati nei database relazionali. Lavorarci \u00e8 familiare e conveniente, specialmente se ci sono poche tabelle e pochi dati.<\/p>\n<p>Ma dopo 4 anni di sviluppo, nel database si trovavano circa 600 tabelle, 1500 procedure memorizzate, molte delle quali contenevano logica. Purtroppo, le procedure memorizzate non offrono vantaggi significativi quando si lavora con MySQL. Non vengono memorizzate nella cache dal database e contenere logica in esse complica lo sviluppo e il debug. Anche il riutilizzo del codice era complicato.<\/p>\n<p><strong>Molte tabelle non avevano indici adeguati<\/strong>, mentre in altri casi ce n'erano troppi, rendendo difficile l'inserimento. Era necessario modificare circa 20 tabelle: la transazione per la creazione di un ordine poteva richiedere circa 3-5 secondi.&nbsp;<\/p>\n<p><strong>I dati nelle tabelle non erano sempre nella forma pi\u00f9 adatta.<\/strong>In alcuni casi era necessaria la denormalizzazione. Parte dei dati ricevuti regolarmente era in una colonna come struttura XML, il che aumentava i tempi di esecuzione, allungava le query e complicava lo sviluppo.<\/p>\n<p>Venivano eseguite richieste molto <strong>eterogenee sulle stesse tabelle.<\/strong>Le tabelle popolari, come quella menzionata <em>orders<\/em> o la tabella <em>pizzeria<\/em>, ne soffrivano particolarmente. Erano utilizzate per l'output delle interfacce operative in cucina e per l'analisi. Anche il sito web (<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>), che in qualsiasi momento poteva ricevere un numero imprevisto di richieste.&nbsp;<\/p>\n<p><strong>I dati non erano aggregati<\/strong> e molti calcoli avvenivano al volo utilizzando le risorse del database. Questo creava calcoli superflui e un carico aggiuntivo.&nbsp;<\/p>\n<p>Spesso il codice accedeva al database quando non avrebbe dovuto. In alcuni casi mancavano operazioni bulk, in altri sarebbe stato necessario suddividere una richiesta in diverse tramite codice per accelerare e aumentare l'affidabilit\u00e0.&nbsp;<\/p>\n<h4>Coesione e confusione nel codice<\/h4>\n<p><strong>I moduli che avrebbero dovuto rispondere al proprio campo di attivit\u00e0 non lo facevano in modo adeguato.<\/strong>. Alcuni di essi avevano funzioni duplicate per i ruoli. Ad esempio, il marketer locale, responsabile delle attivit\u00e0 di marketing della rete nella propria citt\u00e0, doveva utilizzare sia l'interfaccia \"Admin\" (per la creazione delle promozioni) sia l'interfaccia \"Office Manager\" (per visualizzare l'impatto delle promozioni sul business). Ovviamente, entrambi i moduli utilizzavano un unico servizio che gestiva le promozioni.<\/p>\n<p>I servizi (classi all'interno di un grande progetto monolitico) potevano chiamarsi a vicenda per arricchire i propri dati.<\/p>\n<p>Con le stesse classi modello, che memorizzano i dati, <strong>il lavoro nel codice avveniva in modo diverso<\/strong>. In alcuni casi c'erano dei costruttori tramite i quali si potevano indicare i campi obbligatori. In altri casi, ci\u00f2 avveniva tramite propriet\u00e0 pubbliche. Ovviamente, l'acquisizione e la trasformazione dei dati dal database era variegata.&nbsp;<\/p>\n<p><strong>La logica era presente o nei controller o nelle classi dei servizi.<\/strong>&nbsp;<\/p>\n<p>Questi sembravano problemi insignificanti, ma rallentavano notevolmente lo sviluppo e riducevano la qualit\u00e0, portando a instabilit\u00e0 e bug.&nbsp;<\/p>\n<h4>La complessit\u00e0 di uno sviluppo su larga scala<\/h4>\n<p><strong>Sono sorte difficolt\u00e0 anche nello sviluppo stesso<\/strong>. Era necessario creare diversi blocchi del sistema, e per di pi\u00f9 in parallelo. Era sempre pi\u00f9 difficile riunire le esigenze di ogni componente in un unico codice. Non era semplice trovare un accordo e soddisfare tutti i componenti contemporaneamente. A questo si aggiungevano vincoli nelle tecnologie, specialmente per quanto riguardava il database e il frontend. Era necessario abbandonare JQuery in favore di framework di alto livello, soprattutto per i servizi lato cliente (sito web).<\/p>\n<p><strong>In alcune parti del sistema avrebbero potuto essere utilizzati database pi\u00f9 adatti per questa situazione<\/strong>. Ad esempio, successivamente abbiamo avuto un caso di transizione da Redis a CosmosDB per la memorizzazione del carrello degli ordini.&nbsp;<\/p>\n<p>I team e gli sviluppatori, che si occupavano del loro ambito, volevano chiaramente maggiore indipendenza per i loro servizi, sia in termini di sviluppo che di rilascio. I conflitti durante il merging, i problemi durante i rilasci. Se per 5 sviluppatori questo problema \u00e8 trascurabile, per 10, e ancor di pi\u00f9 con la crescita pianificata, tutto sarebbe diventato pi\u00f9 serio. E davanti a noi c'era lo sviluppo di un'applicazione mobile (che \u00e8 iniziato nel 2017, e nel 2018 c'era <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">un grande crollo<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>Diverse parti del sistema richiedevano diversi indicatori di stabilit\u00e0.<\/strong>, ma a causa della forte interconnessione del sistema, non siamo riusciti a garantire questo. Un errore nello sviluppo di una nuova funzionalit\u00e0 nell'admin poteva facilmente influire sulla ricezione degli ordini sul sito, poich\u00e9 il codice \u00e8 comune e riutilizzabile, cos\u00ec come il database e i dati.<\/p>\n<p>Probabilmente, si sarebbe potuto evitare questi errori e problemi anche con un'architettura monolitica e modulare: separare le responsabilit\u00e0, effettuare il refactoring sia del codice che del database, mantenere i livelli separati l'uno dall'altro, controllare la qualit\u00e0 ogni giorno. Ma le decisioni architettoniche scelte e il focus su un rapido ampliamento delle funzionalit\u00e0 del sistema hanno portato a problemi di stabilit\u00e0.<\/p>\n<h4>Come il blog Sila della mente ha influito sulle casse dei ristoranti<\/h4>\n<p>Se la crescita della rete di pizzerie (e il carico) fosse continuata allo stesso ritmo, dopo un po' le cadute sarebbero state tali che il sistema non sarebbe riuscito a riprendersi. Questa storia illustra bene i problemi che abbiamo iniziato a fronteggiare nel 2015.&nbsp;<\/p>\n<p>Nel blog \u201c<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>Sila della mente<\/u><\/a><\/noindex>\u201d c'era un widget che mostrava i dati sui ricavi annuali dell'intera rete. Il widget effettuava richieste al pubblico API Dodo, che fornisce questi dati. Ora queste statistiche sono disponibili su <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. Il widget veniva mostrato su ogni pagina e effettuava richieste a intervalli di 20 secondi. La richiesta veniva inviata a api.dodopizza.ru e richiedeva:<\/p>\n<ul>\n<li>\n<p>il numero di pizzerie nella rete;<\/p>\n<\/li>\n<li>\n<p>il fatturato totale della rete dall'inizio dell'anno;<\/p>\n<\/li>\n<li>\n<p>il fatturato odierno.<\/p>\n<\/li>\n<\/ul>\n<p>La richiesta delle statistiche sul fatturato veniva inviata direttamente al database, iniziando a richiedere i dati sugli ordini, aggregando i dati in tempo reale e restituendo la somma.&nbsp;<\/p>\n<p>Nella stessa tabella degli ordini entravano le casse dei ristoranti, caricando l'elenco degli ordini ricevuti oggi, e venivano aggiunti anche nuovi ordini. Le casse effettuavano le loro richieste ogni 5 secondi o al caricamento della pagina.<\/p>\n<p>Lo schema era il seguente:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Una volta in autunno, Fedor Ovchinnikov scrisse un lungo e popolare articolo sul suo blog. Al blog arrivarono molte persone che iniziarono a leggerlo attentamente. Mentre ognuno dei visitatori leggeva l'articolo, il widget dei ricavi funzionava regolarmente, effettuando richieste all'API ogni 20 secondi.<\/p>\n<p>L'API ha chiamato una stored procedure per calcolare la somma di tutti gli ordini dall'inizio dell'anno in tutte le pizzerie della rete. L'aggregazione avveniva sulla tabella ordini, molto popolare. In essa confluivano tutte le casse di tutti i ristoranti aperti al momento. Le casse hanno smesso di rispondere, gli ordini non venivano accettati. Inoltre, non venivano accettati nemmeno dal sito, non comparivano nel tracker, il manager del turno non poteva vederli nella propria interfaccia.&nbsp;<\/p>\n<p>Questa non \u00e8 l'unica storia. Fino all'autunno del 2015, il carico del sistema era critico ogni venerd\u00ec. Diverse volte abbiamo disattivato l'API pubblica e una volta, abbiamo persino dovuto disattivare il sito, perch\u00e9 nulla sembrava funzionare. Esisteva anche un elenco di servizi con l'ordine di disattivazione in caso di carichi elevati.<\/p>\n<p>Da questo momento inizia la nostra lotta con i carichi e per la stabilizzazione del sistema (dall'autunno 2015 all'autunno 2018). \u00c8 proprio allora che \u00e8 avvenuto il \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Grande crollo<\/u><\/a><\/noindex>\". Anche in seguito si sono verificati occasionalmente guasti, alcuni sono stati molto significativi, ma ora possiamo considerare questo periodo di instabilit\u00e0 come superato.<\/p>\n<h4>Crescita rapida dell'azienda<\/h4>\n<p>Perch\u00e9 non si poteva \"fare subito bene\"? Basta guardare i grafici seguenti.<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nel 2014-2015 ci sono state aperture in Romania e si stava preparando l'apertura negli Stati Uniti.<\/p>\n<p>La rete cresceva molto rapidamente, si aprivano nuovi paesi, comparivano nuovi formati di pizzerie, ad esempio, una pizzeria \u00e8 stata aperta in un food court. Tutto ci\u00f2 richiedeva una significativa attenzione all'espansione delle funzioni di Dodo IS. Senza tutte queste funzioni, senza tracking in cucina, gestione dei prodotti e delle perdite nel sistema, visualizzazione dell'assegnazione degli ordini nella sala del food court, \u00e8 poco probabile che ora staremmo discutendo della \"corretta\" architettura e del \"giusto\" approccio allo sviluppo.<\/p>\n<p>Un altro ostacolo per una revisione tempestiva dell'architettura e in generale per l'attenzione ai problemi tecnici \u00e8 stata la crisi del 2014. Queste cose colpiscono duramente le possibilit\u00e0 di crescita dei team, specialmente per un'azienda giovane come Dodo Pizza.<\/p>\n<h3>Soluzioni rapide che hanno aiutato<\/h3>\n<p>I problemi richiedevano una soluzione. In linea di principio, le soluzioni possono essere suddivise in 2 gruppi:<\/p>\n<ul>\n<li>\n<p>Rapide, che spengono il fuoco e offrono un piccolo margine di sicurezza e ci guadagnano tempo per le modifiche.<\/p>\n<\/li>\n<li>\n<p>Sistemiche e, quindi, lunghe. Reingegnerizzazione di diversi moduli, separazione dell'architettura monolitica in servizi separati (la maggior parte di essi \u00e8 piuttosto macrocservizi e c'\u00e8 di questo) <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>relazione di Andrei Morevskij<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>L'elenco delle modifiche rapide \u00e8 il seguente:<\/p>\n<h4>Scalare il master del database<\/h4>\n<p>Certo, la prima cosa da fare per affrontare i carichi \u00e8 aumentare la potenza del server. Questo \u00e8 stato fatto per il master del database e per i server web. Purtroppo, ci\u00f2 \u00e8 possibile solo fino a un certo punto, oltre diventa troppo costoso.<\/p>\n<p>Dal 2014 siamo passati a Azure, su questo tema ne abbiamo scritto anche all'epoca nell'articolo \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">Come Dodo Pizza consegna la pizza utilizzando il cloud di Microsoft Azure<\/a><\/noindex>\u00bb. Ma dopo una serie di aumenti del server per il database abbiamo raggiunto un limite di costo.&nbsp;<\/p>\n<h4>Repliche del database per lettura<\/h4>\n<p>Abbiamo creato due repliche per il database:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>per richieste sui dizionari<\/strong>. \u00c8 utilizzata per leggere dizionari, come, citt\u00e0, strade, pizzerie, prodotti (slowly changed domain), e in quegli interface dove \u00e8 accettabile un piccolo ritardo. Queste repliche erano 2, assicuravamo la loro disponibilit\u00e0 proprio come quella del master.<\/p>\n<p><strong>ReadReplica per richieste sui report<\/strong>. Questa replica aveva una disponibilit\u00e0 inferiore, ma da essa si estraevano tutti i report. Anche se avevano richieste pesanti su enormi rielaborazioni di dati, non influivano sul database principale e sulle interfacce operative.&nbsp;<\/p>\n<h4>Cache nel codice<\/h4>\n<p>Non c'erano cache nel codice da nessuna parte (in generale). Questo portava a ulteriori richieste, non sempre necessarie, nel database sotto carico. Le cache erano inizialmente sia in memoria che su un servizio di cache esterno, che era Redis. Tutto veniva invalidato nel tempo, le impostazioni erano specificate nel codice.<\/p>\n<h4>Diversi server per il backend<\/h4>\n<p>Anche il backend dell'applicazione doveva essere scalato per gestire i carichi aumentati. Era necessario trasformare un server IIS in un cluster. Abbiamo trasferito <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>le sessioni delle applicazioni<\/u><\/a><\/noindex> da memoria a RedisCache, il che ha permesso di avere pi\u00f9 server dietro un semplice bilanciatore di carico con round robin. Inizialmente veniva utilizzato lo stesso Redis delle cache, poi \u00e8 stato distribuito su pi\u00f9 server.&nbsp;<\/p>\n<p>Alla fine, l'architettura si \u00e8 complicata...<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/70a3e8d5578469239c08b4759ab32264.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026ma parte della tensione \u00e8 stata alleviata.<\/p>\n<p>E poi era necessario rifattorizzare i componenti sotto carico, per cui ci siamo messi al lavoro. Ne parleremo nella prossima parte.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/521614\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0430\u043b\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u0438 \u0442\u043e\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0446\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438, \u0447\u0442\u043e \u0435\u0449\u0435 \u0442\u043e\u0433\u0434\u0430 \u0432 2011 \u0433\u043e\u0434\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0441\u043a\u0435\u043f\u0442\u0438\u0446\u0438\u0437\u043c\u0430. \u041d\u043e \u0432\u043e\u0442 \u0443\u0436\u0435 9 \u043b\u0435\u0442 \u043c\u044b \u0438\u0434\u0435\u043c \u043f\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95805,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95804","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=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.\" \/>\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\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\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\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Dodo IS: \u0440\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\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-10-03T11:42:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-03T11:42:27+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\udd47Storia dell'architettura Dodo IS: primo monolite | ProHoster","description":"O ogni sfortunata azienda con un monolite \u00e8 infelice a modo suo. Lo sviluppo del sistema Dodo IS \u00e8 iniziato subito, come l'attivit\u00e0 di Dodo Pizza - nel 2011.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","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\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Dodo IS: \u0440\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 | ProHoster","og:description":"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","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-10-03T11:42:27+00:00","article:modified_time":"2020-10-03T11:42:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95804","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 10:57:47","updated":"2022-09-28 00:34: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\/95804","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=95804"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/95804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/95805"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=95804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=95804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=95804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}