{"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\/sv\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","title":{"rendered":"Historien bakom Dodo IS-arkitekturen: tidig monolit","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Eller s\u00e5 \u00e4r varje olycklig f\u00f6retag med monolit en olycklig p\u00e5 sitt eget s\u00e4tt.<\/p>\n<p>Utvecklingen av Dodo IS-systemet b\u00f6rjade samma \u00e5r som Dodo Pizzas verksamhet \u2013 2011. Basen var id\u00e9n om en fullst\u00e4ndig och total digitalisering av aff\u00e4rsprocesserna, vilket <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>gjordes i egen regi<\/u><\/a><\/noindex>, n\u00e5got som redan d\u00e5, 2011, v\u00e4ckte m\u00e5nga fr\u00e5gor och skepticism. Men nu, efter nio \u00e5r, forts\u00e4tter vi p\u00e5 denna v\u00e4g \u2013 med egen utveckling som b\u00f6rjade med en monolit.<\/p>\n<p>Den h\u00e4r artikeln \u00e4r ett \"svar\" p\u00e5 fr\u00e5gorna \"Varf\u00f6r skriva om arkitekturen och g\u00f6ra s\u00e5dana omfattande och l\u00e5ngvariga f\u00f6r\u00e4ndringar?\" till den f\u00f6reg\u00e5ende artikeln <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\"Historien om Dodo IS-arkitekturen: v\u00e4gen f\u00f6r backoffice\".<\/u><\/a><\/noindex>Jag b\u00f6rjar med hur utvecklingen av Dodo IS b\u00f6rjade, hur den ursprungliga arkitekturen s\u00e5g ut, hur nya moduler kom till och vilka problem som ledde till omfattande f\u00f6r\u00e4ndringar.<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>Artikelserien \"Vad \u00e4r Dodo IS?\" kommer att ber\u00e4tta om:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>Den tidiga monoliten i Dodo IS (2011-2015). (Du \u00e4r h\u00e4r)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">V\u00e4gen f\u00f6r backoffice: separata databaser och bussen<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>V\u00e4gen f\u00f6r klientdelen: ett fasad \u00f6ver databasen (2016-2017). (P\u00e5g\u00e5r\u2026)<\/p>\n<\/li>\n<li>\n<p>Historien om verkliga mikrotj\u00e4nster. (2018-2019). (P\u00e5g\u00e5r\u2026)<\/p>\n<\/li>\n<li>\n<p>Den avslutade nedsk\u00e4rningen av monoliten och stabiliseringen av arkitekturen. (P\u00e5g\u00e5r\u2026)<\/p>\n<\/li>\n<\/ol>\n<h3>Den ursprungliga arkitekturen<\/h3>\n<p>\u00c5r 2011 s\u00e5g Dodo IS-arkitekturen ut s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Den f\u00f6rsta modulen i arkitekturen \u2013 best\u00e4llningsmottagning. Aff\u00e4rsprocessen var s\u00e5dan:<\/p>\n<ul>\n<li>\n<p>kunden ringer till pizzerian;<\/p>\n<\/li>\n<li>\n<p>managern svarar;<\/p>\n<\/li>\n<li>\n<p>tar emot best\u00e4llningen per telefon;<\/p>\n<\/li>\n<li>\n<p>samtidigt skriver han ner den i best\u00e4llningsgr\u00e4nssnittet: information om kunden, detaljerna om best\u00e4llningen, leveransadressen beaktas.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Gr\u00e4nssnittet f\u00f6r informationssystemet s\u00e5g ungef\u00e4r ut s\u00e5 h\u00e4r\u2026<\/p>\n<p>Den f\u00f6rsta versionen fr\u00e5n oktober 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>Lite f\u00f6rb\u00e4ttrad i januari 2012<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/h2Cdht01gDA\">Dodo Pizza Informationssystem Delivery Pizza Restaurang<\/a><\/noindex><\/p>\n<p>Resurserna f\u00f6r utvecklingen av den f\u00f6rsta best\u00e4llningsmodulen var begr\u00e4nsade. Mycket skulle g\u00f6ras snabbt och med liten personalstyrka. Liten personalstyrka \u2013 det var tv\u00e5 utvecklare som lade grunden f\u00f6r hela det framtida systemet.<\/p>\n<p>Deras f\u00f6rsta beslut best\u00e4mde den tekniska stackens framtid:<\/p>\n<ul>\n<li>\n<p>Backend p\u00e5 ASP.NET MVC, spr\u00e5k C#. Utvecklarna var .NET-programmerare, denna stack var bekant och behaglig f\u00f6r dem. <\/p>\n<\/li>\n<li>\n<p>Frontend p\u00e5 Bootstrap och jQuery: anv\u00e4ndargr\u00e4nssnitt med egen design och skript.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Databasen MySQL: utan licenskostnader, enkel att anv\u00e4nda.<\/p>\n<\/li>\n<li>\n<p>Servrar p\u00e5 Windows Server, eftersom .NET d\u00e5 endast kunde k\u00f6ras under Windows (Mono ska vi inte diskutera).<\/p>\n<\/li>\n<\/ul>\n<p>Fysiskt uttrycktes allt detta i \"dedikera hos v\u00e4rden\".&nbsp;<\/p>\n<h4>Arkitekturen f\u00f6r best\u00e4llningsmottagningsapplikationen<\/h4>\n<p>D\u00e5 pratade alla redan om mikrotj\u00e4nster, medan SOA hade anv\u00e4nts i fem \u00e5r i stora projekt, till exempel, WCF sl\u00e4pptes 2006. Men d\u00e5 valde man en p\u00e5litlig och bepr\u00f6vad l\u00f6sning.<\/p>\n<p>H\u00e4r \u00e4r det.<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/688da7d4e02a6310bf7d2da1b767fe10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asp.Net MVC \u00e4r Razor, som genererar en HTML-sida med rendering p\u00e5 servern p\u00e5 beg\u00e4ran fr\u00e5n formul\u00e4r eller klienten. P\u00e5 klienten visar CSS och JS-skript information och, vid behov, utf\u00f6r AJAX-anrop via JQuery.<\/p>\n<p>Anropen p\u00e5 servern hamnar i klasser **Controller, d\u00e4r bearbetning och generation av den slutliga HTML-sidan \u00e4ger rum i metoden. Kontrollerna g\u00f6r anrop till logiklagret, kallat **Services. Varje tj\u00e4nst svarade mot en aspekt av aff\u00e4rer:<\/p>\n<ul>\n<li>\n<p>Till exempel gav DepartmentStructureService information om pizzerior, om avdelningarna. En avdelning \u00e4r en grupp pizzerior under en franchisetagares ledning.<\/p>\n<\/li>\n<li>\n<p>ReceivingOrdersService tog emot och ber\u00e4knade best\u00e4llningens inneh\u00e5ll.<\/p>\n<\/li>\n<li>\n<p>Och SmsService skickade sms genom att anropa API-tj\u00e4nster f\u00f6r att skicka sms.<\/p>\n<\/li>\n<\/ul>\n<p>Tj\u00e4nsterna bearbetade data fr\u00e5n databasen, lagrade aff\u00e4rslogik. I varje tj\u00e4nst fanns en eller flera **Repository med motsvarande namn. H\u00e4r fanns redan anrop till lagrade procedurer i databasen och en lagermappare. Den lagrade inneh\u00f6ll aff\u00e4rslogik, s\u00e4rskilt i de som utf\u00e4rdade rapportdata. ORM anv\u00e4ndes inte, alla litade p\u00e5 handskriven SQL.&nbsp;<\/p>\n<p>Det fanns ocks\u00e5 ett lager av dom\u00e4nmodeller och allm\u00e4nna hj\u00e4lparklasser, till exempel klassen Order, som lagrade best\u00e4llningen. D\u00e4r fanns ocks\u00e5 en hj\u00e4lpare f\u00f6r att konvertera visningstexten baserat p\u00e5 den valda valutan.<\/p>\n<p>Allt detta kan representeras av en s\u00e5dan modell: <\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Best\u00e4llningens v\u00e4g<\/h4>\n<p>L\u00e5t oss titta p\u00e5 en f\u00f6renklad initial v\u00e4g f\u00f6r att skapa en s\u00e5dan best\u00e4llning.<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>I b\u00f6rjan var webbplatsen statisk. Den hade priser och \u00f6verst fanns telefonnumret och texten \"Vill du ha pizza \u2014 ring numret f\u00f6r att best\u00e4lla\". F\u00f6r att g\u00f6ra en best\u00e4llning beh\u00f6ver vi genomf\u00f6ra ett enkelt fl\u00f6de:&nbsp;<\/p>\n<ul>\n<li>\n<p>Kunden g\u00e5r in p\u00e5 den statiska webbplatsen med priser, v\u00e4ljer produkter och ringer numret som anges p\u00e5 webbplatsen.<\/p>\n<\/li>\n<li>\n<p>Kunden n\u00e4mner de produkter som han vill l\u00e4gga till i best\u00e4llningen.<\/p>\n<\/li>\n<li>\n<p>Han n\u00e4mner sin adress och namn.<\/p>\n<\/li>\n<li>\n<p>Operat\u00f6ren tar emot best\u00e4llningen.<\/p>\n<\/li>\n<li>\n<p>Best\u00e4llningen visas i gr\u00e4nssnittet f\u00f6r mottagna best\u00e4llningar.<\/p>\n<\/li>\n<\/ul>\n<p>Allt b\u00f6rjar med att visa menyn. En inloggad anv\u00e4ndaroperat\u00f6r kan endast ta ett enda best\u00e4llning vid en given tidpunkt. D\u00e4rf\u00f6r kan draft-korgen lagras i hans session (anv\u00e4ndarens session lagras i minnet). D\u00e4r finns ett objekt Cart, som inneh\u00e5ller produkter och information om kunden.<\/p>\n<p>Kunden n\u00e4mner produkten, operat\u00f6ren klickar p\u00e5 <code>+<\/code> bredvid produkten och en beg\u00e4ran skickas till servern. Informationen om produkten h\u00e4mtas fr\u00e5n databasen och l\u00e4ggs till i korgen.<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Anm\u00e4rkning<\/strong>. Ja, h\u00e4r beh\u00f6ver man inte h\u00e4mta produkten fr\u00e5n databasen, utan kan \u00f6verf\u00f6ra den fr\u00e5n front-end. Men f\u00f6r tydlighetens skull visade jag just v\u00e4gen fr\u00e5n databasen.&nbsp;<\/p>\n<p>D\u00e4refter skriver vi in kundens adress och namn.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Vid klick p\u00e5 \"Skapa best\u00e4llning\":<\/p>\n<ul>\n<li>\n<p>Skickar vi beg\u00e4ran till OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>Vi f\u00e5r Cart fr\u00e5n sessionen, d\u00e4r ligger produkterna i den m\u00e4ngd vi beh\u00f6ver.<\/p>\n<\/li>\n<li>\n<p>Vi kompletterar Cart med kundinformation och \u00f6verf\u00f6r det till metoden AddOrder i klassen ReceivingOrderService, d\u00e4r den sparas i databasen.&nbsp;<\/p>\n<\/li>\n<li>\n<p>I databasen finns tabeller med best\u00e4llningar, best\u00e4llningens inneh\u00e5ll, kunden, och de \u00e4r alla kopplade.<\/p>\n<\/li>\n<li>\n<p>Gr\u00e4nssnittet f\u00f6r att visa best\u00e4llningar g\u00e5r och h\u00e4mtar de senaste best\u00e4llningarna och visar dem.<\/p>\n<\/li>\n<\/ul>\n<h4>Nya moduler<\/h4>\n<p>Att ta emot best\u00e4llningar var viktigt och n\u00f6dv\u00e4ndigt. Man kan inte bedriva en pizzeriabusiness utan en best\u00e4llningsmottagning. D\u00e4rf\u00f6r b\u00f6rjade systemet att bygga p\u00e5 funktioner \u2013 ungef\u00e4r mellan 2012 och 2015. Under denna tid uppstod m\u00e5nga olika delar av systemet, som jag kommer att kalla <strong>moduler<\/strong>, i motsats till begreppet tj\u00e4nst eller produkt.&nbsp;<\/p>\n<p>En modul \u00e4r en upps\u00e4ttning funktioner som \u00e4r f\u00f6renade av ett gemensamt aff\u00e4rsm\u00e5l. Samtidigt finns de fysiskt i en enda applikation.<\/p>\n<p>Moduler kan kallas block i systemet. Till exempel \u00e4r detta modul f\u00f6r rapporter, admingr\u00e4nssnitt, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>produktsp\u00e5rning i k\u00f6ket<\/u><\/a><\/noindex>, autentisering. Det \u00e4r alla olika gr\u00e4nssnitt f\u00f6r anv\u00e4ndaren, och vissa har till och med olika visuella stilar. Samtidigt \u00e4r alla inom en enda applikation, en enda fungerande process.&nbsp;<\/p>\n<p>Tekniskt sett var modulerna utformade som Area (denna id\u00e9 kvarstod till och med i <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>). Det fanns separata filer f\u00f6r frontend, modeller, samt egna kontrollerklasser. Resultatet blev att systemet omvandlades fr\u00e5n en s\u00e5dan\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026till s\u00e5dan:<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Vissa moduler implementerades som separata webbplatser (exekverbara projekt) p\u00e5 grund av deras helt olika funktionalitet och delvis p\u00e5 grund av en mer separat, mer fokuserad utveckling. Dessa \u00e4r:<\/p>\n<ul>\n<li>\n<p><strong>Webbplats<\/strong> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2013\/08\/06\/new_site_dodopizza_ru\/\"><u>den f\u00f6rsta versionen av<\/u><\/a><\/noindex> webbplatsen dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Exportera<\/strong>: export av rapporter fr\u00e5n Dodo IS till 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Personlig<\/strong> \u2014 den personliga inloggningen f\u00f6r anst\u00e4llda. Utvecklades separat och har sin egen ing\u00e5ngspunkt och design.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 projektet f\u00f6r hosting av statisk inneh\u00e5ll. Senare \u00f6vergick vi fr\u00e5n det och flyttade all statisk till CDN Akamai.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>\u00d6vriga block l\u00e5g i BackOffice-applikationen.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>F\u00f6rklaring av namnen:<\/p>\n<ul>\n<li>\n<p>Cashier \u2014 Restaurangens kassa.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 gr\u00e4nssnitt f\u00f6r rollen \"Skiftledare\": aktuell statistik \u00f6ver pizzaf\u00f6rs\u00e4ljningar, m\u00f6jlighet att s\u00e4tta produkter p\u00e5 stopplistan, \u00e4ndra best\u00e4llningar.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 gr\u00e4nssnitt f\u00f6r rollerna \"Pizzeriaansvarig\" och \"Franchisetagare\". H\u00e4r samlas funktioner f\u00f6r att konfigurera pizzerian, dess bonuskampanjer, hantering av anst\u00e4llda, rapporter.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 gr\u00e4nssnitt f\u00f6r TV-apparater och tabletter som h\u00e4nger i pizzerior. P\u00e5 TV:erna visas menyn, reklaminformation och best\u00e4llningsstatus vid leverans.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>De anv\u00e4nde ett gemensamt tj\u00e4nstelager, en gemensam block av dom\u00e4nklasser Dodo.Core, samt en gemensam databas. Ibland kunde de ocks\u00e5 g\u00f6ra \u00f6verg\u00e5ngar mellan varandra. \u00c4ven separata webbplatser, s\u00e5som dodopizza.ru eller personal.dodopizza.ru, kopplade till gemensamma tj\u00e4nster.<\/p>\n<p>Vid introduktionen av nya moduler str\u00e4vade de efter att \u00e5teranv\u00e4nda redan skapad kod f\u00f6r tj\u00e4nster, lagrade procedurer och tabeller i databasen s\u00e5 mycket som m\u00f6jligt.&nbsp;<\/p>\n<p>F\u00f6r att b\u00e4ttre f\u00f6rst\u00e5 omfattningen av modulerna som skapades i systemet, h\u00e4r \u00e4r en diagram fr\u00e5n 2012 med utvecklingsplaner:<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u00c5r 2015 var allt p\u00e5 diagrammet och till och med mer i produktion.<\/p>\n<ul>\n<li>\n<p>Best\u00e4llningsmottagningen utvecklades till en separat del av Kontaktcentret, d\u00e4r best\u00e4llningar tas emot av operat\u00f6rer.<\/p>\n<\/li>\n<li>\n<p>Det d\u00f6k upp offentliga sk\u00e4rmar med menyer och information som h\u00e4nger i pizzerior.<\/p>\n<\/li>\n<li>\n<p>I k\u00f6ket finns en modul som automatiskt \u00e5terger r\u00f6stmeddelandet \"Ny pizza\" n\u00e4r en ny best\u00e4llning kommer in och skriver ut en f\u00f6ljesedel f\u00f6r kuriren. Detta f\u00f6renklar processerna i k\u00f6ket och g\u00f6r att personalen kan fokusera mindre p\u00e5 ett stort antal enkla uppgifter.<\/p>\n<\/li>\n<li>\n<p>Leveransblocket blev en separat Leveranskassa, d\u00e4r best\u00e4llningen gavs till kuriren som tidigare st\u00e4llt sig p\u00e5 skift. Hans arbetstid beaktades f\u00f6r att ber\u00e4kna l\u00f6nen.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Parallellt, fr\u00e5n 2012 till 2015, kom mer \u00e4n 10 utvecklare och 35 pizzerior \u00f6ppnades, systemet rullades ut i Rum\u00e4nien och f\u00f6rbereddes f\u00f6r \u00f6ppning av punkter i USA. Utvecklarna sysslade inte l\u00e4ngre med alla uppgifter utan delades upp i team, d\u00e4r varje team specialiserade sig p\u00e5 sin del av systemet.&nbsp;<\/p>\n<h3>Problem<\/h3>\n<p>Delvis p\u00e5 grund av arkitekturen (men inte bara).<\/p>\n<h4>Kaos i databasen<\/h4>\n<p>En databas \u00e4r praktiskt. I den kan man uppn\u00e5 konsekvens, dels tack vare funktioner inbyggda i relationsdatabaser. Att arbeta med den \u00e4r bekant och praktiskt, s\u00e4rskilt om det finns f\u00e5 tabeller och lite data.<\/p>\n<p>Men under fyra \u00e5rs utveckling fanns det runt 600 tabeller och 1500 lagrade procedurer, m\u00e5nga med egen logik. Tyv\u00e4rr ger lagrade procedurer inte n\u00e5got s\u00e4rskilt f\u00f6rdel vid arbete med MySQL. De cachas inte av databasen och att lagra logik i dem f\u00f6rsv\u00e5rar utvecklingen och fels\u00f6kningen. \u00c5teranv\u00e4ndning av kod \u00e4r ocks\u00e5 besv\u00e4rligt.<\/p>\n<p><strong>M\u00e5nga tabeller hade inte l\u00e4mpliga index.<\/strong>\u00c5 andra sidan fanns det, i vissa fall, v\u00e4ldigt m\u00e5nga index, vilket f\u00f6rsv\u00e5rade ins\u00e4ttning. Det beh\u00f6vde modifieras runt 20 tabeller \u2014 transaktionen f\u00f6r att skapa en best\u00e4llning kunde ta runt 3-5 sekunder.&nbsp;<\/p>\n<p><strong>Data i tabellerna var inte alltid i den mest l\u00e4mpliga formen.<\/strong>I vissa fall beh\u00f6vdes denormalisering. En del data som regelbundet mottogs var i en kolumn i form av en XML-struktur, vilket \u00f6kade exekveringstiden, f\u00f6rl\u00e4ngde f\u00f6rfr\u00e5gningarna och f\u00f6rsv\u00e5rade utvecklingen.<\/p>\n<p>Det gjordes mycket <strong>heterogena fr\u00e5gor mot samma tabeller.<\/strong>S\u00e4rskilt drabbades popul\u00e4ra tabeller, som den n\u00e4mnda tabellen <em>orders<\/em> eller tabellen <em>pizzeria.<\/em>De anv\u00e4ndes f\u00f6r att visa operativa gr\u00e4nssnitt i k\u00f6ket, f\u00f6r analys. \u00c4ven webbplatsen<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>, som n\u00e4r som helst kunde f\u00e5 m\u00e5nga pl\u00f6tsliga f\u00f6rfr\u00e5gningar.&nbsp;<\/p>\n<p><strong>Data var inte aggregerade<\/strong> och m\u00e5nga ber\u00e4kningar skedde p\u00e5 flyktiga s\u00e4tt av databasen. Detta skapade on\u00f6diga ber\u00e4kningar och extra belastning.&nbsp;<\/p>\n<p>Koden gick ofta till databasen n\u00e4r den inte beh\u00f6vde g\u00f6ra det. I vissa fall saknades massoperationer, i andra fall beh\u00f6vde en fr\u00e5ga delas upp i flera genom koden f\u00f6r att \u00f6ka hastigheten och f\u00f6rb\u00e4ttra tillf\u00f6rlitligheten.&nbsp;<\/p>\n<h4>Koppling och f\u00f6rvirring i koden<\/h4>\n<p><strong>Modulerna, som skulle ansvara f\u00f6r sitt aff\u00e4rsomr\u00e5de, gjorde det inte \u00e4rligt.<\/strong>. Vissa av dem hade dubbleringar i funktionerna f\u00f6r rollerna. Till exempel, f\u00f6r en lokal marknadsf\u00f6rare som ansvarade f\u00f6r n\u00e4tverkets marknadsf\u00f6ringsaktiviteter i sin stad, var det n\u00f6dv\u00e4ndigt att anv\u00e4nda b\u00e5de \"Admin\"-gr\u00e4nssnittet (f\u00f6r att skapa kampanjer) och \"Kontorschef\"-gr\u00e4nssnittet (f\u00f6r att se kampanjernas p\u00e5verkan p\u00e5 aff\u00e4rerna). Sj\u00e4lvklart anv\u00e4nde b\u00e5da modulerna en gemensam tj\u00e4nst som hanterade bonuskampanjer.<\/p>\n<p>Tj\u00e4nster (klasser inom ett stort monolitiskt projekt) kunde anropa varandra f\u00f6r att berika sina data.<\/p>\n<p>Sj\u00e4lva klassmodellerna som lagrade data, <strong>arbetade i koden p\u00e5 olika s\u00e4tt<\/strong>. P\u00e5 vissa st\u00e4llen fanns konstruktorer d\u00e4r man kunde ange obligatoriska f\u00e4lt. P\u00e5 andra st\u00e4llen gjordes detta via publika egenskaper. Sj\u00e4lvklart var det varierande hur data h\u00e4mtades och omvandlades fr\u00e5n databasen.&nbsp;<\/p>\n<p><strong>Logiken l\u00e5g antingen i kontrollerna eller i servicelaser.<\/strong>&nbsp;<\/p>\n<p>Detta kan verka vara sm\u00e5 problem, men de f\u00f6rdr\u00f6jde utvecklingen avsev\u00e4rt och f\u00f6rs\u00e4mrade kvaliteten, vilket ledde till instabilitet och fel.&nbsp;<\/p>\n<h4>Sv\u00e5righeterna med stor utveckling<\/h4>\n<p><strong>Sv\u00e5righeter uppstod \u00e4ven i sj\u00e4lva utvecklingen<\/strong>. Det beh\u00f6vdes olika block i systemet, vilket innebar att man var tvungen att arbeta parallellt. Att rymma behoven hos varje komponent i en gemensam kod blev allt sv\u00e5rare. Det var inte l\u00e4tt att komma \u00f6verens och tillfredsst\u00e4lla alla komponenter samtidigt. Dessutom fanns det begr\u00e4nsningar i teknologierna, s\u00e4rskilt vad g\u00e4llde databasen och frontend. Man var tvungen att \u00f6verge jQuery till f\u00f6rm\u00e5n f\u00f6r h\u00f6gre niv\u00e5er av ramverk, s\u00e4rskilt n\u00e4r det g\u00e4llde klienttj\u00e4nster (webbplatsen).<\/p>\n<p><strong>I vissa delar av systemet kunde databaser som passade b\u00e4ttre f\u00f6r detta anv\u00e4ndas,<\/strong>. Till exempel hade vi senare ett exempel p\u00e5 att vi gick fr\u00e5n Redis till CosmosDB f\u00f6r att lagra kundvagnen.&nbsp;<\/p>\n<p>Team och utvecklare som arbetade inom sina omr\u00e5den ville uppenbart ha st\u00f6rre sj\u00e4lvst\u00e4ndighet f\u00f6r sina tj\u00e4nster, b\u00e5de n\u00e4r det g\u00e4llde utveckling och distribution. Konflikter vid sammanslagningar och problem vid release. Om denna fr\u00e5ga var obetydlig f\u00f6r 5 utvecklare, skulle den bli allvarligare med 10, och s\u00e4rskilt med den planerade tillv\u00e4xten. Dessutom skulle utvecklingen av en mobilapplikation f\u00f6lja (den startade 2017, och 2018 var det) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">ett stort fall.<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>Olika delar av systemet kr\u00e4vde olika stabilitetsm\u00e5tt.<\/strong>, men p\u00e5 grund av systemets starka kopplingar kunde vi inte s\u00e4kerst\u00e4lla detta. Ett fel vid utvecklingen av en ny funktion i adminpanelen kunde mycket v\u00e4l ha p\u00e5verkat best\u00e4llningsmottagningen p\u00e5 webbplatsen, eftersom koden \u00e4r gemensam och \u00e5teranv\u00e4ndbar, och databasen och data ocks\u00e5 \u00e4r enhetliga.<\/p>\n<p>Det skulle nog ha varit m\u00f6jligt att undvika dessa fel och problem inom en s\u00e5dan monolitisk-modul\u00e4r arkitektur: att g\u00f6ra en tydlig ansvarsf\u00f6rdelning, genomf\u00f6ra refaktorering av b\u00e5de koden och databasen, klart separera lagren fr\u00e5n varandra, och \u00f6vervaka kvaliteten varje dag. Men de valda arkitektoniska besluten och fokus p\u00e5 snabb funktionsexpansion ledde till problem med stabiliteten.<\/p>\n<h4>Hur bloggen Sila Uma bidrog till kassor i restauranger<\/h4>\n<p>Om tillv\u00e4xten av pizzakedjan (och belastningen) hade fortsatt i samma takt, skulle fallen s\u00e5 sm\u00e5ningom ha blivit s\u00e5 stora att systemet inte skulle kunna \u00e5terh\u00e4mta sig. En historia som tydligt illustrerar de problem vi b\u00f6rjade m\u00f6ta runt 2015.&nbsp;<\/p>\n<p>I bloggen \u201c<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>Sila Uma<\/u><\/a><\/noindex>\u201d fanns det en widget som visade int\u00e4ktsdata f\u00f6r hela kedjan under ett \u00e5r. Widgeten gjorde anrop till Dodo's offentliga API, som tillhandah\u00e5ller dessa uppgifter. Nu finns denna statistik tillg\u00e4nglig p\u00e5 <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. Widgeten visades p\u00e5 varje sida och gjorde anrop var 20:e sekund. Anropet gick till api.dodopizza.ru och beg\u00e4rde:<\/p>\n<ul>\n<li>\n<p>antal pizzarestauranger i kedjan;<\/p>\n<\/li>\n<li>\n<p>den totala int\u00e4kten f\u00f6r kedjan sedan \u00e5rets b\u00f6rjan;<\/p>\n<\/li>\n<li>\n<p>int\u00e4kten f\u00f6r idag.<\/p>\n<\/li>\n<\/ul>\n<p>Statistikf\u00f6rfr\u00e5gan om int\u00e4kter gick direkt till databasen och b\u00f6rjade beg\u00e4ra data om best\u00e4llningar, aggregera data i realtid och returnera summan.&nbsp;<\/p>\n<p>I samma best\u00e4llningstabell gick kassorna i restauranger, de laddade upp listan \u00f6ver best\u00e4llningar som tagits emot idag, och nya best\u00e4llningar lades ocks\u00e5 till. Kassorna gjorde sina f\u00f6rfr\u00e5gningar var 5:e sekund eller vid siduppdateringar.<\/p>\n<p>Schemat s\u00e5g ut s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>En h\u00f6st skrev Fedor Ovchinnikov en l\u00e5ng och popul\u00e4r artikel p\u00e5 sin blogg. M\u00e5nga m\u00e4nniskor kom till bloggen och b\u00f6rjade l\u00e4sa noggrant. Medan varje bes\u00f6kare l\u00e4ste artikeln fungerade widgeten f\u00f6r int\u00e4kter som den skulle och beg\u00e4rde API var 20:e sekund.<\/p>\n<p>API anropade en lagrad procedur f\u00f6r att ber\u00e4kna summan av alla best\u00e4llningar sedan b\u00f6rjan av \u00e5ret fr\u00e5n alla pizzerior i kedjan. Aggreringen skedde i tabellen orders, som var mycket popul\u00e4r. Denna tabell innefattade alla kassor fr\u00e5n alla \u00f6ppna restauranger vid den tidpunkten. Kassorna slutade svara, best\u00e4llningar togs inte emot. Dessutom kunde inte best\u00e4llningar g\u00f6ras fr\u00e5n webbplatsen, de d\u00f6k inte upp p\u00e5 trackern och skiftchefen kunde inte se dem i sitt gr\u00e4nssnitt.&nbsp;<\/p>\n<p>Detta \u00e4r inte den enda historien. Fram till h\u00f6sten 2015 var belastningen p\u00e5 systemet kritisk varje fredag. Flera g\u00e5nger st\u00e4ngde vi ner det offentliga API:et, och en g\u00e5ng var vi till och med tvungna att st\u00e4nga av webbplatsen eftersom ingenting hj\u00e4lpte. Det fanns till och med en lista \u00f6ver tj\u00e4nster med ordningen f\u00f6r avst\u00e4ngning vid allvarliga belastningar.<\/p>\n<p>Fr\u00e5n och med den tidpunkten b\u00f6rjade v\u00e5r kamp mot belastningar och f\u00f6r stabilisering av systemet (fr\u00e5n h\u00f6sten 2015 till h\u00f6sten 2018). Det var just d\u00e5 som \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Det stora fallet<\/u><\/a><\/noindex>\" intr\u00e4ffade. \u00c4ven efter det intr\u00e4ffade ibland st\u00f6rningar, vissa var ganska k\u00e4nsliga, men den \u00f6vergripande perioden av instabilitet kan nu betraktas som \u00f6verkommen.<\/p>\n<h4>Den kraftiga tillv\u00e4xten av verksamheten<\/h4>\n<p>Varf\u00f6r kunde man inte \"g\u00f6ra det bra fr\u00e5n b\u00f6rjan\"? Man beh\u00f6ver bara titta p\u00e5 f\u00f6ljande diagram.<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Det fanns \u00e4ven en \u00f6ppning i Rum\u00e4nien 2014-2015 och en plan f\u00f6r en \u00f6ppning i USA.<\/p>\n<p>N\u00e4tverket v\u00e4xte mycket snabbt, nya l\u00e4nder \u00f6ppnades, nya format av pizzerior d\u00f6k upp, till exempel en pizzeria i en food court. Allt detta kr\u00e4vde betydande uppm\u00e4rksamhet till utvidgningen av funktioner i Dodo IS. Utan alla dessa funktioner, utan sp\u00e5rning i k\u00f6ket, hantering av ingredienser och f\u00f6rluster i systemet, samt visning av best\u00e4llningar i food courten, skulle vi troligen inte diskutera \"r\u00e4tt\" arkitektur och \"r\u00e4tt\" metodik f\u00f6r utveckling.<\/p>\n<p>Ytterligare hinder f\u00f6r en snabb \u00f6versyn av arkitekturen och \u00f6verhuvudtaget uppm\u00e4rksamheten p\u00e5 tekniska problem var krisen 2014. S\u00e5dana situationer sl\u00e5r h\u00e5rt mot tillv\u00e4xtm\u00f6jligheterna f\u00f6r team, s\u00e4rskilt f\u00f6r ett ungt f\u00f6retag som Dodo Pizza.<\/p>\n<h3>Snabba l\u00f6sningar som hj\u00e4lpte<\/h3>\n<p>Problemen kr\u00e4vde l\u00f6sningar. Villkorligt kan l\u00f6sningarna delas in i tv\u00e5 grupper:<\/p>\n<ul>\n<li>\n<p>Snabba, som sl\u00e4cker brand och ger en liten buffert samt vinner oss tid f\u00f6r f\u00f6r\u00e4ndringar.<\/p>\n<\/li>\n<li>\n<p>Systematiska och d\u00e4rmed l\u00e5ngsamma. Reengineering av flera moduler, uppdelning av den monolitiska arkitekturen i separata tj\u00e4nster (de flesta av dem \u00e4r inte mikro utan snarare makrotj\u00e4nster och detta \u00e4r det som finns) <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>Andrey Morevsky rapport<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Den korta listan \u00f6ver snabba f\u00f6r\u00e4ndringar \u00e4r som f\u00f6ljande:<\/p>\n<h4>Skala upp masterdatabasen<\/h4>\n<p>Sj\u00e4lvklart, det f\u00f6rsta som g\u00f6rs f\u00f6r att hantera belastningarna \u00e4r att \u00f6ka serverns kapacitet. Detta gjordes f\u00f6r masterdatabasen och f\u00f6r webservrarna. Tyv\u00e4rr \u00e4r detta endast m\u00f6jligt upp till en viss gr\u00e4ns, efter det blir det f\u00f6r dyrt.<\/p>\n<p>Sedan 2014 har vi \u00f6verg\u00e5tt till Azure, om detta skrev vi ocks\u00e5 vid den tiden i artikeln \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">Hur Dodo Pizza levererar pizza med hj\u00e4lp av Microsoft Azure molnet<\/a><\/noindex>\". Men efter en serie av server\u00f6kningar f\u00f6r databasen n\u00e5dde vi en kostnadsgr\u00e4ns.&nbsp;<\/p>\n<h4>L\u00e4sreplicor f\u00f6r databasen<\/h4>\n<p>Det gjordes tv\u00e5 repliker f\u00f6r databasen:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>f\u00f6r f\u00f6rfr\u00e5gningar om referenser<\/strong>. Den anv\u00e4nds f\u00f6r att l\u00e4sa referenser, typ stad, gata, pizzerior, produkter (l\u00e5ngsamt f\u00f6r\u00e4ndrad dom\u00e4n), och i de gr\u00e4nssnitt d\u00e4r en liten f\u00f6rdr\u00f6jning \u00e4r acceptabel. Dessa repliker var 2, vi s\u00e4kerst\u00e4llde deras tillg\u00e4nglighet likv\u00e4l som f\u00f6r m\u00e4staren.<\/p>\n<p><strong>ReadReplica f\u00f6r rapportf\u00f6rfr\u00e5gningar<\/strong>. Denna databas hade l\u00e4gre tillg\u00e4nglighet, men alla rapporter gick genom den. \u00c4ven om den hade tunga f\u00f6rfr\u00e5gningar om enorma databer\u00e4kningar, p\u00e5verkar de inte masterdatabasen eller operationella gr\u00e4nssnitt.&nbsp;<\/p>\n<h4>Cache i koden<\/h4>\n<p>Det fanns inga cacher i koden (alls). Detta ledde till ytterligare, inte alltid n\u00f6dv\u00e4ndiga, f\u00f6rfr\u00e5gningar i den belastade databasen. Cacher fanns f\u00f6rst b\u00e5de i minnet och p\u00e5 en extern cachningstj\u00e4nst, det var Redis. Allt invalidierades efter en viss tid, inst\u00e4llningarna angavs i koden.<\/p>\n<h4>Flera servrar f\u00f6r backend<\/h4>\n<p>Backend f\u00f6r applikationen beh\u00f6vde ocks\u00e5 skalas upp f\u00f6r att hantera \u00f6kade belastningar. Det var n\u00f6dv\u00e4ndigt att g\u00f6ra en kluster fr\u00e5n en iis-server. Vi flyttade <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>applikationssessionen<\/u><\/a><\/noindex> fr\u00e5n minnet till RedisCache, vilket m\u00f6jliggjorde flera servrar bakom en enkel lastbalanserare med round robin. F\u00f6rst anv\u00e4ndes samma Redis som f\u00f6r cacherna, sedan f\u00f6rdelade vi det p\u00e5 flera.&nbsp;<\/p>\n<p>Resultatet blev en mer komplex arkitektur\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Historien bakom Dodo IS-arkitekturen: tidig monolit\" src=\"\/wp-content\/uploads\/2020\/10\/70a3e8d5578469239c08b4759ab32264.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026men en del av trycket lyckades vi avlasta.<\/p>\n<p>Och d\u00e4refter beh\u00f6vdes det g\u00f6ras om belastade komponenter, vilket vi satte ig\u00e5ng med. Om detta kommer vi att ber\u00e4tta i n\u00e4sta del.<\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Historien om Dodo IS-arkitekturen: tidig monolit | ProHoster","description":"Eller varje olycklig f\u00f6retag med en monolit \u00e4r olycklig p\u00e5 sitt eget s\u00e4tt. Utvecklingen av Dodo IS-systemet b\u00f6rjade omedelbart, precis som Dodo Pizzas aff\u00e4r - 2011.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/95804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=95804"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/95804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/95805"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=95804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=95804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=95804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}