{"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\/da\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","title":{"rendered":"The Architecture of Dodo IS History: Early Monolith","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Eller er hver ulykkelig virksomhed med en monolit ulykkelig p\u00e5 sin egen m\u00e5de.<\/p>\n<p>Udviklingen af Dodo IS-systemet begyndte straks som Dodo Pizza-virksomheden \u2014 i 2011. Grundid\u00e9en var at fuldst\u00e6ndigt og totalt digitalisere forretningsprocesserne, og <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>det med egne ressourcer<\/u><\/a><\/noindex>, hvilket allerede dengang i 2011 vakte mange sp\u00f8rgsm\u00e5l og skepsis. Men nu har vi i 9 \u00e5r v\u00e6ret p\u00e5 denne vej \u2014 med egen udvikling, der startede med en monolit.<\/p>\n<p>Denne artikel er 'svaret' p\u00e5 sp\u00f8rgsm\u00e5lene 'Hvorfor genopbygge arkitekturen og lave s\u00e5 store og langsommelige \u00e6ndringer?' til den tidligere artikel <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\u00abHistorien om Dodo IS-arkitekturen: vej til backoffice\u00bb<\/u><\/a><\/noindex>. Jeg vil starte med, hvordan udviklingen af Dodo IS begyndte, hvordan den oprindelige arkitektur s\u00e5 ud, hvordan nye moduler blev til, og hvilke problemer der fik os til at gennemf\u00f8re omfattende \u00e6ndringer.<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>Artikelsserien \u00abHvad er Dodo IS?\u00bb vil fort\u00e6lle om:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>Den tidlige monolit i Dodo IS (2011-2015). (Du er her)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">Vejen til backoffice: adskilte databaser og bus<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>Vejen til klientdelen: facade over databasen (2016-2017). (I gang\u2026)<\/p>\n<\/li>\n<li>\n<p>Historien om \u00e6gte mikrotjenester. (2018-2019). (I gang\u2026)<\/p>\n<\/li>\n<li>\n<p>Den fuldst\u00e6ndige nedbrydning af monolitten og stabilisering af arkitekturen. (I gang\u2026)<\/p>\n<\/li>\n<\/ol>\n<h3>Den oprindelige arkitektur<\/h3>\n<p>I 2011 s\u00e5 Dodo IS-arkitekturen s\u00e5ledes ud:<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Det f\u00f8rste modul i arkitekturen er ordreaccept. Forretningsprocessen var s\u00e5dan:<\/p>\n<ul>\n<li>\n<p>kunden ringer til pizzariaet;<\/p>\n<\/li>\n<li>\n<p>en manager besvarer opkaldet;<\/p>\n<\/li>\n<li>\n<p>modtager ordren telefonisk;<\/p>\n<\/li>\n<li>\n<p>taster den samtidig ind i ordreacceptgr\u00e6nsefladen: oplysninger om kunden, detaljerne om ordren, leveringsadressen tages i betragtning.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Brugergr\u00e6nsefladen for informationssystemet s\u00e5 ud omtrent s\u00e5dan her...<\/p>\n<p>F\u00f8rste version fra 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>Lidt forbedret i januar 2012<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/h2Cdht01gDA\">Informationssystem for Dodo Pizza Delivery Pizza Restaurant<\/a><\/noindex><\/p>\n<p>Ressourcerne til udviklingen af det f\u00f8rste ordreacceptmodul var begr\u00e6nsede. Der skulle laves meget, hurtigt og med f\u00e5 personer. F\u00e5 personer \u2014 det var 2 udviklere, der lagde fundamentet for hele det fremtidige system.<\/p>\n<p>Deres f\u00f8rste beslutning bestemte den videre sk\u00e6bne for teknologistakken:<\/p>\n<ul>\n<li>\n<p>Backend p\u00e5 ASP.NET MVC, programmeringssprog C#. Udviklerne var .NET-programm\u00f8rer, og denne stak var kendt og behagelig for dem. <\/p>\n<\/li>\n<li>\n<p>Frontend p\u00e5 Bootstrap og JQuery: brugergr\u00e6nseflader med egne stilarter og scripts.&nbsp;<\/p>\n<\/li>\n<li>\n<p>MySQL-database: uden licensomkostninger, nem at bruge.<\/p>\n<\/li>\n<li>\n<p>Servere p\u00e5 Windows Server, fordi .NET dengang kun kunne k\u00f8re p\u00e5 Windows (vi lader mono ligge).<\/p>\n<\/li>\n<\/ul>\n<p>Fysisk udtrykte det hele sig i \"dedikationen hos hosten\".&nbsp;<\/p>\n<h4>Arkitekturen for bestillingsmodtagelsesapplikationen<\/h4>\n<p>P\u00e5 det tidspunkt talte alle om mikroservices, mens SOA blev brugt i store projekter i cirka 5 \u00e5r; WCF blev eksempelvis lanceret i 2006. Men dengang valgte man en p\u00e5lidelig og testet l\u00f8sning.<\/p>\n<p>Her er den.<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/688da7d4e02a6310bf7d2da1b767fe10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asp.Net MVC er Razor, der ved anmodning fra formularen eller fra klienten genererer en HTML-side med rendering p\u00e5 serveren. P\u00e5 klienten viser CSS og JS-scripts oplysningerne og udf\u00f8rer, om n\u00f8dvendigt, AJAX-anmodninger via JQuery.<\/p>\n<p>Anmodningerne p\u00e5 serveren havner i klasserne *Controller, hvor metoden behandler og genererer den endelige HTML-side. Controllerne foretager anmodninger til logiklaget, kaldet *Services. Hver service svarede til et aspekt af forretningen:<\/p>\n<ul>\n<li>\n<p>For eksempel gav DepartmentStructureService oplysninger om pizzarierne, om afdelingerne. En afdeling er en gruppe pizzarier under ledelse af en franchisetager.<\/p>\n<\/li>\n<li>\n<p>ReceivingOrdersService tog imod og beregnede indholdet af bestillingen.<\/p>\n<\/li>\n<li>\n<p>SmsService sendte SMS'er ved at kalde API-tjenester til sending af SMS'er.<\/p>\n<\/li>\n<\/ul>\n<p>Tjenesterne behandlede data fra databasen og opbevarede forretningslogikken. Hver service havde en eller flere *Repository med det relevante navn. Her l\u00e5 anmodningerne til de gemte procedurer i databasen samt mapperlaget. I de gemte procedurer var der forretningslogik, is\u00e6r meget i dem, der genererede rapportdata. ORM blev ikke brugt, alle stolede p\u00e5 h\u00e5ndskrevet SQL.&nbsp;<\/p>\n<p>Der var ogs\u00e5 et lag af dom\u00e6nemodel og generelle hj\u00e6lpeklasser, for eksempel klassen Order, der opbevarede bestillingen. Her l\u00e5 ogs\u00e5 en hj\u00e6lper til at omforme visningsteksten baseret p\u00e5 den valgte valuta.<\/p>\n<p>Alt dette kan repr\u00e6senteres med denne model: <\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Bestillingsvejen<\/h4>\n<p>Lad os se p\u00e5 en forenklet oprindelig vej til oprettelse af en s\u00e5dan bestilling.<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Oprindeligt var hjemmesiden statisk. Der var priser, og \u00f8verst stod telefonnummeret samt teksten \"Vil du have pizza \u2014 ring til nummeret og bestil\". For at kunne bestille, skal vi implementere et simpelt flow:&nbsp;<\/p>\n<ul>\n<li>\n<p>Klienten g\u00e5r ind p\u00e5 den statiske hjemmeside med priserne, v\u00e6lger produkter og ringer til det nummer, der st\u00e5r p\u00e5 hjemmesiden.<\/p>\n<\/li>\n<li>\n<p>Klienten oplyser de produkter, han \u00f8nsker at tilf\u00f8je til bestillingen.<\/p>\n<\/li>\n<li>\n<p>Oplyser sin adresse og navn.<\/p>\n<\/li>\n<li>\n<p>Operat\u00f8ren tager imod bestillingen.<\/p>\n<\/li>\n<li>\n<p>Bestillingen vises i gr\u00e6nsefladen for modtagne bestillinger.<\/p>\n<\/li>\n<\/ul>\n<p>Det hele starter med visningen af menuen. Den loggede bruger-operator accepterer kun \u00e9n ordre ad gangen. Derfor kan draft-kurven gemmes i hans session (brugerens session opbevares i hukommelsen). Her findes et objekt Cart, hvor produkterne og informationen om kunden gemmes.<\/p>\n<p>Kunden n\u00e6vner produktet, og operat\u00f8ren klikker p\u00e5 <code>+<\/code> ved siden af produktet, og der sendes en foresp\u00f8rgsel til serveren. Der tr\u00e6kkes information om produktet fra databasen og tilf\u00f8jes til kurven.<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Bem\u00e6rk<\/strong>. Ja, her kan man undg\u00e5 at tr\u00e6kke produktet fra databasen og i stedet overf\u00f8re det fra frontend. Men for tydelighedens skyld har jeg vist stien fra databasen.&nbsp;<\/p>\n<p>Derefter indtastes adresse og navn p\u00e5 kunden.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ved klik p\u00e5 \u201eOpret ordre\u201c:<\/p>\n<ul>\n<li>\n<p>Sender vi foresp\u00f8rgslen til OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>Vi henter Cart fra sessionen, hvor produkterne er i den \u00f8nskede m\u00e6ngde.<\/p>\n<\/li>\n<li>\n<p>Vi supplerer Cart med oplysninger om kunden og sender den til metoden AddOrder i klassen ReceivingOrderService, hvor den gemmes i databasen.&nbsp;<\/p>\n<\/li>\n<li>\n<p>I databasen findes der tabeller med ordren, ordresammens\u00e6tningen, kunden, og de er alle forbundet.<\/p>\n<\/li>\n<li>\n<p>Brugergr\u00e6nsefladen til ordrevisning g\u00e5r ind og henter de seneste ordrer og viser dem.<\/p>\n<\/li>\n<\/ul>\n<h4>Nye moduler<\/h4>\n<p>Modtagelse af ordrer var vigtig og n\u00f8dvendig. Man kan ikke drive en pizza-virksomhed, uden at der er en ordrebehandlingssystem til salg. Derfor begyndte systemet at udvikle sig med funktioner fra cirka 2012 til 2015. I l\u00f8bet af denne tid blev der tilf\u00f8jet mange forskellige systemblokke, som jeg vil kalde <strong>moduler<\/strong>, i mods\u00e6tning til begrebet service eller produkt.&nbsp;<\/p>\n<p>Et modul er en samling funktioner, der er samlet omkring et f\u00e6lles forretningsm\u00e5l. Samtidig befinder de sig fysisk i en og samme applikation.<\/p>\n<p>Moduler kan kaldes systemblokke. For eksempel er der dette modul til rapporter, admin-gr\u00e6nseflader, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>produkttracker i k\u00f8kkenet<\/u><\/a><\/noindex>, autorisation. Dette er alle forskellige gr\u00e6nseflader for brugeren, nogle har endda forskellige visuelle stilarter. Alt dette foreg\u00e5r inden for \u00e9n applikation, \u00e9n arbejdsgang.&nbsp;<\/p>\n<p>Teknisk set blev modulerne oprettet som Area (denne id\u00e9 er faktisk stadig bevaret 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>). Der var separate filer til front-end, modeller samt egne controllerklasser. Til sidst blev systemet forvandlet fra s\u00e5dan...<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026til s\u00e5dan:<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nogle moduler er implementeret som separate websteder (udf\u00f8relsesprojekt), p\u00e5 grund af helt s\u00e6rskilt funktionalitet og delvist p\u00e5 grund af mere separat, mere fokuseret udvikling. Dette er:<\/p>\n<ul>\n<li>\n<p><strong>Websted<\/strong> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2013\/08\/06\/new_site_dodopizza_ru\/\"><u>den f\u00f8rste version<\/u><\/a><\/noindex> af webstedet dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Eksport\u00e9r<\/strong>: eksport af rapporter fra Dodo IS til 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Personlig<\/strong> \u2014 medarbejderens personlige konto. Den er udviklet separat og har sin egen adgang og design.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 projekt til hosting af statisk indhold. Senere gik vi v\u00e6k fra det og flyttede alt statisk indhold til CDN Akamai.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>De andre blokke blev placeret i BackOffice-applikationen.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Forklaring af navnene:<\/p>\n<ul>\n<li>\n<p>Cashier \u2014 Restaurantens kasse.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 gr\u00e6nseflader til rollen 'Skiftleder': operationel statistik over pizzariaets salg, mulighed for at s\u00e6tte produkter p\u00e5 stoplisten, \u00e6ndre ordre.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 gr\u00e6nseflader til rollerne 'Pizzarialeder' og 'Franchisetager'. Her findes funktioner til konfiguration af pizzariaet, dets bonuskampagner, modtagelse og arbejde med medarbejdere, rapportering.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 gr\u00e6nseflader til tv'er og tablets, der h\u00e6nger i pizzariaerne. Menuen, reklaminformation og ordrestatus vises p\u00e5 tv'erne ved aflevering.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>De benyttede et f\u00e6lles lag af tjenester, et f\u00e6lles blok af dom\u00e6neklasser Dodo.Core, samt en f\u00e6lles database. Nogle gange kunne de desuden f\u00f8re forbindelser indbyrdes, herunder separate websteder som dodopizza.ru eller personal.dodopizza.ru.<\/p>\n<p>Ved introduktion af nye moduler fors\u00f8gte de at genbruge s\u00e5 meget af den allerede oprettede kode fra tjenester, gemte procedurer og tabeller i databasen som muligt.&nbsp;<\/p>\n<p>For bedre forst\u00e5else af omfanget af de moduler, der er lavet i systemet, her er en skema fra 2012 med udviklingsplaner:<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ved udgangen af 2015 var alt p\u00e5 skemaet og endda mere i produktion.<\/p>\n<ul>\n<li>\n<p>Ordreoptagelsen udviklede sig til en separat del af Kontaktcentret, hvor ordren blev taget af en operat\u00f8r.<\/p>\n<\/li>\n<li>\n<p>Der kom offentligt tilg\u00e6ngelige sk\u00e6rme med menu og information, som h\u00e6nger i pizzariaerne.<\/p>\n<\/li>\n<li>\n<p>I k\u00f8kkenet findes der en modul, der automatisk afspiller den stemmeligde besked 'Ny pizza' ved modtagelse af en ny ordre, samt printer en f\u00f8lgeseddel til kureren. Dette forenkler processerne i k\u00f8kkenet betydeligt og lader medarbejderne undg\u00e5 distraktion fra mange simple opgaver.<\/p>\n<\/li>\n<li>\n<p>Leveringsblokken blev til en separat Leveringskasse, hvor ordren blev udleveret til kureren, som f\u00f8rst havde p\u00e5taget sig en vagt. Hans arbejdstid blev taget med i beregningen af l\u00f8n.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Mellem 2012 og 2015 opstod der mere end 10 udviklere, der \u00e5bnede 35 pizzeriaer, udviklede systemet til Rum\u00e6nien og forberedte \u00e5bningen af steder i USA. Udviklerne besk\u00e6ftigede sig ikke l\u00e6ngere med alle opgaver, men blev delt ind i teams, som hver is\u00e6r specialiserede sig i deres del af systemet.&nbsp;<\/p>\n<h3>Problemer<\/h3>\n<p>Det skyldes delvist arkitekturen (men ikke kun).<\/p>\n<h4>Kaos i databasen<\/h4>\n<p>En database er praktisk. Den kan opn\u00e5 konsistens gennem de v\u00e6rkt\u00f8jer, der er indbygget i relationelle databaser. Det er nemt og behageligt at arbejde med, is\u00e6r hvis der er f\u00e5 tabeller og lidt data.<\/p>\n<p>Men efter 4 \u00e5rs udvikling var der omkring 600 tabeller, 1500 gemte procedurer i databasen, mange af dem med logik. Desv\u00e6rre giver gemte procedurer ikke nogen s\u00e6rlig fordel, n\u00e5r man arbejder med MySQL. De bliver ikke cachet af databasen, og at have logik i dem komplicerer udviklingen og fejlfindingen. Genbrug af kode var ogs\u00e5 besv\u00e6rligt.<\/p>\n<p><strong>Mange tabeller havde ikke passende indekser.<\/strong>Mange steder var der omvendt for mange indekser, hvilket besv\u00e6rliggjorde inds\u00e6ttelse. Det var n\u00f8dvendigt at modificere omkring 20 tabeller \u2014 en transaktion for at oprette en ordre kunne tage 3-5 sekunder.&nbsp;<\/p>\n<p><strong>Dataene i tabellerne var ikke altid i den mest hensigtsm\u00e6ssige form.<\/strong>Nogle steder var det n\u00f8dvendigt med denormalisering. Nogle af de regelm\u00e6ssigt indsendte data var i en kolonne som XML-struktur, hvilket for\u00f8gede behandlingstiden, forl\u00e6ngede foresp\u00f8rgslerne og komplicerede udviklingen.<\/p>\n<p>Der blev udf\u00f8rt meget <strong>forskellige foresp\u00f8rgsler p\u00e5 de samme tabeller.<\/strong>Is\u00e6r led de popul\u00e6re tabeller, som den n\u00e6vnte tabel <em>orders<\/em> eller tabellen <em>pizzeria.<\/em>De blev anvendt til at fremvise operationelle gr\u00e6nseflader i k\u00f8kkenet og til analyser. Desuden blev de tilg\u00e5et af hjemmesiden (<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>), hvor der n\u00e5r som helst kunne komme pludselige mange foresp\u00f8rgsler.&nbsp;<\/p>\n<p><strong>Dataene var ikke aggregerede<\/strong> og mange beregninger fandt sted on-the-fly med databasev\u00e6rkt\u00f8jer. Dette skabte un\u00f8dvendige beregninger og ekstra belastning.&nbsp;<\/p>\n<p>Koden gik ofte til databasen, n\u00e5r den ikke beh\u00f8vede det. Nogle steder manglede bulk-operationer, og nogle foresp\u00f8rgsler skulle opdeles i flere gennem koden for at \u00f8ge hastigheden og p\u00e5lideligheden.&nbsp;<\/p>\n<h4>Sammenh\u00e6ng og kompleksitet i koden<\/h4>\n<p><strong>Moduler, der skulle tage ansvar for deres forretningsomr\u00e5de, gjorde ikke dette ordentligt.<\/strong>. Nogle af dem havde dublering af funktioner for roller. For eksempel m\u00e5tte den lokale marketingspecialist, der var ansvarlig for marketingaktiviteterne i sit omr\u00e5de, bruge b\u00e5de \"Admin\"-gr\u00e6nsefladen (til at oprette kampagner) og \"Office Manager\"-gr\u00e6nsefladen (til at se kampagners indflydelse p\u00e5 forretningen). Selvf\u00f8lgelig brugte begge moduler en f\u00e6lles tjeneste, der arbejdede med bonuskampagner.<\/p>\n<p>Tjenesterne (klasser inden for et stort monolitisk projekt) kunne kalde hinanden for at berige deres data.<\/p>\n<p>Med selve klassemodellerne, der gemte data, <strong>arbejdede koden forskelligt<\/strong>. Nogle steder var der konstrukt\u00f8rer, hvor man kunne angive obligatoriske felter. Andre steder blev dette gjort via offentlige egenskaber. Selvf\u00f8lgelig var indhentning og transformation af data fra databasen forskelligartet.&nbsp;<\/p>\n<p><strong>Logikken l\u00e5 enten i controllere eller i servicel\u00f8sninger.<\/strong>&nbsp;<\/p>\n<p>Dette kan virke som sm\u00e5 problemer, men de bremede udviklingen betydeligt og s\u00e6nkede kvaliteten, hvilket f\u00f8rte til ustabilitet og fejl.&nbsp;<\/p>\n<h4>Kompleksitet ved st\u00f8rre udvikling<\/h4>\n<p><strong>Der opstod ogs\u00e5 vanskeligheder i selve udviklingen<\/strong>. Der var behov for at lave forskellige systemblokke, og det skulle g\u00f8res parallelt. At im\u00f8dekomme behovene for hver komponent i en samlet kode blev stadig vanskeligere. Det var ikke nemt at n\u00e5 til enighed og tilfredsstille alle komponenter samtidigt. Dertil kom begr\u00e6nsninger i teknologierne, is\u00e6r hvad ang\u00e5r databasen og frontend. Man var n\u00f8dt til at opgive jQuery til fordel for h\u00f8jniveau-rammer, is\u00e6r hvad ang\u00e5r klienttjenester (webstedet).<\/p>\n<p><strong>I nogle dele af systemet kunne der have v\u00e6ret anvendt databaser, der bedre egner sig til dette<\/strong>. For eksempel havde vi senere et pr\u00e6cedens for at skifte fra Redis til CosmosDB til opbevaring af indk\u00f8bskurven.&nbsp;<\/p>\n<p>Hold og udviklere, der arbejdede p\u00e5 deres egne omr\u00e5der, \u00f8nskede tydeligt mere selvst\u00e6ndighed for deres tjenester, b\u00e5de i udviklings- og implementeringsaspektet. Konflikter ved merges, problemer under udgivelser. Hvis dette er et lille problem for 5 udviklere, bliver det mere alvorligt med 10, is\u00e6r ved det planlagte v\u00e6kst. Og foran os l\u00e5 udviklingen af en mobilapplikation (den startede i 2017, og i 2018 blev der) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">et stort fald<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>Forskellige dele af systemet kr\u00e6vede forskellige stabilitetsm\u00e5l<\/strong>, men p\u00e5 grund af systemets st\u00e6rke sammenh\u00e6ng kunne vi ikke sikre det. En fejl i udviklingen af en ny funktion i adminpanelet kunne let p\u00e5virke ordrebehandlingen p\u00e5 hjemmesiden, da koden er f\u00e6lles og genanvendelig, og databasen og dataene ogs\u00e5 er enhed.<\/p>\n<p>Det ville sandsynligvis have v\u00e6ret muligt, selv inden for en s\u00e5dan monolitisk-modul\u00e6r arkitektur, at undg\u00e5 disse fejl og problemer: opdele ansvarsomr\u00e5der, lave refaktorering af b\u00e5de kode og database, tydeligt adskille lagene fra hinanden og overv\u00e5ge kvaliteten hver dag. Men de valgte arkitektoniske beslutninger og fokus p\u00e5 hurtig udvidelse af systemets funktionalitet f\u00f8rte til problemer med stabiliteten.<\/p>\n<h4>Hvordan bloggen Sila Uma satte kasserne i restauranter<\/h4>\n<p>Hvis v\u00e6ksten af k\u00e6den af pizzeriaer (og belastningen) fortsatte i samme tempo, ville faldet efter noget tid v\u00e6re s\u00e5 stort, at systemet ikke ville kunne komme op igen. En god illustration af de problemer, vi begyndte at m\u00f8de i 2015, er denne historie.&nbsp;<\/p>\n<p>I bloggen \u201c<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>Sila Uma<\/u><\/a><\/noindex>\u201d var der en widget, der viste data om indt\u00e6gterne for hele k\u00e6den i l\u00f8bet af \u00e5ret. Widgeten gjorde brug af Dodos offentlige API, som leverer disse data. Nu er denne statistik tilg\u00e6ngelig p\u00e5 <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. Widgeten blev vist p\u00e5 hver side og foretog anmodninger med et interval p\u00e5 20 sekunder. Anmodningen blev sendt til api.dodopizza.ru og spurgte om:<\/p>\n<ul>\n<li>\n<p>antallet af pizzerier i k\u00e6den;<\/p>\n<\/li>\n<li>\n<p>den samlede indtjening for k\u00e6den siden begyndelsen af \u00e5ret;<\/p>\n<\/li>\n<li>\n<p>indtjeningen for i dag.<\/p>\n<\/li>\n<\/ul>\n<p>Anmodningen om indtjeningsstatistikken gik direkte til databasen og begyndte at anmode om data om ordrer, aggregerede dataene i realtid og returnerede summen.&nbsp;<\/p>\n<p>De samme bestillinger kom fra kasserne i restauranterne, der downloader en liste over accepterede ordrer for i dag, og nye ordrer blev tilf\u00f8jet til den. Kasserne gjorde deres anmodninger hvert 5. sekund eller ved opdatering af siden.<\/p>\n<p>Diagrammet s\u00e5 s\u00e5ledes ud:<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>En gang om efter\u00e5ret skrev Fyodor Ovchinnikov en lang og popul\u00e6r artikel i sin blog. Der kom mange mennesker til bloggen, og de begyndte at l\u00e6se alt grundigt. Mens hver person, der kom, l\u00e6ste artiklen, fungerede widgeten med indt\u00e6gterne fejlfrit og anmodede API'en hvert 20. sekund.<\/p>\n<p>API kaldte en gemt procedure for at beregne summen af alle ordrer siden starten af \u00e5ret for alle pizzeriaer i k\u00e6den. Aggeringen fandt sted i tabellen orders, som er meget popul\u00e6r. Alle kasser fra de \u00e5bne restauranter p\u00e5 det tidspunkt gik ogs\u00e5 ind i den. Kasserne stoppede med at svare, og ordrer blev ikke accepteret. De kunne heller ikke accepteres fra hjemmesiden, og de viste sig ikke p\u00e5 trackeren; skifteenhedens manager kunne ikke se dem i sit interface.&nbsp;<\/p>\n<p>Dette er ikke den eneste historie. Inden efter\u00e5ret 2015 var systembelastningen kritisk hver fredag. Flere gange deaktiverede vi det offentlige API, og en gang var vi endda n\u00f8dt til at slukke for hjemmesiden, fordi ingenting hjalp. Der var endda en liste over tjenester med r\u00e6kkef\u00f8lgen for deaktivering ved alvorlige belastninger.<\/p>\n<p>Fra dette tidspunkt begynder vores kamp mod belastningerne og for stabilisering af systemet (fra efter\u00e5ret 2015 til efter\u00e5ret 2018). Det var netop da, at \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Det store fald<\/u><\/a><\/noindex>\" fandt sted. Der opstod ogs\u00e5 nogle nedbrud i fremtiden, nogle var ret f\u00f8lsomme, men den samlede periode med ustabilitet kan nu betragtes som overst\u00e5et.<\/p>\n<h4>Den hurtige v\u00e6kst af virksomheden<\/h4>\n<p>Hvorfor kunne man ikke \"g\u00f8re det godt fra starten af\"? Det er nok at se p\u00e5 de n\u00e6ste grafer.<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Der var ogs\u00e5 \u00e5bning i Rum\u00e6nien i 2014-2015, og der blev forberedt en \u00e5bning i USA.<\/p>\n<p>K\u00e6den voksede meget hurtigt, nye lande blev \u00e5bnet, der kom nye pizzeriaformater, for eksempel \u00e5bnede der et pizzeria i en food court. Alt dette kr\u00e6vede betydelig opm\u00e6rksomhed p\u00e5 udvidelsen af Dodo IS's funktioner. Uden alle disse funktioner, uden tracking i k\u00f8kkenet, produktregnskab og tab i systemet, samt visning af orderudlevering i food courten, ville vi n\u00e6ppe tale om den \"rette\" arkitektur og den \"rigtige\" tilgang til udvikling.<\/p>\n<p>Ogs\u00e5 hindringer for en rettidig revision af arkitekturen og generelt for opm\u00e6rksomheden p\u00e5 tekniske problemer var krisen i 2014. S\u00e5danne ting rammer h\u00e5rdt p\u00e5 v\u00e6kstmulighederne for teams, is\u00e6r for unge virksomheder som Dodo Pizza.<\/p>\n<h3>Hurtige l\u00f8sninger, der hjalp<\/h3>\n<p>Problemerne kr\u00e6vede l\u00f8sninger. Overordnet kan l\u00f8sningerne opdeles i to grupper:<\/p>\n<ul>\n<li>\n<p>Hurtige, der slukker ilden og giver en lille buffer, hvilket giver os tid til \u00e6ndringer.<\/p>\n<\/li>\n<li>\n<p>Systemiske og dermed lange. Reengineering af en r\u00e6kke moduler, opdeling af den monolitiske arkitektur i separate tjenester (de fleste af dem er slet ikke mikro, men snarere makrotjenester og der er skrevet om det) <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>Andrej Morevskijs rapport<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Den t\u00f8rre liste over hurtige \u00e6ndringer er som f\u00f8lger:<\/p>\n<h4>Scale up masterdatabase<\/h4>\n<p>Selvf\u00f8lgelig er det f\u00f8rste, der g\u00f8res for at h\u00e5ndtere belastninger, at \u00f8ge serverens kapacitet. Det blev gjort for masterdatabasen og for webserverne. Desv\u00e6rre er dette kun muligt op til et vist punkt, derefter bliver det for dyrt.<\/p>\n<p>Siden 2014 er vi g\u00e5et over til Azure, om dette skrev vi ogs\u00e5 p\u00e5 det tidspunkt i artiklen \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">Hvordan Dodo Pizza leverer pizza ved hj\u00e6lp af Microsoft Azure<\/a><\/noindex>\u00bb. Men efter en r\u00e6kke serverfor\u00f8gninger til databasen st\u00f8dte vi p\u00e5 prisgr\u00e6nsen.&nbsp;<\/p>\n<h4>Replikater af databasen til l\u00e6sning<\/h4>\n<p>Der blev lavet to replikater til databasen:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>til foresp\u00f8rgsler om registre<\/strong>. Den bruges til at l\u00e6se registre som byer, gader, pizzasteder, produkter (slowly changed domain), og i de gr\u00e6nseflader, hvor en lille forsinkelse er acceptabel. Disse replikater var to, og vi sikrede deres tilg\u00e6ngelighed lige s\u00e5 godt som masteren.<\/p>\n<p><strong>ReadReplica til rapporteringsforesp\u00f8rgsler<\/strong>. Denne databases tilg\u00e6ngelighed var lavere, men den indeholdte alle rapporter. Selvom de har tunge foresp\u00f8rgsler om massive databehandlinger, p\u00e5virker de ikke hoveddatabasen og driftsgr\u00e6nsefladerne.&nbsp;<\/p>\n<h4>Caches i koden<\/h4>\n<p>Der var ikke nogen caches i koden (overhovedet). Dette f\u00f8rte til un\u00f8dvendige foresp\u00f8rgsler i den belastede database. Caches blev f\u00f8rst lavet b\u00e5de i hukommelsen og p\u00e5 en ekstern cache-tjeneste, som var Redis. Alle blev invalideret over tid, og indstillingerne blev angivet i koden.<\/p>\n<h4>Flere servere til backend<\/h4>\n<p>Backend-applikationen skulle ogs\u00e5 skaleres for at kunne h\u00e5ndtere de \u00f8gede belastninger. Det var n\u00f8dvendigt at lave et cluster ud af \u00e9n IIS-server. Vi flyttede <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> fra hukommelsen til RedisCache, hvilket gjorde det muligt at have flere servere, der stod bag en simpel belastningsbalancer med round robin. F\u00f8rst blev den samme Redis brugt som til caches, senere blev den opdelt p\u00e5 flere.&nbsp;<\/p>\n<p>Som et resultat blev arkitekturen mere kompleks\u2026<\/p>\n<p><img decoding=\"async\" alt=\"The Architecture of Dodo IS History: Early Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/70a3e8d5578469239c08b4759ab32264.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026men en del af sp\u00e6ndingen kunne lette.<\/p>\n<p>Og derefter skulle belastede komponenter genopbygges, og det var vi i gang med. Om dette vil vi fort\u00e6lle i n\u00e6ste del.<\/p>\n<p>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 arkitekturen Dodo IS: tidlig monolit | ProHoster","description":"Eller hvert ulykkelige firma med et monolitisk system er ulykkeligt p\u00e5 sin egen m\u00e5de. Udviklingen af systemet Dodo IS begyndte lige s\u00e5 snart, som Dodo Pizzas forretning \u2014 i 2011.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/95804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=95804"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/95804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/95805"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=95804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=95804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=95804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}