{"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: il monolite iniziale","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>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. L'idea di base era quella di una digitalizzazione totale e completa dei processi aziendali, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>fatta in casa<\/u><\/a><\/noindex>, qualcosa che gi\u00e0 nel 2011 sollevava molte domande e scetticismi. Ma ora, dopo 9 anni, continuiamo su questa strada, con uno sviluppo interno che \u00e8 partito da un monolite.<\/p>\n<p>Quest'articolo \u00e8 una \"risposta\" alle domande \"Perch\u00e9 riscrivere l'architettura e apportare modifiche cos\u00ec vaste e lunghe?\" all'articolo precedente <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\"Storia dell'architettura Dodo IS: il percorso del back office\".<\/u><\/a><\/noindex>Comincer\u00f2 da come \u00e8 iniziato lo sviluppo di Dodo IS, come era l'architettura iniziale, come sono emersi nuovi moduli e quali problemi hanno costretto a effettuare modifiche su larga scala.<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il 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 \u00abCos'\u00e8 Dodo IS?\u00bb parler\u00e0 di:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>Il primo monolite in Dodo IS (2011-2015). (You are here)<\/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 client: facciata sopra il database (2016-2017). (In progress\u2026)<\/p>\n<\/li>\n<li>\n<p>Storia dei veri microservizi. (2018-2019). (In progress\u2026)<\/p>\n<\/li>\n<li>\n<p>La conclusione della suddivisione del monolite e la stabilizzazione dell'architettura. (In progress\u2026)<\/p>\n<\/li>\n<\/ol>\n<h3>Architettura iniziale<\/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: il 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 l'accettazione 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>si occupa parallelamente di raccogliere le informazioni sull\u2019ordine nell'interfaccia di ricezione degli ordini: vengono considerati i dati del cliente, le informazioni sui dettagli dell'ordine, e l'indirizzo di consegna.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>L'interfaccia del sistema informativo appariva all'incirca 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 per il ristorante di pizza Dodo Pizza Delivery<\/a><\/noindex><\/p>\n<p>Le risorse per lo sviluppo del primo modulo di ricezione degli ordini erano limitate. Bisognava fare molte cose, rapidamente e con pochi membri. Un piccolo team \u2013 composto da 2 sviluppatori \u2013 che ha posto le basi per l'intero sistema futuro.<\/p>\n<p>La loro prima soluzione ha determinato il futuro stack tecnologico:<\/p>\n<ul>\n<li>\n<p>Backend in ASP.NET MVC, linguaggio C#. Gli sviluppatori erano familiarizzati con .NET, quindi questo stack era loro noto e gradito. <\/p>\n<\/li>\n<li>\n<p>Frontend in Bootstrap e JQuery: interfacce utente con stili e script personalizzati.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Database MySQL: senza costi di licenza, facile da usare.<\/p>\n<\/li>\n<li>\n<p>Server su Windows Server, poich\u00e9 .NET all'epoca funzionava solo su Windows (Non discuteremo di Mono).<\/p>\n<\/li>\n<\/ul>\n<p>Fisicamente, tutto ci\u00f2 si traduceva in un 'dedicato dal provider'.&nbsp;<\/p>\n<h4>Architettura dell'applicazione per la ricezione degli ordini<\/h4>\n<p>A quel punto si parlava gi\u00e0 di microservizi, mentre l'SOA era utilizzato da circa 5 anni nei grandi progetti; ad esempio, WCF \u00e8 stato rilasciato nel 2006. Ma allora si scelse una soluzione affidabile e collaudata.<\/p>\n<p>Ecco.<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il 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 una pagina HTML con rendering sul server su richiesta da un modulo o da un client. Sul client, CSS e script JS visualizzano le informazioni e, se necessario, eseguono richieste AJAX tramite JQuery.<\/p>\n<p>Le richieste al server vengono gestite nelle classi *Controller, dove si svolge l'elaborazione e la generazione della pagina HTML finale. I controller fanno richieste al livello di logica, chiamato *Services. Ognuno di questi servizi risponde a uno specifico aspetto del business:<\/p>\n<ul>\n<li>\n<p>Ad esempio, il DepartmentStructureService forniva informazioni sulle pizzerie e sui dipartimenti. Un dipartimento \u00e8 un gruppo di pizzerie sotto la gestione di un franchisee.<\/p>\n<\/li>\n<li>\n<p>Il ReceivingOrdersService accettava e calcolava la composizione dell'ordine.<\/p>\n<\/li>\n<li>\n<p>E il SmsService inviava messaggi SMS, chiamando i servizi API per l'invio degli SMS.<\/p>\n<\/li>\n<\/ul>\n<p>I servizi elaboravano i dati dal database, gestivano la logica aziendale. Ogni servizio aveva uno o pi\u00f9 *Repository con un nome corrispondente. In questi erano gi\u00e0 presenti le query per le stored procedure nel database e il livello dei mapper. Nelle stored procedure c'era la logica aziendale, soprattutto in quelle che restituivano dati di report. Non \u00e8 stato utilizzato ORM, tutti si affidavano a SQL scritto a mano.&nbsp;<\/p>\n<p>C'era anche uno strato di modello di dominio e classi helper generali, ad esempio, la classe Order, che conservava l'ordine. L\u00ec, nello strato, si trovava anche un helper per la conversione del testo di visualizzazione in base alla valuta selezionata.<\/p>\n<p>Tutto questo pu\u00f2 essere rappresentato da un modello: <\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Il percorso dell'ordine<\/h4>\n<p>Consideriamo un percorso iniziale semplificato per la creazione di un tale ordine.<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Inizialmente, il sito era statico. Conteneva i prezzi, con un numero di telefono e la scritta 'Vuoi una pizza? Chiama il numero e ordina' in cima. Per effettuare un ordine, dobbiamo implementare un semplice flusso:&nbsp;<\/p>\n<ul>\n<li>\n<p>Il cliente visita il sito statico con i prezzi, seleziona i prodotti e chiama il numero indicato sul sito.<\/p>\n<\/li>\n<li>\n<p>Il cliente elenca i prodotti che desidera aggiungere all'ordine.<\/p>\n<\/li>\n<li>\n<p>Fornisce il proprio indirizzo e 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-operator pu\u00f2 accettare un solo ordine alla volta. Pertanto, il carrello draft pu\u00f2 essere memorizzato nella sua sessione (la sessione dell'utente \u00e8 conservata in memoria). Qui troviamo un oggetto Cart, in cui sono presenti 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. Le informazioni sul prodotto vengono recuperate dal database e aggiunte al carrello.<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il 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 non \u00e8 necessario estrarre il prodotto dal database, ma si possono inviare le informazioni direttamente dal frontend. Tuttavia, per chiarezza, ho mostrato il percorso dal database.&nbsp;<\/p>\n<p>Dopo introduciamo l'indirizzo e il nome del cliente.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quando si clicca su \"Crea ordine\":<\/p>\n<ul>\n<li>\n<p>Inviare la richiesta a OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>Otteniamo il carrello dalla sessione, dove ci sono i prodotti nella quantit\u00e0 necessaria.<\/p>\n<\/li>\n<li>\n<p>Completiamo il carrello 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 l'ordine, il contenuto dell'ordine e il cliente, tutte collegate tra loro.<\/p>\n<\/li>\n<li>\n<p>L'interfaccia di visualizzazione dell'ordine persegue e recupera gli ultimi ordini e li riflette.<\/p>\n<\/li>\n<\/ul>\n<h4>Nuovi moduli<\/h4>\n<p>\u041f\u0440\u0438\u0435\u043c \u0437\u0430\u043a\u0430\u0437\u0430 \u0431\u044b\u043b \u0432\u0430\u0436\u0435\u043d \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c. \u041d\u0435\u043b\u044c\u0437\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441 \u043f\u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u043f\u0438\u0446\u0446\u044b, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u043f\u0440\u0438\u0435\u043c\u0430 \u0437\u0430\u043a\u0430\u0437\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u0436\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u0440\u0430\u0441\u0442\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u2014&nbsp;\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441 2012 \u043f\u043e 2015 \u0433\u043e\u0434\u0430. \u0417\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0431\u0443\u0434\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c <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 commerciale comune. Fisicamente, si trovano all'interno di un'unica applicazione.<\/p>\n<p>I moduli possono essere considerati come dei blocchi di sistema. Ad esempio, ci sono il modulo report, le interfacce dell'admin panel, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>il tracker dei prodotti in cucina<\/u><\/a><\/noindex>, e l'autenticazione. Questi rappresentano interfacce diverse per l'utente, alcune delle quali hanno persino stili visivi differenti. Tuttavia, sono tutte parte di una stessa applicazione, di un unico processo operativo.&nbsp;<\/p>\n<p>Tecnicamente, i moduli erano strutturati come Area (quest'idea \u00e8 rimasta anche in <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>). \u0422\u0430\u043c \u0431\u044b\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430, \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0432\u043e\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438\u0437 \u0442\u0430\u043a\u043e\u0439&#8230;<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il 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: il monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Alcuni moduli sono implementati da siti web separati (progetto eseguibile) a causa di funzionalit\u00e0 completamente distinte e parzialmente a causa di uno sviluppo pi\u00f9 mirato. Questi sono:<\/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>la prima versione<\/u><\/a><\/noindex> del sito dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Esportazione<\/strong>: esportazione di report da Dodo IS per 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Personal<\/strong> \u2014 l'area personale dell'impiegato. Sviluppato separatamente, ha il proprio punto di accesso e un design unico.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 progetto per l'hosting della staticit\u00e0. Successivamente, ci siamo allontanati da esso, trasferendo tutta la staticit\u00e0 su CDN Akamai.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Altri blocchi si trovavano nell'app BackOffice.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Spiegazione sui nomi:<\/p>\n<ul>\n<li>\n<p>Cashier \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 mettere prodotti nella 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 funzioni per impostare la pizzeria, le sue promozioni bonus, gestire e lavorare con i dipendenti, report.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 interfacce per televisori e tablet, appesi nelle pizzerie. Nei televisori vengono visualizzati il menu, le informazioni pubblicitarie, lo stato dell'ordine al momento dell'emissione.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Hanno utilizzato uno strato di servizi condivisi, un blocco comune di classi di dominio Dodo.Core, oltre a un database condiviso. A volte potevano anche comunicare tra loro. Compresi i servizi comuni, anche i singoli siti, come dodopizza.ru o personal.dodopizza.ru, vi accedevano.<\/p>\n<p>Quando emergevano nuovi moduli, cercavano di riutilizzare il codice gi\u00e0 creato per i servizi, le procedure memorizzate e le tabelle nel database il pi\u00f9 possibile.&nbsp;<\/p>\n<p>Per una migliore comprensione dell'entit\u00e0 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: il 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 degli ordini \u00e8 diventata un blocco separato del Centro Contatti, dove l'ordine viene preso dall'operatore.<\/p>\n<\/li>\n<li>\n<p>Sono apparsi schermi pubblici con men\u00f9 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\" quando arriva un nuovo ordine e stampa la bolla di consegna per il corriere. Questo semplifica notevolmente i processi in cucina, consentendo ai dipendenti di non distrarsi con un gran numero di operazioni semplici.<\/p>\n<\/li>\n<li>\n<p>Il blocco delle consegne \u00e8 diventato un'area separata di Cassa Consegna, dove l'ordine veniva fornito al corriere, il quale si era precedentemente presentato. Il suo orario di lavoro veniva considerato per il calcolo della retribuzione.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Parallelamente, dal 2012 al 2015 sono emersi oltre 10 sviluppatori, sono state aperte 35 pizzerie, il sistema \u00e8 stato implementato in Romania e sono state preparate le aperture negli Stati Uniti. Gli sviluppatori non si occupavano pi\u00f9 di tutti i compiti, ma erano divisi in team, ognuno specializzato nella propria parte del sistema.&nbsp;<\/p>\n<h3>Problemi<\/h3>\n<p>Questo anche a causa dell'architettura (ma non solo).<\/p>\n<h4>Caos nel database<\/h4>\n<p>Un unico database \u00e8 comodo. Permette di raggiungere la coerenza, grazie agli strumenti integrati nei database relazionali. Lavorare con esso \u00e8 familiare e conveniente, soprattutto se ci sono poche tabelle e pochi dati.<\/p>\n<p>Tuttavia, dopo 4 anni di sviluppo, nel database erano presenti circa 600 tabelle e 1500 procedure memorizzate, molte delle quali contenevano anche logica. Purtroppo, le procedure memorizzate non offrono vantaggi significativi quando si lavora con MySQL. Non vengono memorizzate nella cache dal database e l'inserimento di logica al loro interno complica lo sviluppo e il debug. Anche il riutilizzo del codice \u00e8 difficoltoso.<\/p>\n<p><strong>Molte tabelle non avevano indici appropriati.<\/strong>, a volte, al contrario, c'erano moltissimi indici, il che rendeva difficile l'inserimento. Era necessario modificare circa 20 tabelle \u2014 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 adeguata.<\/strong>. In alcuni casi era necessario effettuare una denormalizzazione. Parte dei dati ottenuti regolarmente era in una colonna sotto forma di struttura XML, il che aumentava i tempi di esecuzione, allungava le query e complicava lo sviluppo.<\/p>\n<p>Alle stesse tabelle venivano effettuate molte <strong>richieste eterogenee.<\/strong>. Soprattutto le tabelle pi\u00f9 popolari, come quella menzionata <em>orders<\/em> o la tabella <em>pizzeria<\/em>. Venivano utilizzate per visualizzare interfacce operative in cucina, per analisi. Inoltre, il sito<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>, poteva ricevere improvvisamente molte richieste in qualsiasi momento.&nbsp;<\/p>\n<p><strong>I dati non erano aggregati<\/strong> e molti calcoli avvenivano on-the-fly tramite il database. Questo creava calcoli superflui e un carico aggiuntivo.&nbsp;<\/p>\n<p>Spesso il codice si collegava al database quando poteva evitare di farlo. A volte mancavano operazioni bulk, altre volte era necessario suddividere una richiesta in pi\u00f9 attraverso il codice per accelerare e aumentare l'affidabilit\u00e0.&nbsp;<\/p>\n<h4>Coerenza e complessit\u00e0 nel codice<\/h4>\n<p><strong>I moduli che avrebbero dovuto occuparsi della propria area di business non lo facevano in modo onesto<\/strong>. Alcuni di essi avevano duplicazioni nelle funzionalit\u00e0 per i ruoli. Ad esempio, un marketer locale responsabile dell'attivit\u00e0 di marketing della rete nella propria citt\u00e0 doveva utilizzare sia l'interfaccia 'Admin' (per creare promozioni) sia l'interfaccia 'Office Manager' (per visualizzare l'impatto delle promozioni sul business). Naturalmente, internamente entrambi i moduli utilizzavano lo stesso servizio che gestiva le promozioni bonificate.<\/p>\n<p>I servizi (classi all'interno di un unico 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 procedeva in modi diversi<\/strong>. C'erano dei costruttori attraverso i quali si potevano specificare i campi obbligatori. In altri casi, ci\u00f2 avveniva tramite propriet\u00e0 pubbliche. Certamente, l'acquisizione e la trasformazione dei dati dal database erano variabili.&nbsp;<\/p>\n<p><strong>La logica era nei controller o nelle classi dei servizi.<\/strong>&nbsp;<\/p>\n<p>Questi possono sembrare problemi insignificanti, ma rallentavano notevolmente lo sviluppo e riducevano la qualit\u00e0, portando a instabilit\u00e0 e errori.&nbsp;<\/p>\n<h4>La complessit\u00e0 dello sviluppo su larga scala<\/h4>\n<p><strong>Le difficolt\u00e0 si sono presentate anche nella stessa fase di sviluppo<\/strong>. Era necessario realizzare diversi blocchi del sistema, e farlo in parallelo. Soddisfare le esigenze di ogni componente in un unico codice diventava sempre pi\u00f9 difficile. Non era semplice raggiungere un accordo e soddisfare tutti i componenti contemporaneamente. A ci\u00f2 si aggiungevano le limitazioni tecnologiche, in particolare riguardo al backend e al frontend. Era necessario rinunciare a jQuery in favore di framework di alto livello, soprattutto per quanto riguarda i servizi client (sito web).<\/p>\n<p><strong>In alcune parti del sistema potrebbero essere utilizzati database pi\u00f9 adatti a questo scopo<\/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>\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u0432\u043e\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u044f\u0432\u043d\u043e \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u0430\u043a \u0432 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0430\u043a \u0438 \u0432 \u0447\u0430\u0441\u0442\u0438 \u0432\u044b\u043a\u0430\u0442\u043a\u0438. \u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u043f\u0440\u0438 \u043c\u0435\u0440\u0436\u0435, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u0438 \u0440\u0435\u043b\u0438\u0437\u0430\u0445. \u0415\u0441\u043b\u0438 \u0434\u043b\u044f 5 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u044d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430, \u0442\u043e \u043f\u0440\u0438 10, \u0430 \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435&nbsp; \u043f\u0440\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u0440\u043e\u0441\u0442\u0435, \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u0431\u044b \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0435\u0435. \u0410 \u0430 \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043e\u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0430\u043d\u0443\u043b\u0430 \u0432 2017, \u0430 \u0432 2018 \u0431\u044b\u043b\u043e <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 potevamo garantirlo. Un errore nello sviluppo di una nuova funzionalit\u00e0 nell'interfaccia di amministrazione poteva facilmente influire sulla ricezione degli ordini sul sito, dato che il codice \u00e8 comune e riutilizzabile, cos\u00ec come il database e i dati.<\/p>\n<p>Probabilmente, all'interno di un'architettura monolitica-modulare si sarebbero potuti evitare questi errori e problemi: separare le responsabilit\u00e0, eseguire il refactoring sia del codice che del database, mantenere una chiara separazione dei layer e controllare la qualit\u00e0 ogni giorno. Tuttavia, le scelte architettoniche adottate e il focus sull'espansione rapida delle funzionalit\u00e0 del sistema hanno portato a problemi di stabilit\u00e0.<\/p>\n<h4>Come il blog Sila u ma ha incaricato le casse nei ristoranti<\/h4>\n<p>Se la crescita della rete di pizzerie (e il carico) fosse continuata allo stesso ritmo, dopo un po' ci sarebbero stati dei crolli tali che il sistema non sarebbe pi\u00f9 stato in grado di riprendersi. Una storia come questa illustra bene i problemi con cui abbiamo iniziato a confrontarci verso il 2015.&nbsp;<\/p>\n<p>Nel blog \u201c<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>Sila u ma<\/u><\/a><\/noindex>\u201d c'era un widget che mostrava i dati sulle entrate annuali dell'intera rete. Il widget si collegava a un'API pubblica di Dodo, che fornisce questi dati. Attualmente, queste statistiche sono disponibili su <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. Il widget veniva visualizzato su ogni pagina e effettuava richieste ogni 20 secondi. La richiesta andava su 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 totale delle entrate della rete dall'inizio dell'anno;<\/p>\n<\/li>\n<li>\n<p>le entrate di oggi.<\/p>\n<\/li>\n<\/ul>\n<p>La richiesta di statistiche sui ricavi veniva inviata direttamente al database, iniziando a raccogliere i dati sugli ordini, aggregando i dati in tempo reale e restituendo il totale.&nbsp;<\/p>\n<p>Nella stessa tabella degli ordini venivano caricati i registratori di cassa nei ristoranti, scaricando l'elenco degli ordini accettati per oggi, e venivano aggiunti nuovi ordini. I registratori effettuavano le loro richieste ogni 5 secondi o al momento dell'aggiornamento della pagina.<\/p>\n<p>Lo schema era il seguente:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Un giorno d'autunno, F\u00ebdor Ov\u010dinnikov scrisse un lungo e popolare articolo sul suo blog. Il blog ricevette molte visite e le persone iniziarono a leggere attentamente. Mentre ogni persona presente leggevano l'articolo, il widget dei ricavi funzionava correttamente, richiedendo l'API ogni 20 secondi.<\/p>\n<p>L'API chiamava una procedura memorizzata per calcolare il totale di tutti gli ordini dall'inizio dell'anno per tutte le pizzerie della rete. L'aggregazione avveniva sulla tabella orders, molto popolare. Anche tutti i registratori di cassa dei ristoranti aperti in quel momento accedevano a essa. I registratori smisero di rispondere, gli ordini non venivano accettati. Inoltre, non erano accettati dal sito, non apparivano nel tracker, e il manager del turno non poteva vederli nella sua interfaccia.&nbsp;<\/p>\n<p>Questa non \u00e8 l'unica storia. Entro l'autunno del 2015, il carico sul sistema era critico ogni venerd\u00ec. Diverse volte abbiamo dovuto disattivare l'API pubblica e un giorno, siamo stati costretti a spegnere il sito perch\u00e9 nulla sembrava funzionare. Esisteva anche una lista di servizi con l'ordine di disattivazione in caso di carichi gravi.<\/p>\n<p>Da questo momento inizia la nostra battaglia contro i carichi e per la stabilizzazione del sistema (dalla primavera 2015 all'autunno 2018). \u00c8 proprio in quel periodo che si \u00e8 verificato \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Il Grande Crollo<\/u><\/a><\/noindex>\". Anche in seguito ci sono stati alcuni guasti, alcuni dei quali erano piuttosto critici, ma ora possiamo considerare che il periodo generale di instabilit\u00e0 sia superato.<\/p>\n<h4>Crescita rapida del business<\/h4>\n<p>Perch\u00e9 non si poteva \"fare tutto bene fin dall'inizio\"? \u00c8 sufficiente dare un'occhiata ai seguenti grafici.<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il monolite iniziale\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nel 2014-2015 c'\u00e8 stata anche un'apertura in Romania e si stava preparando l'apertura negli Stati Uniti.<\/p>\n<p>La rete \u00e8 cresciuta molto rapidamente, nuove nazioni si sono aperte, sono emersi nuovi formati di pizzerie, ad esempio, \u00e8 stata aperta una pizzeria nel food court. Tutto questo ha richiesto una grande attenzione all'espansione delle funzionalit\u00e0 di Dodo IS. Senza tutte queste funzionalit\u00e0, senza il tracciamento in cucina, la gestione delle scorte e delle perdite nel sistema, e la visualizzazione degli ordini nella sala del food court, difficilmente staremmo discutendo di una \u00abcorretta\u00bb architettura e di un \u00abapproccio giusto\u00bb nello sviluppo.<\/p>\n<p>Un altro ostacolo alla revisione tempestiva dell'architettura e alla considerazione dei problemi tecnici \u00e8 stato la crisi del 2014. Tali eventi colpiscono duramente le possibilit\u00e0 di crescita dei team, soprattutto per una giovane azienda come Dodo Pizza.<\/p>\n<h3>Soluzioni rapide che hanno aiutato<\/h3>\n<p>I problemi richiedevano soluzioni. Condizionatamente, le soluzioni possono essere suddivise in 2 gruppi:<\/p>\n<ul>\n<li>\n<p>Rapide, che spengono il fuoco e forniscono un piccolo margine di sicurezza, guadagnando tempo per le modifiche.<\/p>\n<\/li>\n<li>\n<p>Sistemiche e, quindi, pi\u00f9 lunghe. Il re-engineering di vari moduli, la separazione dell'architettura monolitica in servizi separati (la maggior parte di essi sono piuttosto macro-servizi piuttosto che micro-servizi, e su questo c'\u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>la relazione di Andrey Morevsky<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>L'elenco asciutto delle modifiche \u00e8 il seguente:<\/p>\n<h4>Master della scalabilit\u00e0<\/h4>\n<p>Naturalmente, la prima azione intrapresa per affrontare i carichi di lavoro \u00e8 stata quella di aumentare la potenza del server. Questo \u00e8 stato fatto per il master e per i server web. Purtroppo, ci\u00f2 \u00e8 possibile solo fino a un certo limite, oltre il quale diventa troppo costoso.<\/p>\n<p>Dal 2014 siamo passati ad Azure, su questo tema 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. Tuttavia, dopo una serie di aumenti del server per il database, ci siamo trovati a dover affrontare i costi.&nbsp;<\/p>\n<h4>Repliche del database per la lettura<\/h4>\n<p>Abbiamo creato due repliche per il database:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>per le richieste di riferimento<\/strong>. Viene utilizzata per la lettura di riferimento, come citt\u00e0, strade, pizzerie, prodotti (dominio lentamente cambiato), e in quelle interfacce dove \u00e8 consentito un leggero ritardo. Queste repliche erano due, assicuravamo la loro disponibilit\u00e0 proprio come quella del master.<\/p>\n<p><strong>ReadReplica per le richieste di report<\/strong>. Questa replica aveva una disponibilit\u00e0 inferiore, ma tutti i report vi accedevano. Anche se le loro richieste sono pesanti per enormi rielaborazioni dei dati, non influenzano il database principale e le interfacce operative.&nbsp;<\/p>\n<h4>Cache nel codice<\/h4>\n<p>Non c'erano cache nel codice (affatto). Questo portava a richieste aggiuntive, non sempre necessarie, a un database sovraccarico. Le cache erano inizialmente sia in memoria che in un servizio di cache esterno, che era Redis. Tutto veniva invalidato nel tempo, le impostazioni erano definite nel codice.<\/p>\n<h4>Diversi server per il backend<\/h4>\n<p>Anche il backend dell'applicazione doveva essere scalato per sopportare carichi maggiori. Era necessario creare un cluster da un singolo server IIS. Abbiamo migrato <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>la sessione delle applicazioni<\/u><\/a><\/noindex> da memoria a RedisCache, il che ha permesso di avere diversi server dietro un semplice bilanciatore di carico con round robin. Inizialmente veniva utilizzato lo stesso Redis usato per le cache, poi \u00e8 stato distribuito su pi\u00f9 server.&nbsp;<\/p>\n<p>Di conseguenza, l'architettura si \u00e8 complicata\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il 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 rifare i componenti sovraccarichi, e questo \u00e8 ci\u00f2 su 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 4.9.10 - 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. \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 \u0442\u0430\u043a\u043e\u043c\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) 4.9.10\" \/>\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. \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 \u0442\u0430\u043a\u043e\u043c\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":"Ogni azienda infelice con un monolite \u00e8 infelice a modo suo. Sviluppo del sistema Dodo IS \u00e8 iniziato subito dopo l'inizio dell'attivit\u00e0 di Dodo Pizza, nel 2011. L'idea alla base era quella di una digitalizzazione completa e totale dei processi aziendali, realizzata con le proprie forze, il che gi\u00e0 nel 2011 sollevava molte domande e scetticismi. Ma sono gi\u00e0 9 anni che stiamo percorrendo questa strada.","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. \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 \u0442\u0430\u043a\u043e\u043c\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"},"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}]}}