{"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\/ro\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","title":{"rendered":"Istoria arhitecturii Dodo IS: o monolit timpurie","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Sau fiecare companie nefericit\u0103 cu un monolit, este nefericit\u0103 \u00een felul s\u0103u.<\/p>\n<p>Dezvoltarea sistemului Dodo IS a \u00eenceput imediat ce a \u00eenceput afacerea Dodo Pizza \u2014 \u00een 2011. La baza sa a stat ideea unei digitaliz\u0103ri complete \u0219i totale a proceselor de afaceri, ceea ce <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>prin propriile for\u021be<\/u><\/a><\/noindex>, ceea ce provoca deja foarte multe \u00eentreb\u0103ri \u0219i scepticism \u00een 2011. Dar iat\u0103 c\u0103 am parcurs deja 9 ani pe acest drum \u2014 cu o dezvoltare proprie, care a \u00eenceput cu un monolit.<\/p>\n<p>Acest articol este \u201er\u0103spunsul\u201d la \u00eentreb\u0103rile \u201eDe ce s\u0103 refacem arhitectura \u0219i s\u0103 facem astfel de schimb\u0103ri masive \u0219i de durat\u0103?\u201d din articolul anterior <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\u201eIstoria arhitecturii Dodo IS: drumul bunc\u0103rului\u201d<\/u><\/a><\/noindex>. Voi \u00eencepe cu modul \u00een care a \u00eenceput dezvoltarea Dodo IS, cum ar\u0103ta arhitectura ini\u021bial\u0103, cum ap\u0103reau noi module \u0219i din cauza c\u0103ror probleme a fost necesar s\u0103 facem schimb\u0103ri de amploare.<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>Seria de articole \u201eCe este Dodo IS?\u201d va povesti despre:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>Monolitul timpuriu \u00een Dodo IS (2011-2015). (E\u0219ti aici)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">Drumul bunc\u0103rului: baze separate \u0219i bus<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>Drumul p\u0103r\u021bii clientului: fa\u021bada deasupra bazei (2016-2017). (\u00cen curs de realizare\u2026)<\/p>\n<\/li>\n<li>\n<p>Istoria adev\u0103ratelor microservicii. (2018-2019). (\u00cen curs de realizare\u2026)<\/p>\n<\/li>\n<li>\n<p>Finalizarea t\u0103ierii monolitului \u0219i stabilizarea arhitecturii. (\u00cen curs de realizare\u2026)<\/p>\n<\/li>\n<\/ol>\n<h3>Arhitectura ini\u021bial\u0103<\/h3>\n<p>\u00cen 2011, arhitectura Dodo IS ar\u0103ta astfel:<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Primul modul din arhitectur\u0103 \u2014 primirea comenzii. Procesul de afaceri era urm\u0103torul:<\/p>\n<ul>\n<li>\n<p>clientul suna la pizzerie;<\/p>\n<\/li>\n<li>\n<p>managerul r\u0103spundea la telefon;<\/p>\n<\/li>\n<li>\n<p>accepta comanda prin telefon;<\/p>\n<\/li>\n<li>\n<p>\u00een paralel, \u00eel introducea \u00een interfa\u021ba de primire a comenzii: se lua \u00een considerare informa\u021bia despre client, detaliile comenzii, adresa de livrare.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Interfa\u021ba sistemului informa\u021bional ar\u0103ta cam a\u0219a\u2026<\/p>\n<p>Prima versiune din octombrie 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>Pu\u021bin \u00eembun\u0103t\u0103\u021bit\u0103 \u00een ianuarie 2012<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/h2Cdht01gDA\">Sistemul informa\u021bional Dodo Pizza Delivery Pizza Restaurant<\/a><\/noindex><\/p>\n<p>Resursele pentru dezvoltarea primului modul de primire a comenzii erau limitate. Trebuia s\u0103 facem multe, rapid \u0219i cu un num\u0103r mic de oameni. Num\u0103rul mic de oameni \u2014 erau 2 dezvoltatori, care au pus baza \u00eentregului sistem viitor.<\/p>\n<p>Prima lor solu\u021bie a definit soarta ulterioar\u0103 a tehnologiei:<\/p>\n<ul>\n<li>\n<p>Backend pe ASP.NET MVC, limbaj C#. Dezvoltatorii erau expertiza\u021bi \u00een .NET, acest stack le era familiar \u0219i pl\u0103cut. <\/p>\n<\/li>\n<li>\n<p>Frontend pe Bootstrap \u0219i JQuery: interfe\u021be utilizator pe stiluri \u0219i scripturi personalizate.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Baza de date MySQL: f\u0103r\u0103 costuri de licen\u021b\u0103, u\u0219or de utilizat.<\/p>\n<\/li>\n<li>\n<p>Servere pe Windows Server, deoarece .NET putea fi folosit doar pe Windows (nu vom discuta despre Mono).<\/p>\n<\/li>\n<\/ul>\n<p>Fizic, asta se manifesta \u00een \u201ededicatia la provider\u201d.&nbsp;<\/p>\n<h4>Arhitectura aplica\u021biei pentru preluarea comenzilor<\/h4>\n<p>Atunci toat\u0103 lumea vorbea despre microservicii, iar SOA era folosit de aproximativ 5 ani \u00een proiecte mari, de exemplu, WCF a fost lansat \u00een 2006. Dar atunci s-a ales o solu\u021bie sigur\u0103 \u0219i testat\u0103.<\/p>\n<p>Iat\u0103-l.<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/688da7d4e02a6310bf7d2da1b767fe10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asp.Net MVC este Razor, care genereaz\u0103 la cerere o pagin\u0103 HTML dintr-un formular sau de la client, cu randare pe server. Pe client, CSS \u0219i scripturile JS afi\u0219eaz\u0103 informa\u021biile \u0219i, dac\u0103 este necesar, efectueaz\u0103 solicit\u0103ri AJAX prin intermediul JQuery.<\/p>\n<p>Solicit\u0103rile pe server ajung \u00een clasele *Controller, unde se desf\u0103\u0219oar\u0103 procesarea \u0219i generarea paginii HTML finale. Controlerele fac solicit\u0103ri la un strat de logic\u0103, numit *Services. Fiecare dintre servicii r\u0103spundea unui anumit aspect al afacerii:<\/p>\n<ul>\n<li>\n<p>De exemplu, DepartmentStructureService furniza informa\u021bii despre pizzerii, despre departamente. Departamentul este un grup de pizzerii sub conducerea unui singur francizat.<\/p>\n<\/li>\n<li>\n<p>ReceivingOrdersService accepta \u0219i calcula compunerea comenzii.<\/p>\n<\/li>\n<li>\n<p>SmsService trimitea SMS-uri, apel\u00e2nd API-urile pentru trimiterea de SMS-uri.<\/p>\n<\/li>\n<\/ul>\n<p>Serviciile procesau datele din baz\u0103, p\u0103str\u00e2nd logica de afaceri. Fiecare serviciu avea unul sau mai multe *Repository cu un nume corespunz\u0103tor. \u00cen acestea se aflau deja solicit\u0103rile c\u0103tre procedurile stocate din baz\u0103 \u0219i stratul de mapperi. \u00cen procedurile stocate exista logica de afaceri, mai ales \u00een cele care oferau date de raportare. ORM-ul nu era folosit, toat\u0103 lumea se baza pe SQL scris manual.&nbsp;<\/p>\n<p>Mai exista un strat de model de domeniu \u0219i clase generale de ajutor, de exemplu, clasa Order, care stoca comanda. Acolo, \u00een strat, se afla un ajutor pentru conversia textului afi\u0219at \u00een func\u021bie de moneda aleas\u0103.<\/p>\n<p>Toate acestea pot fi reprezentate printr-un model: <\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Calea comenzii<\/h4>\n<p>S\u0103 analiz\u0103m c\u0103l\u0103toria simplificat\u0103 ini\u021bial\u0103 a cre\u0103rii unei astfel de comenzi.<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ini\u021bial, site-ul era static. Pe el erau pre\u021buri, iar sus - un num\u0103r de telefon \u0219i textul \u201eVrei pizza - sun\u0103 num\u0103rul \u0219i comand\u0103\u201d. Pentru a plasa o comand\u0103, trebuie s\u0103 implement\u0103m un flux simplu:&nbsp;<\/p>\n<ul>\n<li>\n<p>Clien\u021bii acceseaz\u0103 site-ul static cu pre\u021buri, aleg produsele \u0219i sun\u0103 la num\u0103rul afi\u0219at pe site.<\/p>\n<\/li>\n<li>\n<p>Clien\u021bii men\u021bioneaz\u0103 produsele pe care doresc s\u0103 le adauge \u00een comand\u0103.<\/p>\n<\/li>\n<li>\n<p>\u00ce\u0219i men\u021bioneaz\u0103 adresa \u0219i numele.<\/p>\n<\/li>\n<li>\n<p>Operatorul preia comanda.<\/p>\n<\/li>\n<li>\n<p>Comanda este afi\u0219at\u0103 \u00een interfa\u021ba comenzilor primite.<\/p>\n<\/li>\n<\/ul>\n<p>Totul \u00eencepe cu afi\u0219area meniului. Utilizatorul-operator autentificat poate accepta un singur comenzi la un moment dat. Prin urmare, co\u0219ul draft poate fi p\u0103strat \u00een sesiunea lui (sesiunea utilizatorului este stocat\u0103 \u00een memorie). Acolo se afl\u0103 obiectul Cart, care con\u021bine produsele \u0219i informa\u021biile despre client.<\/p>\n<p>Clientul men\u021bioneaz\u0103 produsul, operatorul apas\u0103 pe <code>+<\/code> l\u00e2ng\u0103 produs, iar o cerere este trimis\u0103 serverului. Informa\u021biile despre produs sunt extrase din baza de date \u0219i ad\u0103ugate \u00een co\u0219.<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Not\u0103<\/strong>. Da, aici nu este necesar s\u0103 extragem produsul din baza de date, ci putem transmite informa\u021biile de la frontend. Dar pentru claritate, am ar\u0103tat drumul din baza de date.&nbsp;<\/p>\n<p>Apoi introducem adresa \u0219i numele clientului.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>C\u00e2nd se apas\u0103 \u201eCreare comand\u0103\u201d:<\/p>\n<ul>\n<li>\n<p>Cererea este trimis\u0103 \u00een OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>Ob\u021binem Cart din sesiune, acolo se afl\u0103 produsele \u00een cantit\u0103\u021bile dorite.<\/p>\n<\/li>\n<li>\n<p>Complect\u0103m Cart cu informa\u021biile despre client \u0219i le transmitem metodei AddOrder din clasa ReceivingOrderService, unde sunt salvate \u00een baza de date.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Exist\u0103 tabele \u00een baza de date pentru comand\u0103, con\u021binutul comenzii, client, \u0219i toate acestea sunt interconectate.<\/p>\n<\/li>\n<li>\n<p>Interfa\u021ba de afi\u0219are a comenzii preia ultimele comenzi \u0219i le afi\u0219eaz\u0103.<\/p>\n<\/li>\n<\/ul>\n<h4>Module noi<\/h4>\n<p>Acceptarea comenzii a fost esen\u021bial\u0103 \u0219i necesar\u0103. Nu po\u021bi s\u0103 faci afaceri cu v\u00e2nzarea de pizza dac\u0103 nu exist\u0103 un sistem de acceptare a comenzilor. De aceea, sistemul a \u00eenceput s\u0103 se dezvolte, ad\u0103ug\u00e2nd func\u021bionalit\u0103\u021bi \u00een perioada 2012-2015. \u00cen acest timp, au ap\u0103rut multe module diferite ale sistemului, pe care le voi denumi <strong>module<\/strong>, spre deosebire de conceptul de serviciu sau produs.&nbsp;<\/p>\n<p>Un modul este un set de func\u021bii unite de un anumit scop de afaceri. Acestea se afl\u0103 fizic \u00eentr-o singur\u0103 aplica\u021bie.<\/p>\n<p>Modulele pot fi considerate blocuri ale sistemului. De exemplu, este un modul de rapoarte, interfe\u021be de administrare, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>tracker de produse \u00een buc\u0103t\u0103rie<\/u><\/a><\/noindex>, autentificare. Toate acestea sunt diferite interfe\u021be pentru utilizator, unele av\u00e2nd chiar stiluri vizuale diferite. Totu\u0219i, toate sunt \u00een cadrul unei singure aplica\u021bii, a unui singur proces func\u021bional.&nbsp;<\/p>\n<p>Tehnic, modulele erau realizate ca Area (aceasta idee a r\u0103mas chiar \u0219i \u00een <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>). A existat o separare a fi\u0219ierelor pentru frontend, modele, precum \u0219i clasele controller-elor proprii. \u00cen final, sistemul s-a transformat dintr-un...<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>...\u00eentr-o astfel de:<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Unele module sunt implementate ca site-uri separate (proiect executabil), din cauza func\u021bionalit\u0103\u021bii complet diferite \u0219i par\u021bial din cauza unei dezvolt\u0103ri mai separate, mai concentrate. Acestea sunt:<\/p>\n<ul>\n<li>\n<p><strong>Site<\/strong> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2013\/08\/06\/new_site_dodopizza_ru\/\"><u>prima versiune<\/u><\/a><\/noindex> a site-ului dodopizza.ro.<\/p>\n<\/li>\n<li>\n<p><strong>Export<\/strong>: exportarea rapoartelor din Dodo IS pentru 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Personal<\/strong> \u2014 portalul personal al angajatului. A fost dezvoltat separat, av\u00e2nd un punct de acces \u0219i un design distinct.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 proiect pentru g\u0103zduirea con\u021binutului static. Ulterior, am renun\u021bat la el, mut\u00e2nd tot con\u021binutul static pe CDN Akamai.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Celelalte module se aflau \u00een aplica\u021bia BackOffice.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Clarificare a denumirilor:<\/p>\n<ul>\n<li>\n<p>Cashier \u2014 Casa restaurantului.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 interfe\u021be pentru rolul \u201eManager de tur\u0103\u201d: statistici operative despre v\u00e2nz\u0103rile pizzeriei, posibilitatea de a bloca produse, de a modifica comenzile.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 interfe\u021be pentru rolul \u201eManager de pizzerie\u201d \u0219i \u201eFranchisor\u201d. Aici sunt concentrate func\u021biile de configurare a pizzeriei, promo\u021biile bonus, gestionarea angaja\u021bilor, rapoartele.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 interfe\u021be pentru televizoarele \u0219i tabletele montate \u00een pizzerii. Pe televizoare sunt afi\u0219ate meniul, informa\u021biile publicitare, starea comenzii la livrare.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Au folosit un strat comun de servicii, un bloc comun de clase de domeniu Dodo.Core, dar \u0219i o baz\u0103 de date comun\u0103. Uneori puteau face leg\u0103turi \u00eentre site-uri, inclusiv site-uri separate, cum ar fi dodopizza.ro sau personal.dodopizza.ro.<\/p>\n<p>Atunci c\u00e2nd ap\u0103reau module noi, se c\u0103uta s\u0103 se reutilizeze c\u00e2t mai mult codul deja creat pentru servicii, proceduri stocate \u0219i tabeluri din baz\u0103.&nbsp;<\/p>\n<p>Pentru a \u00een\u021belege mai bine amploarea modulelor dezvoltate \u00een sistem, iat\u0103 o schem\u0103 din 2012 cu planurile de dezvoltare:<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>P\u00e2n\u0103 \u00een 2015, tot ce era \u00een schema respectiv\u0103 \u0219i chiar mai mult a fost pus \u00een produc\u021bie.<\/p>\n<ul>\n<li>\n<p>Preluarea comenzilor a evoluat \u00een un bloc separat al Centrului de Contact, unde comenzile sunt preluate de operator.<\/p>\n<\/li>\n<li>\n<p>Au ap\u0103rut ecrane publice cu meniuri \u0219i informa\u021bii, montate \u00een pizzerii.<\/p>\n<\/li>\n<li>\n<p>\u00cen buc\u0103t\u0103rie exist\u0103 un modul care reproduce automat mesajul vocal \u201ePizza nou\u0103\u201d la primirea unei comenzi noi \u0219i imprim\u0103 o factur\u0103 pentru curier. Acest lucru simplific\u0103 semnificativ procesele din buc\u0103t\u0103rie, permi\u021b\u00e2nd angaja\u021bilor s\u0103 nu se abat\u0103 de la un num\u0103r mare de opera\u021biuni simple.<\/p>\n<\/li>\n<li>\n<p>Blocul de livrare a devenit o Cas\u0103 de Livrare distinct\u0103, unde comanda era predat\u0103 curierului, care se \u00eenregistrase anterior pentru tur\u0103. Timpul s\u0103u de lucru era contabilizat pentru plata salariului.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>\u00centre 2012 \u0219i 2015 au ap\u0103rut mai mult de 10 dezvoltatori, s-au deschis 35 de pizzerii, s-a extins sistemul \u00een Rom\u00e2nia \u0219i s-au preg\u0103tit deschiderea unor loca\u021bii \u00een SUA. Dezvoltatorii nu mai gestionau toate sarcinile, ci erau \u00eemp\u0103r\u021bi\u021bi \u00een echipe, fiecare specializ\u00e2ndu-se pe partea sa din sistem.&nbsp;<\/p>\n<h3>Probleme<\/h3>\n<p>Printre altele din cauza arhitecturii (dar nu numai).<\/p>\n<h4>Haos \u00een baza de date<\/h4>\n<p>O singur\u0103 baz\u0103 de date este convenabil\u0103. Acolo se poate ob\u021bine consisten\u021b\u0103, datorit\u0103 mijloacelor \u00eencorporate \u00een bazele de date rela\u021bionale. Lucrul cu ea este familiar \u0219i convenabil, mai ales dac\u0103 exist\u0103 pu\u021bine tabele \u0219i pu\u021bine date.<\/p>\n<p>\u00cens\u0103, \u00een cei 4 ani de dezvoltare, \u00een baz\u0103 s-au acumulat aproximativ 600 de tabele, 1500 de proceduri stocate, \u00een multe dintre care exista \u0219i logic\u0103. Din p\u0103cate, procedurile stocate nu aduc un avantaj semnificativ \u00een lucrul cu MySQL. Ele nu sunt cache-uite de baz\u0103, iar includerea logici \u00een acestea complic\u0103 dezvoltarea \u0219i depanarea. Reutilizarea codului este, de asemenea, \u00eengreunat\u0103.<\/p>\n<p><strong>Pe multe tabele nu existau indice adecva\u021bi<\/strong>, iar \u00een alte p\u0103r\u021bi, dimpotriv\u0103, erau foarte multe indice, ceea ce \u00eengreuna inser\u021bia. A fost necesar s\u0103 se modifice aproximativ 20 de tabele - o tranzac\u021bie de creare a unei comenzi putea dura \u00eentre 3 \u0219i 5 secunde.&nbsp;<\/p>\n<p><strong>Datele din tabele nu erau \u00eentotdeauna \u00een cea mai potrivit\u0103 form\u0103<\/strong>. \u00cen unele locuri, era necesar\u0103 denormalizarea. O parte din datele primite regulat erau \u00eentr-o coloan\u0103 sub form\u0103 de structur\u0103 XML, ceea ce cre\u0219tea timpul de execu\u021bie, lungind interog\u0103rile \u0219i complic\u00e2nd dezvoltarea.<\/p>\n<p>La acelea\u0219i tabele se aduceau foarte <strong>diverse interog\u0103ri<\/strong>. Tabelele populare, cum ar fi tabelele men\u021bionate anterior, <em>orders<\/em> sau tabela <em>pizzeria<\/em>. Acestea erau utilizate pentru a genera interfe\u021be opera\u021bionale \u00een buc\u0103t\u0103rie, analize. De asemenea, site-ul (<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ro<\/u><\/a><\/noindex>) primea \u00een orice moment un num\u0103r mare de interog\u0103ri nea\u0219teptate.&nbsp;<\/p>\n<p><strong>Datele nu erau agregate<\/strong> \u0219i multe calcule se realizau pe loc prin intermediul bazei. Aceasta crea calcule suplimentare \u0219i o \u00eenc\u0103rcare adi\u021bional\u0103.&nbsp;<\/p>\n<p>Adesea, codul interoga baza atunci c\u00e2nd nu ar fi trebuit. \u00cen unele locuri, lipseau opera\u021biile bulk, iar \u00een altele, ar fi fost nevoie s\u0103 se disocieze o interogare \u00een mai multe, prin cod, pentru a accelera \u0219i a cre\u0219te fiabilitatea.&nbsp;<\/p>\n<h4>Conexiunea \u0219i complexitatea \u00een cod<\/h4>\n<p><strong>Modulele care ar fi trebuit s\u0103 r\u0103spund\u0103 pentru propria lor parte de afaceri nu f\u0103ceau acest lucru corect.<\/strong>. Unele dintre acestea aveau duplic\u0103ri de func\u021bii pentru roluri. De exemplu, pentru un marketer local, care este responsabil pentru activitatea de marketing a re\u021belei \u00een ora\u0219ul s\u0103u, era necesar s\u0103 utilizeze at\u00e2t interfa\u021ba \u201eAdmin\u201d (pentru a crea promo\u021bii), c\u00e2t \u0219i interfa\u021ba \u201eManager de Birou\u201d (pentru a vizualiza impactul promo\u021biilor asupra afacerii). Desigur, \u00een interior, ambele module utilizau acela\u0219i serviciu care lucra cu promo\u021biile bonus.<\/p>\n<p>Serviciile (clase \u00een cadrul unui mare proiect monolitic) puteau s\u0103 se invoce reciproc pentru a-\u0219i \u00eembog\u0103\u021bi datele.<\/p>\n<p>\u00cen sine, clasele-model care stocheaz\u0103 datele, <strong>lucrul \u00een cod era diferit<\/strong>. Acolo unde erau constructori, prin care se puteau specifica c\u00e2mpurile obligatorii. Acolo unde se f\u0103cea acest lucru prin propriet\u0103\u021bi publice. Desigur, ob\u021binerea \u0219i transformarea datelor din baz\u0103 era variat\u0103.&nbsp;<\/p>\n<p><strong>Logica era fie \u00een controllere, fie \u00een clasele de servicii.<\/strong>&nbsp;<\/p>\n<p>Acestea p\u0103reau probleme minore, dar \u00eencetineau semnificativ dezvoltarea \u0219i diminuau calitatea, ceea ce ducea la instabilitate \u0219i erori.&nbsp;<\/p>\n<h4>Complexitatea dezvolt\u0103rii mari<\/h4>\n<p><strong>Dificult\u0103\u021bile au ap\u0103rut \u0219i \u00een dezvoltarea \u00een sine<\/strong>. Era nevoie s\u0103 se creeze diverse module ale sistemului, \u0219i asta pe paralel. Integrarea nevoilor fiec\u0103rui component \u00een acela\u0219i cod devenea din ce \u00een ce mai dificil\u0103. Nu era u\u0219or s\u0103 se ajung\u0103 la un consens \u0219i s\u0103 se mul\u021bumeasc\u0103 toate componentele simultan. La acestea se ad\u0103ugau limit\u0103rile tehnologice, \u00een special \u00een ceea ce prive\u0219te baza de date \u0219i frontend-ul. Trebuia s\u0103 se renun\u021be la JQuery \u00een favoarea unor cadre de \u00eenalt nivel, \u00een special \u00een partea serviciilor client (site-ul).<\/p>\n<p><strong>\u00cen unele p\u0103r\u021bi ale sistemului ar fi putut fi utilizate baze mai potrivite pentru acesta<\/strong>. De exemplu, ulterior am avut un precedent de trecere de la Redis la CosmosDB pentru stocarea co\u0219ului de comand\u0103.&nbsp;<\/p>\n<p>Echipele \u0219i dezvoltatorii care \u00ee\u0219i desf\u0103ceau activitatea \u00een domeniile specifice doreau evident mai mult\u0103 autonomie pentru serviciile lor, at\u00e2t \u00een ceea ce prive\u0219te dezvoltarea, c\u00e2t \u0219i \u00een ceea ce prive\u0219te lansarea. Conflictele la fuziune, problemele la lans\u0103ri. Dac\u0103 pentru 5 dezvoltatori aceast\u0103 problem\u0103 nu era semnificativ\u0103, pentru 10, \u0219i mai ales av\u00e2nd \u00een vedere cre\u0219terea planificat\u0103, totul ar fi devenit mai grav. Iar \u00een fa\u021b\u0103 urma s\u0103 fie dezvoltat\u0103 o aplica\u021bie mobil\u0103 (aceasta a \u00eenceput \u00een 2017, iar \u00een 2018 s-a realizat) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">o c\u0103dere mare<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>Diferitele p\u0103r\u021bi ale sistemului necesitau diferite indicatori de stabilitate<\/strong>, dar din cauza leg\u0103turii str\u00e2nse a sistemului, nu am putut asigura acest lucru. O eroare \u00een dezvoltarea unei noi func\u021bii \u00een panoul de administrator ar fi putut afecta primirea comenzilor pe site, deoarece codul este comun \u0219i reutilizabil, iar baza de date \u0219i datele sunt, de asemenea, unitare.<\/p>\n<p>Probabil c\u0103 era posibil s\u0103 evit\u0103m aceste erori \u0219i probleme \u00een cadrul unei astfel de arhitecturi monolitice-modulare: s\u0103 facem o separare a responsabilit\u0103\u021bilor, s\u0103 realiz\u0103m refactoring at\u00e2t al codului, c\u00e2t \u0219i al bazei de date, s\u0103 separ\u0103m clar straturile \u00eentre ele, s\u0103 monitoriz\u0103m calitatea \u00een fiecare zi. Dar solu\u021biile arhitecturale alese \u0219i accentul pe extinderea rapid\u0103 a func\u021bionalit\u0103\u021bii sistemului au dus la probleme de stabilitate.<\/p>\n<h4>Cum blogul Puterea Min\u021bii a afectat casieriile din restaurante<\/h4>\n<p>Dac\u0103 cre\u0219terea re\u021belei de pizzerii (\u0219i \u00eenc\u0103rcarea) ar fi continuat \u00een acela\u0219i ritm, atunci, \u00een cur\u00e2nd, c\u0103derile ar fi fost at\u00e2t de mari \u00eenc\u00e2t sistemul nu s-ar mai fi ridicat. O ilustrare bun\u0103 a problemelor cu care am \u00eenceput s\u0103 ne confrunt\u0103m \u00een 2015 este aceast\u0103 poveste.&nbsp;<\/p>\n<p>\u00cen blogul \u201e<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>Puterea Min\u021bii<\/u><\/a><\/noindex>\u201d exista un widget care ar\u0103ta datele legate de venituri pe an pentru \u00eentreaga re\u021bea. Widgetul se conecta la un API public Dodo care furniza aceste date. Acum aceast\u0103 statistic\u0103 este disponibil\u0103 pe <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. Widgetul era afi\u0219at pe fiecare pagin\u0103 \u0219i f\u0103cea cereri la fiecare 20 de secunde. Cererea era trimis\u0103 la api.dodopizza.ru \u0219i solicita:<\/p>\n<ul>\n<li>\n<p>num\u0103rul de pizzerii din re\u021bea;<\/p>\n<\/li>\n<li>\n<p>venitul total al re\u021belei de la \u00eenceputul anului;<\/p>\n<\/li>\n<li>\n<p>venitul ob\u021binut ast\u0103zi.<\/p>\n<\/li>\n<\/ul>\n<p>Cererea pentru statisticile legate de venituri mergea direct \u00een baza de date \u0219i \u00eencepea s\u0103 cear\u0103 datele legate de comenzi, agreg\u00e2nd datele \u00een timp real \u0219i livr\u00e2nd suma.&nbsp;<\/p>\n<p>Aceea\u0219i tabel\u0103 a comenzilor era folosit\u0103 \u0219i de casierii din restaurante, care desc\u0103rcau lista comenzilor acceptate ast\u0103zi, iar noile comenzi erau ad\u0103ugate acolo. Casierii f\u0103ceau cererile lor la fiecare 5 secunde sau la actualizarea paginii.<\/p>\n<p>Schema ar\u0103ta astfel:<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Odat\u0103, toamna, Feodor Ovcihnkov a scris pe blogul s\u0103u un articol lung \u0219i popular. Pe blog au venit foarte mul\u021bi oameni \u0219i au \u00eenceput s\u0103 citeasc\u0103 cu aten\u021bie totul. \u00cen timp ce fiecare vizitator citea articolul, widgetul legat de venituri func\u021biona corespunz\u0103tor \u0219i solicita API la fiecare 20 de secunde.<\/p>\n<p>API a apelat o procedur\u0103 stocat\u0103 pentru calcularea sumei tuturor comenzilor din acest an pentru toate pizzeriile din re\u021bea. Agregarea a fost realizat\u0103 pe tabela orders, care este foarte popular\u0103. Toate casele de marcat ale restaurantelor deschise \u00een acel moment erau conectate la aceasta. Casele de marcat au \u00eencetat s\u0103 mai r\u0103spund\u0103, comenzile nu mai erau acceptate. De asemenea, comenzile nu erau acceptate de pe site, nu ap\u0103reau pe tracker, iar managerul de schimb nu putea s\u0103 le vad\u0103 \u00een interfa\u021ba sa.&nbsp;<\/p>\n<p>Aceasta nu este singura poveste. P\u00e2n\u0103 \u00een toamna anului 2015, \u00eenc\u0103rc\u0103tura pe sistem era critic\u0103 \u00een fiecare vineri. De c\u00e2teva ori am oprit API-ul public, iar \u00eentr-o ocazie, a trebuit chiar s\u0103 deconect\u0103m site-ul, pentru c\u0103 nimic nu mai ajuta. A existat chiar o list\u0103 de servicii cu ordinea de deconectare \u00een cazul unor sarcini severe.<\/p>\n<p>De atunci a \u00eenceput lupta noastr\u0103 cu \u00eenc\u0103rc\u0103rile \u0219i stabilizarea sistemului (din toamna anului 2015 p\u00e2n\u0103 \u00een toamna anului 2018). Atunci a avut loc \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Marea c\u0103dere<\/u><\/a><\/noindex>\". De asemenea, au mai avut loc unele defec\u021biuni, unele destul de sensibile, dar perioada general\u0103 de instabilitate poate fi acum considerat\u0103 dep\u0103\u0219it\u0103.<\/p>\n<h4>Cre\u0219terea rapid\u0103 a afacerii<\/h4>\n<p>De ce nu s-a putut \u201eface bine totul din prima\u201d? Este suficient s\u0103 ne uit\u0103m la graficele urm\u0103toare.<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>De asemenea, \u00een 2014-2015 a avut loc deschiderea \u00een Rom\u00e2nia \u0219i se preg\u0103tea deschiderea \u00een SUA.<\/p>\n<p>Re\u021beaua a crescut foarte repede, au fost deschise noi \u021b\u0103ri, au ap\u0103rut noi formate de pizzerii, de exemplu, o pizzerie la food court. Toate acestea necesitau o aten\u021bie semnificativ\u0103 pentru extinderea func\u021biilor Dodo IS. F\u0103r\u0103 toate aceste func\u021bii, f\u0103r\u0103 urm\u0103rirea \u00een buc\u0103t\u0103rie, contabilizarea produselor \u0219i pierderilor \u00een sistem, \u0219i f\u0103r\u0103 afi\u0219area comenzii \u00een sala food court, cu greu ne-am fi g\u00e2ndit acum la arhitectura \u201ecorect\u0103\u201d \u0219i la abordarea \u201epotrivit\u0103\u201d \u00een dezvoltare.<\/p>\n<p>De asemenea, obstacolele pentru revizuirea la timp a arhitecturii \u0219i, \u00een general, aten\u021bia asupra problemelor tehnice au fost criza din 2014. Astfel de lucruri afecteaz\u0103 sever capacit\u0103\u021bile de cre\u0219tere ale echipelor, mai ales pentru o afacere t\u00e2n\u0103r\u0103, a\u0219a cum era Dodo Pizza.<\/p>\n<h3>Solu\u021bii rapide care au ajutat<\/h3>\n<p>Problemele necesit\u0103 solu\u021bii. \u00cen principiu, solu\u021biile pot fi \u00eemp\u0103r\u021bite \u00een dou\u0103 grupuri:<\/p>\n<ul>\n<li>\n<p>Rapid, care sting incendiul \u0219i ofer\u0103 o mic\u0103 marj\u0103 de siguran\u021b\u0103, c\u00e2\u0219tig\u00e2nd astfel timp pentru modific\u0103ri.<\/p>\n<\/li>\n<li>\n<p>Sistemice \u0219i, prin urmare, tardive. Reingineria mai multor module, separarea arhitecturii monolitice \u00een servicii separate (majoritatea dintre ele fiind mai degrab\u0103 macroservicii dec\u00e2t microservicii, \u0219i despre asta exist\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>raportul lui Andrei Morevski<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Lista scurt\u0103 a modific\u0103rilor rapide este urm\u0103toarea:<\/p>\n<h4>Scale up master database<\/h4>\n<p>Desigur, primul lucru pe care \u00eel facem pentru a face fa\u021b\u0103 sarcinilor este s\u0103 cre\u0219tem puterea serverului. Acest lucru a fost realizat pentru master database \u0219i pentru serverele web. Din p\u0103cate, acest lucru este posibil doar p\u00e2n\u0103 la un anumit punct, dup\u0103 care devine prea costisitor.<\/p>\n<p>Din 2014 am migrat \u00een Azure, despre acest subiect am scris \u0219i atunci \u00een articolul \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">Cum Dodo Pizza livreaz\u0103 pizza cu ajutorul Microsoft Azure<\/a><\/noindex>\u201d. Dar dup\u0103 o serie de cre\u0219teri ale serverelor pentru baz\u0103 ne-am lovit de costuri.&nbsp;<\/p>\n<h4>Replica bazei pentru citire<\/h4>\n<p>Am creat dou\u0103 replici pentru baz\u0103:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>pentru cererile de referin\u021b\u0103<\/strong>. Este utilizat\u0103 pentru citirea referin\u021belor, cum ar fi ora\u0219ele, str\u0103zile, pizzeriile, produsele (domeniu care se schimb\u0103 lent), \u0219i \u00een acele interfe\u021be unde o mic\u0103 \u00eent\u00e2rziere este acceptabil\u0103. Aceste replici erau 2, ne-am asigurat de disponibilitatea lor la fel ca \u0219i a masterului.<\/p>\n<p><strong>ReadReplica pentru cererile de rapoarte<\/strong>. Aceast\u0103 baz\u0103 avea o disponibilitate mai mic\u0103, dar toate rapoartele mergeau prin ea. Chiar dac\u0103 aveau cereri grele pentru calcule mari de date, nu influen\u021bau baza principal\u0103 \u0219i interfe\u021bele opera\u021bionale.&nbsp;<\/p>\n<h4>Cache-uri \u00een cod<\/h4>\n<p>Nu existau cache-uri \u00een cod (deloc). Acest lucru ducea la cereri suplimentare, care nu erau \u00eentotdeauna necesare, \u00een baza supraaglomerat\u0103. Cache-urile erau ini\u021bial at\u00e2t \u00een memorie, c\u00e2t \u0219i pe un serviciu de cache extern, acesta fiind Redis. Totul era invalidat \u00een func\u021bie de timp, set\u0103rile erau specificate \u00een cod.<\/p>\n<h4>Mai multe servere pentru backend<\/h4>\n<p>Backend-ul aplica\u021biei trebuia \u0219i el scalat pentru a face fa\u021b\u0103 \u00eenc\u0103rc\u0103rilor crescute. Era necesar s\u0103 transform\u0103m un server iis \u00eentr-un cluster. Am mutat <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>sesion\u0103rile aplica\u021biilor<\/u><\/a><\/noindex> din memorie \u00een RedisCache, ceea ce a permis implementarea mai multor servere, st\u00e2nd \u00een spatele unui simplu balancer de \u00eenc\u0103rcare cu round robin. Ini\u021bial s-a folosit acela\u0219i Redis ca pentru cache-uri, apoi s-au descompus \u00een mai multe.&nbsp;<\/p>\n<p>\u00cen cele din urm\u0103, arhitectura s-a complicat...<\/p>\n<p><img decoding=\"async\" alt=\"Istoria arhitecturii Dodo IS: o monolit timpurie\" src=\"\/wp-content\/uploads\/2020\/10\/70a3e8d5578469239c08b4759ab32264.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026dar o parte din tensiune a fost eliminat\u0103.<\/p>\n<p>\u0218i apoi trebuia s\u0103 refacem componentele suprasolicitate, la asta ne-am apucat. Despre asta vom vorbi \u00een partea urm\u0103toare.<\/p>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/521614\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0430\u043b\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u0438 \u0442\u043e\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0446\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438, \u0447\u0442\u043e \u0435\u0449\u0435 \u0442\u043e\u0433\u0434\u0430 \u0432 2011 \u0433\u043e\u0434\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0441\u043a\u0435\u043f\u0442\u0438\u0446\u0438\u0437\u043c\u0430. \u041d\u043e \u0432\u043e\u0442 \u0443\u0436\u0435 9 \u043b\u0435\u0442 \u043c\u044b \u0438\u0434\u0435\u043c \u043f\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95805,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95804","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Dodo IS: \u0440\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/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\udd47Istoria arhitecturii Dodo IS: monolitul timpuriu | ProHoster","description":"Sau fiecare companie nefericit\u0103 cu un monolit este nefericit\u0103 \u00een felul ei. Dezvoltarea sistemului Dodo IS a \u00eenceput imediat, la fel ca \u0219i afacerea Dodo Pizza - \u00een 2011.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Dodo IS: \u0440\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 | ProHoster","og:description":"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-03T11:42:27+00:00","article:modified_time":"2020-10-03T11:42:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95804","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:57:47","updated":"2022-09-28 00:34:07","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/95804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=95804"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/95804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/95805"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=95804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=95804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=95804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}