{"id":95786,"date":"2020-10-03T13:42:12","date_gmt":"2020-10-03T11:42:12","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-put-bekofisa"},"modified":"2020-10-03T13:42:12","modified_gmt":"2020-10-03T11:42:12","slug":"istoriya-arhitektury-dodo-is-put-bekofisa","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-put-bekofisa","title":{"rendered":"Storia dell'architettura Dodo IS: il percorso del back office","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Habr sta cambiando il mondo. Da oltre un anno gestiamo il nostro blog. Circa sei mesi fa abbiamo ricevuto un feedback del tutto sensato da parte degli utenti di Habr: \u00abDodo, dite sempre di avere un vostro sistema. Qual \u00e8 questo sistema? E a cosa serve nella rete delle pizzerie?\u00bb. <\/p>\n<p>Ci siamo seduti, abbiamo riflettuto e capito che avevate ragione. Cerchiamo di spiegare tutto in modo semplice, ma risulta frammentario e non c'\u00e8 una descrizione completa del sistema. Cos\u00ec ha avuto inizio un lungo viaggio di raccolta di informazioni, ricerca di autori e scrittura di una serie di articoli su Dodo IS. Iniziamo!<\/p>\n<blockquote><p><i>Ringraziamenti: grazie per condividere il vostro feedback con noi. Grazie a voi abbiamo finalmente descritto il sistema, elaborato un tech radar e presto presenteremo una grande descrizione dei nostri processi. Senza di voi, avremmo continuato a tergiversare per altri 5 anni. <\/i><\/p><\/blockquote>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/dcfd06b2ec1544e1e19994d60e9594ac.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>La serie di articoli \u00abCos'\u00e8 Dodo IS?\u00bb parler\u00e0 di:<\/b><\/p>\n<ol>\n<li>\u0420\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u0432 Dodo IS (2011-2015 \u0433\u043e\u0434\u044b). (In progress&#8230;)<\/li>\n<li>Il percorso del back office: database separati e bus. (You are here)<\/li>\n<li>\u041f\u0443\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438: \u0444\u0430\u0441\u0430\u0434 \u043d\u0430\u0434 \u0431\u0430\u0437\u043e\u0439 (2016-2017 \u0433\u043e\u0434\u044b). (In progress&#8230;)<\/li>\n<li>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. (2018-2019 \u0433\u043e\u0434\u044b). (In progress&#8230;)<\/li>\n<li>\u0417\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0441\u043f\u0438\u043b \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. (In progress&#8230;)<\/li>\n<\/ol>\n<p>\n<b>Se ti interessa sapere qualcosa in pi\u00f9, scrivi nei commenti. <\/b><\/p><\/blockquote>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Opinione sull'argomento descritto cronologicamente dall'autore<\/b><br \/>\n                        Regolarmente conduco un incontro per i nuovi assunti sul tema 'Architettura del sistema'. Noi la chiamiamo 'Introduzione all'Architettura del Dodo IS' ed \u00e8 parte del processo di onboarding dei nuovi sviluppatori. Parlando, in un modo o nell'altro, della nostra architettura e delle sue peculiarit\u00e0, ho sviluppato un certo approccio storico alla descrizione. <\/p>\n<p>Tradizionalmente, consideriamo il sistema come un insieme di componenti (tecnici o pi\u00f9 astratti), moduli di business che interagiscono tra loro per raggiungere un obiettivo. E se per la progettazione questo punto di vista \u00e8 giustificato, per la descrizione e la comprensione non \u00e8 del tutto appropriato. Le ragioni di questo sono molteplici:<\/p>\n<ul>\n<li>La realt\u00e0 \u00e8 diversa da ci\u00f2 che \u00e8 sulla carta. Non tutto ci\u00f2 che \u00e8 previsto viene realizzato. Ci interessa come si presenta e funziona realmente. <\/li>\n<li>Esposizione sequenziale delle informazioni. In sostanza, si pu\u00f2 procedere cronologicamente dall'inizio fino allo stato attuale. <\/li>\n<li>Dalla semplicit\u00e0 alla complessit\u00e0. Non \u00e8 universale, ma nel nostro caso \u00e8 proprio cos\u00ec. Dalle soluzioni pi\u00f9 semplici, l'architettura \u00e8 passata a quelle pi\u00f9 complesse. Spesso l'aumento della complessit\u00e0 ha risolto problemi di velocit\u00e0 di implementazione e stabilit\u00e0, oltre a decine di altre caratteristiche della lista dei requisiti non funzionali (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=6m4XPje76WU\">qui<\/a><\/noindex> viene ben spiegato il confronto tra complessit\u00e0 e altri requisiti).<\/li>\n<\/ul>\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 percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/3f447154d2d7e7323806f11aeec88e98.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nel 2020 \u00e8 diventata un po' pi\u00f9 complessa e ha assunto questa forma:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/407b5fead36d6d6d39ab14ea5edcdd5b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCome \u00e8 avvenuta questa evoluzione? Perch\u00e9 sono necessarie diverse parti del sistema? Quali decisioni architetturali sono state prese e perch\u00e9? Analizzeremo tutto in questa serie di articoli. <\/p>\n<h2>I primi problemi del 2016: perch\u00e9 i servizi devono uscire dal monolite<\/h2>\n<p>\nI primi articoli del ciclo parleranno dei servizi che si sono separati per primi dal monolite. Per introdurvi al contesto, racconter\u00f2 quali problemi abbiamo riscontrato nel nostro sistema all'inizio del 2016 e cosa abbiamo dovuto affrontare per separare i servizi.<\/p>\n<p><b>Un'unica base MySql, in cui tutte le applicazioni esistenti in quel momento in Dodo IS scrivevano i propri record.<\/b> Le conseguenze sono state le seguenti:<\/p>\n<ul>\n<li>Un carico elevato (con l'85% delle richieste dedicate alla lettura). <\/li>\n<li>La base si \u00e8 ampliata. A causa di ci\u00f2, il suo costo e il supporto sono diventati problematici.<\/li>\n<li>Punto di fallimento unico. Se un'applicazione che scrive nella base iniziava improvvisamente a farlo pi\u00f9 attivamente, le altre applicazioni ne avvertivano l'impatto.<\/li>\n<li>Inefficienza nel storage e nelle query. Spesso i dati erano memorizzati in una certa struttura che era comoda per alcuni scenari, ma non adatta per altri. Gli indici acceleravano alcune operazioni, ma potevano rallentarne delle altre.<\/li>\n<li>Parte dei problemi \u00e8 stata attenuata da cache affrettate e replica read dei database (di questo parleremo in un altro articolo), ma hanno solo permesso di guadagnare tempo e non risolvevano il problema in modo fondamentale.<\/li>\n<\/ul>\n<p>\n<b>Il problema era la presenza stessa del monolito.<\/b>Le conseguenze furono le seguenti:<\/p>\n<ul>\n<li>Rilascio unico e raro.<\/li>\n<li>Difficolt\u00e0 nella collaborazione di un gran numero di persone.<\/li>\n<li>Impossibilit\u00e0 di introdurre nuove tecnologie, nuovi framework e librerie. <\/li>\n<\/ul>\n<p>\nI problemi con il database e il monolito sono stati descritti molte volte, ad esempio nel contesto dei guasti all'inizio del 2018 (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/455264\/\">Sii come Munk, o qualche parola sul debito tecnico.<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/461081\/\">Il giorno in cui Dodo IS si \u00e8 fermato. Scenari asincroni.<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\">La storia dell'uccello Dodo della famiglia dei Fenici. La grande caduta di Dodo IS.<\/a><\/noindex>), quindi non mi soffermer\u00f2 troppo. Vorrei solo sottolineare che volevamo offrire una maggiore flessibilit\u00e0 nello sviluppo dei servizi. Ci\u00f2 riguardava in particolare quelli che erano i pi\u00f9 impegnati e fondamentali dell'intero sistema: Auth e Tracker.<\/p>\n<h2>Il percorso del back office: database separati e bus<\/h2>\n<p><\/p>\n<blockquote><p><b>Navigazione del capitolo<\/b><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"#Q0\">Schema del monolite del 2016<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q1\">Iniziamo a sgravare il monolite: separazione di Auth e Tracker<br \/>\n<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q2\">Cosa fa Auth<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q3\">Da dove provengono i carichi?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q4\">Sgraviamo Auth<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q5\">Cosa fa Tracker<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q6\">Da dove provengono i carichi?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q4\">Sgraviamo Tracker<\/a><\/noindex><\/li>\n<\/ol>\n<\/blockquote>\n<p>\n<noindex><a rel=\"nofollow\" name=\"Q0\"><\/a><\/noindex><\/p>\n<h4>Schema del monolite del 2016<\/h4>\n<p>\nDi fronte a voi ci sono i principali blocchi del monolite Dodo IS del 2016, e un po' pi\u00f9 in basso la descrizione delle loro principali funzioni. <br \/>\n<img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/25ae104d94957aebbbab6d54ebb62f5e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Cassa della Consegna.<\/b> Gestione dei fattorini, assegnazione degli ordini ai fattorini.<br \/>\n<b>Centro Contatti<\/b>. Accettazione degli ordini tramite operatore. <br \/>\n<b>Sito<\/b>. I nostri siti (dodopizza.ru, dodopizza.co.uk, dodopizza.by, ecc.).<br \/>\n<b>Auth<\/b>. Servizio di autorizzazione e autenticazione per il back office.<br \/>\n<b>Tracker<\/b>. Tracker degli ordini in cucina. Servizio di registrazione degli stati di prontezza durante la preparazione dell'ordine. <br \/>\n<b>Cassa del Ristorante<\/b>. Accettazione degli ordini nel ristorante, interfacce del cassiere.<br \/>\n<b>Esportazione<\/b>. Esportazione dei rapporti in 1C per la contabilit\u00e0.<br \/>\n<b>Avvisi e bolle di accompagnamento<\/b>. Comandi vocali in cucina (ad esempio, 'Nuova pizza ricevuta') + stampa delle bolle di accompagnamento per i fattorini.<br \/>\n<b>Manager di Turno<\/b>. Interfacce per la gestione del shift manager: elenco ordini, grafici delle prestazioni, output per il turno del personale. <br \/>\n<b>Manager dell'Ufficio<\/b>. Interfacce per i franchisee e il gestore: assunzione dei dipendenti, report sulle operazioni della pizzeria.<br \/>\n<b>Dashboard del Ristorante<\/b>. Visualizzazione del menu su televisori nelle pizzerie.<br \/>\n<b>Pannello di Amministrazione<\/b>. Impostazioni per una specifica pizzeria: menu, prezzi, contabilit\u00e0, codici promozionali, campagne, banner per il sito, ecc.<br \/>\n<b>Area Personale del Dipendente<\/b>. Turni di lavoro dei dipendenti, informazioni sui dipendenti.<br \/>\n<b>Dashboard di Motivazione della Cucina<\/b>. Schermo separato che si trova in cucina e mostra la velocit\u00e0 di lavoro dei pizzaioli.<br \/>\n<b>Comunicazione<\/b>. Invio di sms ed email.<br \/>\n<b>FileStorage<\/b>. Servizio proprietario per ricevere e fornire file statici.<\/p>\n<p>I primi tentativi di risolvere i problemi ci hanno aiutato, ma si sono rivelati solo una pausa temporanea. Non sono diventati soluzioni sistemiche, quindi era chiaro che dovevamo fare qualcosa con i database. Ad esempio, separare il database generale in pi\u00f9 specialistici. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q1\"><\/a><\/noindex><\/p>\n<h4>Iniziamo a sgravare il monolite: separazione di Auth e Tracker<\/h4>\n<p>\nPrincipali servizi che in quel periodo registravano e leggevano di pi\u00f9 dal database:<\/p>\n<ol>\n<li>Auth. Servizio di autorizzazione e autenticazione per il back-office.<\/li>\n<li>Tracker. Tracker degli ordini in cucina. Servizio di marcatura degli stati di preparazione durante la creazione dell'ordine. <\/li>\n<\/ol>\n<p>\n<noindex><a rel=\"nofollow\" name=\"Q2\"><\/a><\/noindex><\/p>\n<h4>Cosa fa Auth<\/h4>\n<p>\nAuth \u00e8 il servizio attraverso il quale gli utenti effettuano il login nel back office (del cliente \u00e8 previsto un ingresso indipendente). Viene anche utilizzato per verificare che ci siano i diritti di accesso necessari e che questi diritti non siano cambiati dall'ultimo accesso. Attraverso di esso avviene anche l'accesso dei dispositivi nelle pizzerie. <\/p>\n<p>Ad esempio, vogliamo aprire su un televisore appeso in sala un display con gli stati degli ordini pronti. Quindi apriamo auth.dodopizza.ru, selezioniamo 'Accesso come dispositivo', appare un codice che pu\u00f2 essere inserito in una pagina speciale sul computer del manager di turno, specificando il tipo di dispositivo. Il televisore acceder\u00e0 automaticamente all'interfaccia corretta della propria pizzeria e inizier\u00e0 a visualizzare i nomi dei clienti i cui ordini sono pronti. <\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/7a246bcbdbf0dcd6af3e21eb1645e9ac.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q3\"><\/a><\/noindex><\/p>\n<h4>Da dove provengono i carichi? <\/h4>\n<p>\nOgni utente autenticato del back office, a ogni richiesta, interroga il database, nella tabella utenti, estrae l'utente tramite una query SQL e verifica se ha i diritti necessari e le autorizzazioni per questa pagina. <\/p>\n<p>Ogni dispositivo fa la stessa cosa, ma con un database di dispositivi, verificando il proprio ruolo e i propri accessi. Un grande numero di richieste al master database porta al suo sovraccarico e al consumo delle risorse del database generale per queste operazioni.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q4\"><\/a><\/noindex><\/p>\n<h4>Sgraviamo Auth<\/h4>\n<p>\nCon Auth, c'\u00e8 un dominio isolato, cio\u00e8 i dati sugli utenti, i logins o i dispositivi arrivano al servizio (che sar\u00e0 futuro) e l\u00ec rimangono. Se qualcuno ha bisogno di queste informazioni, andr\u00e0 a questo servizio per i dati.<\/p>\n<p><b>C'ERA.<\/b> Lo schema di lavoro era inizialmente questo:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/60ca37fb873cb4fff4a30691e9f1ea56.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVorrei chiarire un po' come funzionava:<\/p>\n<ol>\n<li>Una richiesta esterna arriva al backend (l\u00ec Asp.Net MVC), portando con s\u00e9 un cookie di sessione, che viene utilizzato per ottenere i dati di sessione da Redis(1). In esso ci sono informazioni sugli accessi, e allora l'accesso al controller \u00e8 aperto (3,4), oppure no. <\/li>\n<li>Se non ci sono accessi, \u00e8 necessario passare attraverso la procedura di autorizzazione. Qui, per semplificare, \u00e8 mostrata come parte del percorso nello stesso attributo, anche se si tratta di un passaggio alla pagina di login. In caso di scenari positivi, otterremo una sessione correttamente compilata e passeremo al Controller di Backoffice. <\/li>\n<li>Se ci sono dati, \u00e8 necessario verificarli per la loro attualit\u00e0 nel database degli utenti. \u00c8 cambiato il loro ruolo? Devono essere esclusi dalla pagina? In tal caso, dopo aver ottenuto la sessione (1), \u00e8 necessario accedere direttamente al database e controllare i permessi dell'utente tramite il layer di logica di autenticazione (2). Successivamente, si procede o alla pagina di login, o al controller. Un sistema semplice, ma non del tutto standard.<\/li>\n<li>Se tutte le procedure sono state completate, si continua con la logica nei controller e nei metodi. <\/li>\n<\/ol>\n<p>\nI dati degli utenti sono separati da tutti gli altri dati e si trovano in una tabella separata chiamata membership. Le funzioni del layer di logica AuthService possono facilmente diventare metodi API. I confini del dominio sono chiaramente definiti: gli utenti, i loro ruoli, i dati sui permessi, l'assegnazione e la revoca dei permessi. Tutto sembra indicare che si possa creare un servizio separato.<\/p>\n<p><b>\u00c8 FATTO.<\/b> Cos\u00ec abbiamo proceduto:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/3e8629b75ae68b95afa475286d4c5d2c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuesto approccio presenta una serie di problemi. Ad esempio, la chiamata a un metodo all'interno di un processo non \u00e8 la stessa cosa di una chiamata http a un servizio esterno. La latenza, l'affidabilit\u00e0, la manutenibilit\u00e0 e la trasparenza dell'operazione sono completamente diverse. Andrej Morevskij ha parlato in dettaglio di questi problemi nella sua presentazione. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\">\u00ab50 sfumature di microservizi\u00bb<\/a><\/noindex>.<\/p>\n<p>Il servizio di autenticazione e il servizio dispositivi vengono utilizzati per il backend, ovvero per i servizi e le interfacce utilizzate in produzione. L'autenticazione per i servizi client (come il sito web o l'app mobile) avviene separatamente senza utilizzare Auth. La separazione ha preso circa un anno e ora ci stiamo ancora occupando di questo tema, migrando il sistema verso nuovi servizi di autenticazione (con protocolli standard). <\/p>\n<p>                        <b class=\"spoiler_title\">Perch\u00e9 la separazione \u00e8 durata cos\u00ec a lungo?<\/b><br \/>\n                        Lungo il percorso ci sono stati molti problemi che hanno rallentato il processo:<\/p>\n<ol>\n<li>Volevamo trasferire i dati su utenti, dispositivi e autenticazione da database distribuiti nel paese a uno unico. Per questo \u00e8 stato necessario convertire tutte le tabelle e il loro utilizzo da un identificatore int a un identificatore globale UUID (abbiamo recentemente rielaborato questo codice). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=OGK4Lkd6p6s\">Roman Bukin \u00abUuid \u2014 una grande storia di una piccola struttura\u00bb<\/a><\/noindex> e progetto open-source <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dodopizza\/primitives\">Primitives<\/a><\/noindex>). La conservazione dei dati degli utenti (poich\u00e9 si tratta di informazioni personali) ha le sue limitazioni e per alcuni paesi \u00e8 necessario conservarli separatamente. Tuttavia, l'identificatore globale dell'utente deve essere.<\/li>\n<li>Molte tabelle nel database hanno informazioni di audit sull'utente che ha effettuato l'operazione. Questo ha richiesto un meccanismo aggiuntivo per garantire la consistenza.<\/li>\n<li>Dopo la creazione dei servizi api c'\u00e8 stata un lungo e graduale periodo di migrazione a un altro sistema. Le transizioni dovevano avvenire senza interruzioni per gli utenti e richiedevano lavoro manuale.<\/li>\n<\/ol>\n<p>Schema di registrazione del dispositivo nella pizzeria:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/1e054d01de40d63c2994a4d49e47b215.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nArchitettura generale dopo l'isolamento del servizio Auth e Devices:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/069d176197674ef8414981ac98f30704.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><b>Nota<\/b>. Nel 2020 stiamo lavorando a una nuova versione di Auth, che si basa sullo standard di autorizzazione OAuth 2.0. Questo standard \u00e8 piuttosto complesso, ma sar\u00e0 utile per lo sviluppo del servizio di autenticazione end-to-end. Nell'articolo \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/520046\/\">Sottigliezze dell'autorizzazione: panoramica della tecnologia OAuth 2.0<\/a><\/noindex>\u00bb abbiamo cercato di spiegare lo standard in modo semplice e chiaro, per farvi risparmiare tempo nello studio.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q5\"><\/a><\/noindex><\/p>\n<h4>Cosa fa Tracker <\/h4>\n<p>\nOra parliamo del secondo dei servizi sovraccarichi. Il tracker svolge un doppio ruolo:<\/p>\n<ul>\n<li>Da un lato, il suo compito \u00e8 mostrare ai dipendenti in cucina quali ordini sono attualmente in lavorazione e quali prodotti devono essere preparati. <\/li>\n<li>Dall'altro, deve digitalizzare tutti i processi in cucina. <\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/5d13756308ee0cdb6e4000489b6b402d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuando un nuovo prodotto (ad esempio, una pizza) appare nell'ordine, esso entra nella stazione del tracker \u00abStesura\u00bb. In questa stazione c'\u00e8 un pizzaiolo che prende l'impasto della dimensione richiesta e lo stende, dopodich\u00e9 segna sul tablet del tracker di aver completato il suo compito e passa la base stesa alla stazione successiva \u2014 \u00abFarcitura\u00bb. <\/p>\n<p>Qui il prossimo pizzaiolo farcisce la pizza, poi segna sul tablet di aver completato il suo compito e mette la pizza nel forno (questa \u00e8 anche una stazione separata che deve essere registrata sul tablet). Questo sistema \u00e8 stato presente sin dall'inizio in Dodo e fin dall'esistenza di Dodo IS. Consente di monitorare e digitalizzare completamente tutte le operazioni. Inoltre, il tracker suggerisce come preparare ciascun prodotto, guida ogni tipo di prodotto attraverso i propri schemi di preparazione, conserva il tempo di cottura ottimale e tiene traccia di tutte le operazioni sul prodotto. <\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/d745bf6f981c1a5b43e6091b090644ad.png\" style=\"display:block;margin: 0 auto;\" \/><i>Ecco come appare lo schermo del tablet nella stazione del tracker \"Stesura\".<\/i><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q6\"><\/a><\/noindex><\/p>\n<h4>Da dove provengono i carichi? <\/h4>\n<p>\nIn ogni pizzeria ci sono circa cinque tablet con il tracker. Nel 2016 avevamo pi\u00f9 di 100 pizzerie (ora pi\u00f9 di 600). Ogni tablet effettua una richiesta al backend ogni 10 secondi e raccoglie i dati dalla tabella degli ordini (collegamento con il cliente e l'indirizzo), dal contenuto dell'ordine (collegamento con il prodotto e indicazione della quantit\u00e0), e dalla tabella di registrazione delle motivazioni (in cui viene tracciato il tempo di pressione). Quando il pizzaiolo preme sul prodotto nel tracker, viene aggiornato il registro in tutte queste tabelle. La tabella degli ordini \u00e8 condivisa, e contemporaneamente le nuove inserzioni avvengono all'accettazione dell'ordine, aggiornamenti da altre parti del sistema e numerosi accessi, ad esempio, sul televisore che \u00e8 presso la pizzeria e mostra gli ordini pronti ai clienti. <\/p>\n<p>Durante il periodo di gestione dei carichi, quando tutto e tutti venivano memorizzati nella cache e trasferiti su una replica asincrona del database, queste operazioni con il tracker continuavano a essere eseguite sulla master database. Non ci deve essere alcun ritardo, i dati devono essere aggiornati, la dissincronizzazione \u00e8 inaccettabile.<\/p>\n<p>Inoltre, l'assenza di tabelle proprie e indici su di esse non ha permesso di scrivere query pi\u00f9 specifiche, orientate al proprio utilizzo. Ad esempio, per un tracker potrebbe essere utile avere un indice sulla pizzeria nella tabella degli ordini. Estraiamo sempre dal database del tracker gli ordini relativi alla pizzeria. In questo caso, non \u00e8 cos\u00ec importante in quale pizzeria viene effettuato l'ordine, ci\u00f2 che conta di pi\u00f9 \u00e8 quale cliente ha effettuato l'ordine. Questo significa che \u00e8 necessario un indice per il cliente. Inoltre, per il tracker nella tabella degli ordini, non \u00e8 obbligatorio memorizzare l'id dello scontrino stampato o le promozioni correlate all'ordine. Queste informazioni non interessano al nostro servizio di tracking. Nella monolitica base dati, le tabelle potevano essere solo una soluzione compromissoria tra tutti gli utenti. Questo era uno dei problemi iniziali.<\/p>\n<p><b>C'ERA. <\/b>Inizialmente l'architettura era questa:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/085ebab3131ae5edc772d1e6f8c6de76.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAnche dopo aver separato in processi distinti, gran parte del codice rimaneva comune a diversi servizi. Tutto ci\u00f2 che era al di sotto dei controller era unico e viveva in un unico repository. Sono stati utilizzati metodi comuni per servizi, repository e un database condiviso, in cui erano presenti tabelle comuni.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q7\"><\/a><\/noindex><\/p>\n<h4>Sgraviamo Tracker<br \/>\n<\/h4>\n<p>\nIl problema principale con il tracker \u00e8 che i dati devono essere sincronizzati tra diversi database. Questa \u00e8 anche la sua principale differenza rispetto alla separazione del servizio Auth, poich\u00e9 l'ordine e il suo stato possono variare e devono essere visualizzati in diversi servizi. <\/p>\n<p>Accettiamo l'ordine al Punto Vendita del Ristorante (questo \u00e8 un servizio), che viene salvato nel database con lo stato \"Accettato\". Successivamente, deve passare al tracker, dove cambier\u00e0 ancora diverse volte il suo stato: da \"Cucina\" a \"Imballato\". Durante questo processo, l'ordine pu\u00f2 subire alcuni interventi esterni da parte del Punto Vendita o dell'interfaccia del Manager di turni. Di seguito riporto una tabella con gli stati dell'ordine e le loro descrizioni:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/b6a5a586a3f65715acccea2114725c8e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLo schema di cambiamento degli stati dell'ordine \u00e8 il seguente:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/92e58a2d60706b0e32aedbef7fa42f93.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGli stati cambiano tra diversi sistemi. In questo caso, il tracker non \u00e8 l'ultimo sistema in cui si chiudono i dati. Abbiamo visto diversi approcci possibili per la separazione in tal caso:<\/p>\n<ol>\n<li><b>Concentriamo tutte le azioni dell'ordine in un unico servizio.<\/b> Nel nostro caso, questa opzione richiede un servizio troppo grande per gestire l'ordine. Se ci fossimo fermati a questo, avremmo creato un secondo monolite. Non avremmo risolto i problemi.<\/li>\n<li><b>Un sistema chiama l'altro.<\/b> La seconda opzione \u00e8 gi\u00e0 pi\u00f9 interessante. Ma comporta possibili catene di chiamate (<noindex><a rel=\"nofollow\" href=\"https:\/\/landing.google.com\/sre\/sre-book\/chapters\/addressing-cascading-failures\/\">guasti a cascata<\/a><\/noindex>), una maggiore interconnessione dei componenti, gestirlo diventa pi\u00f9 complesso. <\/li>\n<li><b>Organizziamo eventi, e ogni servizio scambia informazioni con gli altri tramite questi eventi.<\/b> Alla fine, \u00e8 stata scelta proprio la terza opzione, in cui tutti i servizi iniziano a scambiarsi eventi tra loro. <\/li>\n<\/ol>\n<p>\nIl fatto che abbiamo scelto la terza opzione significava che il tracker avrebbe avuto il suo database, e per ogni modifica dell'ordine, inviava un evento che veniva sottoscritto da altri servizi e che, tra l'altro, finiva nel database master. Per questo avevamo bisogno di un servizio che garantisse la consegna dei messaggi tra i servizi. <\/p>\n<p>Nel frattempo, avevamo gi\u00e0 RabbitMQ nel nostro stack, quindi la decisione finale \u00e8 stata di utilizzarlo come broker dei messaggi. Nello schema \u00e8 mostrato il passaggio dell'ordine dalla Cassa del Ristorante attraverso il Tracker, dove cambia i suoi stati e la sua visualizzazione nell'interfaccia degli Ordini del manager. <b>\u00c8 DIVENTATO<\/b>: <\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/eed09f7b11202556d6641036aa8ffb1f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>                        <b class=\"spoiler_title\">Percorso dell'ordine passo dopo passo<\/b><br \/>\n                        Il percorso dell'ordine inizia su uno dei servizi di origine degli ordini. Qui \u00e8 la Cassa del Ristorante: <\/p>\n<ol>\n<li>All\u2019uscita, l\u2019ordine \u00e8 completamente pronto e deve essere inviato al tracker. Si genera un evento a cui il tracker \u00e8 iscritto. <\/li>\n<li>Il tracker, accettando l\u2019ordine, lo salva nel proprio database, generando l\u2019evento \"OrdineAccettatoDalTracker\" e inviandolo a RMQ. <\/li>\n<li>Nella bus degli eventi, ci sono gi\u00e0 diversi gestori iscritti all\u2019ordine. Per noi \u00e8 importante quello che si occupa della sincronizzazione con il database monolitico. <\/li>\n<li>Il gestore riceve l\u2019evento, estrae i dati significativi: nel nostro caso, lo stato dell\u2019ordine \"AccettatoDalTracker\" e aggiorna la propria entit\u00e0 ordine nel database principale. <\/li>\n<\/ol>\n<p>Se qualcuno ha bisogno dell\u2019ordine esattamente dalla tabella monolitica degli ordini, pu\u00f2 anche leggerlo da l\u00ec. Ad esempio, questo \u00e8 necessario per l\u2019interfaccia Ordini nel Gestore dei Turni:<\/p>\n<p><img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/97c16e7fecd6709aad7e10f9dff6c037.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAnche tutti gli altri servizi possono iscriversi agli eventi degli ordini dal tracker, per utilizzarli a loro favore.<\/p>\n<p>Se dopo un certo periodo l'ordine viene preso in carico, il suo stato cambia prima nel database (database del Tracker) e poi viene immediatamente generato un evento \"OrdineInLavorazione\". Questo viene anche inviato a RMQ, da cui si sincronizza nel database monolitico e viene recapitato ad altri servizi. Durante questo percorso possono sorgere vari problemi, che possono essere approfonditi nella relazione di Evgeny Peshkov. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=DWfJWCWV_eQ\">sui dettagli dell'implementazione della Consistenza Eventuale nel Tracker<\/a><\/noindex>. <\/p>\n<h4>Architettura finale dopo le modifiche in Auth e nel Tracker<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Storia dell&#039;architettura Dodo IS: il percorso del back office\" src=\"\/wp-content\/uploads\/2020\/10\/7cc517f78c8a381bd570cd26be25ace0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><b>Ricapitolando:<\/b> in principio pensavo di condensare la storia di nove anni del sistema Dodo IS in un solo articolo. Volevo raccontare rapidamente e semplicemente le tappe dell'evoluzione. Tuttavia, una volta immerso nel materiale, ho capito che tutto \u00e8 molto pi\u00f9 complesso e interessante di quanto sembri. <\/p>\n<p>Riflettendo sull'utilit\u00e0 (o sulla sua assenza) di un tale materiale, sono giunto alla conclusione che uno sviluppo continuo non \u00e8 possibile senza cronache complete degli eventi, retrospettive dettagliate e analisi delle proprie decisioni passate.<\/p>\n<p>Spero che ti sia stato utile e interessante conoscere il nostro percorso. Ora mi trovo di fronte alla scelta su quale parte del sistema Dodo IS descrivere nel prossimo articolo: scrivi nei commenti o vota.<\/p>\n<p class=\"for_users_only_msg\">Solo gli utenti registrati possono partecipare al sondaggio. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Accedi<\/a><\/noindex>, per favore.<\/p>\n<h2 class=\"default-block__polling-title\">Quale parte di Dodo IS ti piacerebbe conoscere nel prossimo articolo?<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">24,1%<\/strong>Il monolite iniziale in Dodo IS (2011-2015)<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">24,1%<\/strong>I primi problemi e le loro soluzioni (2015-2016)<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">20,7%<\/strong>Il percorso della parte client: il front-end sopra il database (2016-2017)<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">36,2%<\/strong>La storia dei veri microservizi (2018-2019)<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent  poll-result__data-percent_winner\">44,8%<\/strong>La conclusione del monolite e la stabilizzazione dell'architettura<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">29,3%<\/strong>Le future pianificazioni per lo sviluppo del sistema<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">19,0%<\/strong>Non voglio sapere nulla di Dodo IS<\/p>\n<\/li>\n<\/ul>\n<p>    58 utenti hanno votato. 6 utenti si sono astenuti.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0425\u0430\u0431\u0440 \u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0438\u0440. \u0411\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430 \u043c\u044b \u0432\u0435\u0434\u0451\u043c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u0433. \u0413\u0434\u0435-\u0442\u043e \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0444\u0438\u0434\u0431\u044d\u043a \u043e\u0442 \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d: \u00ab\u0414\u043e\u0434\u043e, \u0432\u043e\u0442 \u0432\u044b \u0432\u0435\u0437\u0434\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0410 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430? \u0418 \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0441\u0435\u0442\u0438 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0439?\u00bb. \u041c\u044b \u043f\u043e\u0441\u0438\u0434\u0435\u043b\u0438, \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438 \u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u0430\u0432\u044b. \u041c\u044b \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445, \u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95787,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95786","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=\"\u0425\u0430\u0431\u0440 \u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0438\u0440. \u0411\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430 \u043c\u044b \u0432\u0435\u0434\u0451\u043c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u0433. \u0413\u0434\u0435-\u0442\u043e \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0444\u0438\u0434\u0431\u044d\u043a \u043e\u0442 \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d: \u00ab\u0414\u043e\u0434\u043e, \u0432\u043e\u0442 \u0432\u044b \u0432\u0435\u0437\u0434\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0410 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430? \u0418 \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0441\u0435\u0442\u0438 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0439?\u00bb. \u041c\u044b \u043f\u043e\u0441\u0438\u0434\u0435\u043b\u0438, \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438 \u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u0430\u0432\u044b. \u041c\u044b \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445, \u043d\u043e\" \/>\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-put-bekofisa\" \/>\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: \u043f\u0443\u0442\u044c \u0431\u044d\u043a\u043e\u0444\u0438\u0441\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0425\u0430\u0431\u0440 \u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0438\u0440. \u0411\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430 \u043c\u044b \u0432\u0435\u0434\u0451\u043c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u0433. \u0413\u0434\u0435-\u0442\u043e \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0444\u0438\u0434\u0431\u044d\u043a \u043e\u0442 \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d: \u00ab\u0414\u043e\u0434\u043e, \u0432\u043e\u0442 \u0432\u044b \u0432\u0435\u0437\u0434\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0410 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430? \u0418 \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0441\u0435\u0442\u0438 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0439?\u00bb. \u041c\u044b \u043f\u043e\u0441\u0438\u0434\u0435\u043b\u0438, \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438 \u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u0430\u0432\u044b. \u041c\u044b \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445, \u043d\u043e\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-put-bekofisa\" \/>\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:12+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-03T11:42:12+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: il percorso del back office | ProHoster","description":"Habr cambia il mondo. Da oltre un anno gestiamo il nostro blog. Circa sei mesi fa abbiamo ricevuto un feedback piuttosto logico da parte degli utenti di Habr: \u00abDodo, dite sempre che avete un vostro sistema. Cos'\u00e8 questo sistema? E a cosa serve alla rete di pizzerie?\u00bb. Ci siamo seduti, abbiamo riflettuto e abbiamo capito che avete ragione. Cerchiamo di spiegare tutto in modo semplice, ma","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-put-bekofisa","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: \u043f\u0443\u0442\u044c \u0431\u044d\u043a\u043e\u0444\u0438\u0441\u0430 | ProHoster","og:description":"\u0425\u0430\u0431\u0440 \u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0438\u0440. \u0411\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430 \u043c\u044b \u0432\u0435\u0434\u0451\u043c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u0433. \u0413\u0434\u0435-\u0442\u043e \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0444\u0438\u0434\u0431\u044d\u043a \u043e\u0442 \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d: \u00ab\u0414\u043e\u0434\u043e, \u0432\u043e\u0442 \u0432\u044b \u0432\u0435\u0437\u0434\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0410 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430? \u0418 \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0441\u0435\u0442\u0438 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0439?\u00bb. \u041c\u044b \u043f\u043e\u0441\u0438\u0434\u0435\u043b\u0438, \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438 \u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u0430\u0432\u044b. \u041c\u044b \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445, \u043d\u043e","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-put-bekofisa","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:12+00:00","article:modified_time":"2020-10-03T11:42:12+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95786","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:48","updated":"2022-09-27 15:42:36"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/95786","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=95786"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/95786\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/95787"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=95786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=95786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=95786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}