{"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\/nl\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","title":{"rendered":"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Of elke ongelukkige onderneming met een monoliet ongelukkig is op zijn eigen manier.<\/p>\n<p>De ontwikkeling van het Dodo IS-systeem begon gelijktijdig met het Dodo Pizza-bedrijf \u2014 in 2011. De basis was de idee van volledige en totale digitalisering van bedrijfsprocessen, waarbij <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>we het zelf deden<\/u><\/a><\/noindex>, wat in 2011 al veel vragen en scepsis opriep. Maar nu, 9 jaar later, volgen we dit pad \u2014 met onze eigen ontwikkeling die begon als een monoliet.<\/p>\n<p>Dit artikel is het 'antwoord' op de vragen 'Waarom zou je de architectuur herschrijven en zulke grootschalige en langdurige wijzigingen aanbrengen?' naar aanleiding van het vorige artikel <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\u2018De geschiedenis van de architectuur van Dodo IS: de weg van de backoffice\u2019<\/u><\/a><\/noindex>. Ik begin met hoe de ontwikkeling van Dodo IS startte, hoe de oorspronkelijke architectuur eruitzag, hoe nieuwe modules verschenen en om welke redenen grootschalige veranderingen nodig waren.<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>De serie artikelen \u2018Wat is Dodo IS?\u2019 zal vertellen over:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>De vroege monoliet in Dodo IS (2011-2015). (U bent hier)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">De weg van de backoffice: gescheiden databases en een bus<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>De weg van de klantkant: fa\u00e7ade boven de database (2016-2017). (In uitvoering\u2026)<\/p>\n<\/li>\n<li>\n<p>De geschiedenis van echte microservices. (2018-2019). (In uitvoering\u2026)<\/p>\n<\/li>\n<li>\n<p>Voltooid splitsen van de monoliet en stabiliseren van de architectuur. (In uitvoering\u2026)<\/p>\n<\/li>\n<\/ol>\n<h3>De oorspronkelijke architectuur<\/h3>\n<p>In 2011 zag de architectuur van Dodo IS eruit als volgt:<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>De eerste module in de architectuur \u2014 orderacceptatie. Het bedrijfsproces was als volgt:<\/p>\n<ul>\n<li>\n<p>de klant belt de pizzeria;<\/p>\n<\/li>\n<li>\n<p>de manager neemt de telefoon op;<\/p>\n<\/li>\n<li>\n<p>neemt de bestelling telefonisch aan;<\/p>\n<\/li>\n<li>\n<p>typt deze gelijktijdig in de orderacceptatie-interface: informatie over de klant, gegevens over de bestelling en het leveradres worden vastgelegd.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>De interface van het informatiesysteem zag er ongeveer zo uit\u2026<\/p>\n<p>De eerste versie van 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>Een beetje verbeterd in januari 2012<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/h2Cdht01gDA\">Informatiesysteem Dodo Pizza Bezorg Pizza Restaurant<\/a><\/noindex><\/p>\n<p>De middelen voor de ontwikkeling van de eerste module voor orderacceptatie waren beperkt. We moesten veel doen, snel werken en met een klein team. Een klein team \u2014 dat zijn 2 ontwikkelaars die de basis legden voor het hele toekomstige systeem.<\/p>\n<p>Hun eerste oplossing bepaalde het verdere lot van de technologiestack:<\/p>\n<ul>\n<li>\n<p>Backend op ASP.NET MVC, taal C#. De ontwikkelaars waren .NET-experts, deze stack was hen bekend en plezierig. <\/p>\n<\/li>\n<li>\n<p>Frontend op Bootstrap en JQuery: gebruikersinterfaces op zelfgeschreven stijlen en scripts.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Database MySQL: zonder licentiekosten, eenvoudig in gebruik.<\/p>\n<\/li>\n<li>\n<p>Windows Server-servers, omdat .NET toen alleen onder Windows kon draaien (we laten Mono even buiten beschouwing).<\/p>\n<\/li>\n<\/ul>\n<p>Fysiek vertaalt dit alles naar een 'dedicated server bij de hoster'.&nbsp;<\/p>\n<h4>Architectuur van de orderontvangst toepassing.<\/h4>\n<p>Toen werd er al veel gesproken over microservices, terwijl SOA al ongeveer 5 jaar werd gebruikt in grote projecten; bijvoorbeeld, WCF werd in 2006 uitgebracht. Maar op dat moment kozen we voor een betrouwbare en bewezen oplossing.<\/p>\n<p>Dat is het.<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/688da7d4e02a6310bf7d2da1b767fe10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asp.Net MVC is Razor, dat op aanvraag een HTML-pagina genereert vanuit een formulier of van de klant met server-side rendering. Aan de clientzijde geven CSS en JS-scripts informatie weer en voeren ze indien nodig AJAX-aanvragen uit via JQuery.<\/p>\n<p>Aanvragen op de server komen terecht in de *Controller klassen, waar de verwerking en generatie van de eind-HMTL-pagina plaatsvindt. Controllers doen aanvragen naar de logica-laag, die *Services wordt genoemd. Elke service was verantwoordelijk voor een bepaald aspect van de bedrijfsvoering:<\/p>\n<ul>\n<li>\n<p>Bijvoorbeeld, DepartmentStructureService gaf informatie over pizzeria's, over afdelingen. Een afdeling is een groep pizzeria's onder het beheer van \u00e9\u00e9n franchisegever.<\/p>\n<\/li>\n<li>\n<p>ReceivingOrdersService ontving en berekende de samenstelling van de bestelling.<\/p>\n<\/li>\n<li>\n<p>SmsService verstuurde sms'jes door API-diensten voor sms-verzending aan te roepen.<\/p>\n<\/li>\n<\/ul>\n<p>De services verwerkten gegevens uit de database en bevatten de bedrijfslogica. In elke service was er \u00e9\u00e9n of meerdere *Repository met bijbehorende namen. Daarin zaten al de aanvragen voor opgeslagen procedures in de database en de mapperlaag. In de opgeslagen procedures zat de bedrijfslogica, vooral veel in diegene die rapportagegegevens opleverden. ORM werd niet gebruikt, iedereen vertrouwde op handgeschreven sql.&nbsp;<\/p>\n<p>Er was ook een domeinmodel en algemene helperklassen, bijvoorbeeld de klasse Order, die de bestelling opsloeg. Ook daar, in de laag, was er een helper voor het omzetten van de weergavetekst op basis van de geselecteerde valuta.<\/p>\n<p>Dit kan worden weergegeven met het volgende model: <\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Orderpad.<\/h4>\n<p>Laten we het vereenvoudigde oorspronkelijke pad voor het cre\u00ebren van zo'n bestelling bekijken.<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>In eerste instantie was de website statisch. Er stonden prijzen op en bovenaan het telefoonnummer met de tekst 'Wil je pizza? Bel dan het nummer en bestel'. Voor een bestelling moesten we een eenvoudige flow implementeren:&nbsp;<\/p>\n<ul>\n<li>\n<p>De klant gaat naar de statische website met prijzen, kiest producten en belt naar het nummer dat op de site staat.<\/p>\n<\/li>\n<li>\n<p>De klant noemt de producten die hij aan de bestelling wil toevoegen.<\/p>\n<\/li>\n<li>\n<p>Hij noemt zijn adres en naam.<\/p>\n<\/li>\n<li>\n<p>De operator neemt de bestelling aan.<\/p>\n<\/li>\n<li>\n<p>De bestelling wordt weergegeven in de interface van de ontvangen bestellingen.<\/p>\n<\/li>\n<\/ul>\n<p>Alles begint met het weergeven van het menu. Een ingelogde gebruiker-operator kan op een bepaald moment maar \u00e9\u00e9n bestelling aannemen. Daarom kan het concept van de winkelwagentje worden opgeslagen in zijn sessie (de gebruikerssessie wordt in het geheugen opgeslagen). Daarin bevindt zich het object Cart, waarin producten en klantinformatie zijn opgenomen.<\/p>\n<p>De klant noemt het product, de operator drukt op <code>+<\/code> naast het product, en er wordt een verzoek naar de server gestuurd. Voor het product wordt informatie uit de database gehaald en toegevoegd aan de winkelwagentje.<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Opmerking<\/strong>. Ja, hier is het mogelijk om het product niet uit de database te halen, maar het vanuit de frontend door te geven. Maar voor de duidelijkheid heb ik precies het pad vanuit de database laten zien.&nbsp;<\/p>\n<p>Vervolgens voeren we het adres en de naam van de klant in.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bij het klikken op \"Bestelling aanmaken\":<\/p>\n<ul>\n<li>\n<p>Sturen we het verzoek naar OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>We halen het Cart uit de sessie, daar liggen de producten in de juiste hoeveelheid.<\/p>\n<\/li>\n<li>\n<p>We vullen het Cart aan met klantinformatie en geven het door aan de AddOrder-methode van de ReceivingOrderService-klasse, waar het in de database wordt opgeslagen.&nbsp;<\/p>\n<\/li>\n<li>\n<p>In de database zijn er tabellen met bestellingen, samenstellingen van bestellingen, klanten en ze zijn allemaal met elkaar verbonden.<\/p>\n<\/li>\n<li>\n<p>De interface voor het weergeven van bestellingen haalt de laatste bestellingen op en toont deze.<\/p>\n<\/li>\n<\/ul>\n<h4>Nieuwe modules<\/h4>\n<p>De orderverwerking was belangrijk en noodzakelijk. Je kunt geen pizzeria runnen zonder een systeem voor het aannemen van bestellingen. Daarom begon het systeem in omvang te groeien - ongeveer van 2012 tot 2015. In deze periode zijn er veel verschillende modules aan het systeem toegevoegd, die ik zal noemen. <strong>modules<\/strong>\u2018 zal noemen, in tegenstelling tot het begrip dienst of product.&nbsp;<\/p>\n<p>Een module is een set functies die zijn verenigd door een gemeenschappelijk zakelijk doel. Fysiek bevinden ze zich in \u00e9\u00e9n applicatie.<\/p>\n<p>Modules kunnen worden beschouwd als blokken van het systeem. Bijvoorbeeld, dit is de rapportagemodule, interface van het beheersysteem, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>de producttracker in de keuken<\/u><\/a><\/noindex>, autorisatie. Dit zijn allemaal verschillende interfaces voor de gebruikers, sommige hebben zelfs verschillende visuele stijlen. Toch vallen ze allemaal onder \u00e9\u00e9n applicatie, \u00e9\u00e9n werkend proces.&nbsp;<\/p>\n<p>Technisch gezien werden modules vormgegeven als Area (dit idee is zelfs nog overgebleven in de <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>). Er waren aparte bestanden voor de front-end, modellen, en ook eigen controllerklassen. Uiteindelijk is het systeem veranderd van...<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026naar zo:<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Sommige modules zijn gerealiseerd als aparte sites (uitvoerbare projecten), vanwege de zeer specifieke functionaliteit en deels vanwege de meer gefocuste ontwikkeling. Dit zijn:<\/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>de eerste versie<\/u><\/a><\/noindex> van de website dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Exporteer<\/strong>: export van rapporten uit Dodo IS voor 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Persoonlijk<\/strong> \u2014 het persoonlijke account van de medewerker. Het is afzonderlijk ontwikkeld en heeft zijn eigen toegangspunt en ontwerp.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 project voor het hosten van statische inhoud. Later zijn we hier vanaf gestapt en hebben we al het statische materiaal naar de CDN Akamai overgebracht.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>De overige blokken bevonden zich in de BackOffice-app.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Uitleg over de namen:<\/p>\n<ul>\n<li>\n<p>Kassa \u2014 De kassa van het restaurant.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 interfaces voor de rol 'Shift Manager': operationele statistieken over de verkopen van de pizzeria, de mogelijkheid om producten op de stoplijst te zetten, bestellingen te wijzigen.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 interfaces voor de rol 'Pizzeria Manager' en 'Franchisee'. Hier zijn functies verzameld voor het instellen van de pizzeria, de bonusacties, het aannemen en werken met medewerkers, rapportages.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 interfaces voor televisies en tablets die in de pizzeria's hangen. Op de televisies worden het menu, reclame-informatie en de status van de bestelling bij uitgifte weergegeven.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Ze gebruikten een gemeenschappelijke serviceslaag, een gemeenschappelijk blok van domeinklassen Dodo.Core, evenals een gezamenlijke database. Soms konden ze ook naar elkaar doorverwijzen. Zelfs afzonderlijke websites, zoals dodopizza.ru of personal.dodopizza.ru, konden naar de gemeenschappelijke services gaan.<\/p>\n<p>Bij de introductie van nieuwe modules probeerden we zoveel mogelijk de al gemaakte code van services, opgeslagen procedures en tabellen in de database te hergebruiken.&nbsp;<\/p>\n<p>Voor een beter begrip van de schaal van de modules die in het systeem zijn gemaakt, hier is een schema uit 2012 met de ontwikkelingsplannen:<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tegen 2015 was alles op het schema en zelfs meer in productie.<\/p>\n<ul>\n<li>\n<p>De orderontvangst is uitgegroeid tot een afzonderlijk blok Contact Center, waar een operator de bestelling aanneemt.<\/p>\n<\/li>\n<li>\n<p>Er verschenen publieke schermen met menu's en informatie, die in de pizzeria's hingen.<\/p>\n<\/li>\n<li>\n<p>In de keuken is er een module die automatisch het gesproken bericht 'Nieuwe pizza' afspeelt bij binnenkomst van een nieuwe bestelling, en ook een bon voor de koerier afdrukt. Dit vereenvoudigt de processen in de keuken aanzienlijk en stelt medewerkers in staat zich niet te laten afleiden door een groot aantal eenvoudige taken.<\/p>\n<\/li>\n<li>\n<p>Het bezorgblok werd een aparte BezorgKassa waar de bestelling aan de koerier werd overgedragen, die zich vooraf op de dienst had gemeld. Zijn werktijd werd bijgehouden voor salarisberekening.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Tussen 2012 en 2015 verschenen meer dan 10 ontwikkelaars, werden er 35 pizzeria's geopend, werd het systeem in Roemeni\u00eb uitgerold en werden er voorbereidingen getroffen voor de opening van locaties in de VS. De ontwikkelaars hielden zich niet meer bezig met alle taken, maar waren verdeeld in teams. Elk team specialiseerde zich in een specifiek deel van het systeem.&nbsp;<\/p>\n<h3>Problemen<\/h3>\n<p>Dit was gedeeltelijk te wijten aan de architectuur (maar niet alleen dat).<\/p>\n<h4>Chaos in de database<\/h4>\n<p>\u00c9\u00e9n database is handig. Je kunt consistentie bereiken, en dat dankzij de middelen die in relationele databases zijn ingebouwd. Het werken met deze database is vertrouwd en handig, zeker wanneer er weinig tabellen en gegevens zijn.<\/p>\n<p>Maar na 4 jaar ontwikkeling bevatte de database ongeveer 600 tabellen, 1500 opgeslagen procedures, waarvan velen ook nog eens logica bevatten. Helaas bieden opgeslagen procedures niet veel voordelen bij gebruik van MySQL. Ze worden niet gecached door de database, en het opslaan van logica daarin maakt ontwikkeling en debugging ingewikkelder. Hergebruik van code wordt ook bemoeilijkt.<\/p>\n<p><strong>Veel tabellen hadden geen geschikte indexen<\/strong>, terwijl er ergens anders, juist, veel te veel indexen waren, wat de invoer bemoeilijkte. Ongeveer 20 tabellen moesten worden aangepast \u2014 een transactie voor het aanmaken van een bestelling kon 3-5 seconden duren.&nbsp;<\/p>\n<p><strong>De gegevens in de tabellen waren niet altijd in de meest geschikte vorm<\/strong>. Soms moest er denormalisatie worden uitgevoerd. Een deel van de regelmatig ontvangen gegevens stond in een kolom in de vorm van een XML-structuur, dit verhoogde de uitvoeringstijd, verlengde de queries en maakte ontwikkeling moeilijker.<\/p>\n<p>Er werden vaak zeer <strong>diverse queries naar dezelfde tabellen gestuurd<\/strong>. Vooral populaire tabellen, zoals de eerder genoemde tabel <em>orders<\/em> of de tabel <em>pizzeria<\/em>. Deze werden gebruikt voor het weergeven van operationele interfaces in de keuken, analisten. Ook werd er toegang toe gevraagd door de website (<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>), waar op elk moment onverwacht veel aanvragen konden binnenkomen.&nbsp;<\/p>\n<p><strong>De gegevens waren niet geaggregeerd<\/strong> en veel berekeningen vonden on-the-fly plaats met behulp van de database. Dit zorgde voor overbodige berekeningen en extra belasting.&nbsp;<\/p>\n<p>Vaak ging de code naar de database wanneer dit niet nodig was. Soms ontbraken bulk-bewerkingen, en op andere plaatsen had \u00e9\u00e9n query verdeeld moeten worden in meerdere via de code om snelheid en betrouwbaarheid te verhogen.&nbsp;<\/p>\n<h4>Verbinding en verwarring in de code<\/h4>\n<p><strong>Modules die verantwoordelijk moesten zijn voor hun eigen zakelijke segment deden dit niet eerlijk.<\/strong>Sommigen van hen hadden duplicaties in functies voor rollen. Bijvoorbeeld, een lokale marketeer die verantwoordelijk is voor de marketingactiviteit van het netwerk in zijn stad, moest zowel de 'Admin'-interface (voor het opzetten van acties) als de 'Kantoor Manager'-interface (voor het bekijken van de impact van acties op het bedrijf) gebruiken. Natuurlijk gebruikten beide modules intern dezelfde service die werkte met bonusacties.<\/p>\n<p>Diensten (klassen binnen \u00e9\u00e9n grote monolitische project) konden elkaar aanroepen om hun gegevens te verrijken.<\/p>\n<p>Met de modelklassen die gegevens opslaan, <strong>werd op verschillende manieren in de code gewerkt.<\/strong>Sommigen hadden constructors waarmee verplichte velden konden worden opgegeven. Andere deden dit via openbare eigenschappen. Natuurlijk was het ophalen en transformeren van gegevens uit de database divers.&nbsp;<\/p>\n<p><strong>De logica bevond zich ofwel in de controllers ofwel in de serviceklassen.<\/strong>&nbsp;<\/p>\n<p>Dit lijken misschien onbeduidende problemen, maar ze vertraagden de ontwikkeling aanzienlijk en verlaagden de kwaliteit, wat leidde tot instabiliteit en fouten.&nbsp;<\/p>\n<h4>De complexiteit van grote ontwikkeling<\/h4>\n<p><strong>Er deden zich ook moeilijkheden voor tijdens de ontwikkeling.<\/strong>Het was nodig om verschillende systeemblokken te maken, en dit moest parallel gebeuren. De behoeften van elk component in \u00e9\u00e9n code onder te brengen werd steeds moeilijker. Het was niet eenvoudig om overeenstemming te bereiken en aan alle componenten gelijktijdig tegemoet te komen. Hier kwamen ook beperkingen in technologie\u00ebn bij, vooral met betrekking tot de database en de frontend. Het was nodig om JQuery op te geven ten gunste van meer geavanceerde frameworks, vooral voor clientservices (website).<\/p>\n<p><strong>In sommige delen van het systeem konden databases worden gebruikt die geschikter waren voor dit doel.<\/strong>Bijvoorbeeld, later hadden we een precedent voor de overstap van Redis naar CosmosDB voor het opslaan van de bestellingmand.&nbsp;<\/p>\n<p>Teams en ontwikkelaars die verantwoordelijk waren voor hun eigen gebied wilden duidelijk meer autonomie voor hun services, zowel in ontwikkeling als in uitrol. Conflicten bij merges, problemen bij releases. Hoewel dit voor 5 ontwikkelaars een klein probleem was, zou het bij 10, en zeker gezien de geplande groei, veel serieuzer worden. Voor de deur stond de ontwikkeling van een mobiele applicatie (deze startte in 2017, en in 2018 was er al) <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">een grote daling.<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>Verschillende delen van het systeem vereisten verschillende stabiliteitscriteria.<\/strong>, maar vanwege de sterke onderlinge verbondenheid van het systeem konden we dit niet garanderen. Een fout in de ontwikkeling van een nieuwe functie in het beheerpaneel kon zomaar gevolgen hebben voor de orderverwerking op de website, aangezien de code gemeenschappelijk en herbruikbaar is, en de database en gegevens ook \u00e9\u00e9n geheel vormen.<\/p>\n<p>Waarschijnlijk zouden we binnen zo'n monolithisch-modulaire architectuur deze fouten en problemen kunnen vermijden: verantwoordelijkheden scheiden, zowel de code als de database refactoren, de lagen duidelijk van elkaar scheiden, elke dag de kwaliteit bewaken. Maar de gekozen architecturale oplossingen en de focus op de snelle uitbreiding van de functionaliteit van het systeem hebben geleid tot problemen met de stabiliteit.<\/p>\n<h4>Hoe de blog Sila Uma kassa's in restaurants heeft ge\u00efntroduceerd<\/h4>\n<p>Als de groei van het netwerk van pizzeria's (en de belasting) in hetzelfde tempo had doorgelopen, zouden de uitvalpercentages op een gegeven moment zo hoog zijn dat het systeem niet meer zou opstarten. Een verhaal dat de problemen goed illustreert waarmee we begonnen te maken hebben rond 2015.&nbsp;<\/p>\n<p>In de blog \u201c<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>Sila Uma<\/u><\/a><\/noindex>\u201d was er een widget die de jaarlijkse omzetgegevens van het gehele netwerk toonde. De widget maakte verbinding met de publieke API van Dodo, die deze gegevens verstrekt. Momenteel zijn deze statistieken beschikbaar op <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. De widget werd op elke pagina weergegeven en deed om de 20 seconden verzoeken. Het verzoek werd verzonden naar api.dodopizza.ru en vroeg om:<\/p>\n<ul>\n<li>\n<p>het aantal pizzeria's in het netwerk;<\/p>\n<\/li>\n<li>\n<p>de totale omzet van het netwerk sinds het begin van het jaar;<\/p>\n<\/li>\n<li>\n<p>de omzet van vandaag.<\/p>\n<\/li>\n<\/ul>\n<p>Het verzoek om omzetstatistieken ging direct naar de database en begon gegevens over bestellingen op te vragen, gegevens ter plaatse te aggregeren en de totale som te geven.&nbsp;<\/p>\n<p>In dezelfde tabel van bestellingen kwamen de Kassa's in restaurants, die lijsten met vandaag ontvangen bestellingen exporteerden, en nieuwe bestellingen werden er ook aan toegevoegd. De kassa's deden hun verzoeken elke 5 seconden of bij het vernieuwen van de pagina.<\/p>\n<p>De opzet zag er als volgt uit:<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Een keer in de herfst schreef Fedor Ovchinnikov een lange en populaire blogpost. Er kwamen veel mensen naar de blog en ze gingen alles aandachtig lezen. Terwijl elk van de bezoekers de blogpost las, werkte de omzetwidget naar behoren en vroeg elke 20 seconden data op via de API.<\/p>\n<p>De API riep een opgeslagen procedure aan om het totaalbedrag van alle bestellingen sinds het begin van het jaar voor alle pizzeria's in het netwerk te berekenen. De aggregatie vond plaats in de tabel bestellingen, die erg populair is. Hierin lopen alle kassa's van alle open restaurants op dat moment. De kassa's stopten met reageren, bestellingen werden niet aangenomen. Ook werden ze niet via de website geaccepteerd, ze verschenen niet op de tracker, de shiftmanager kon ze niet in zijn interface zien.&nbsp;<\/p>\n<p>Dit is niet het enige verhaal. Tegen de herfst van 2015 was de belasting op het systeem elke vrijdag kritiek. Meerdere keren moesten we de publieke API uitschakelen, en \u00e9\u00e9n keer moesten we zelfs de website uitschakelen omdat niets hielp. Er was zelfs een lijst met diensten met de volgorde van uitschakeling bij ernstige belasting.<\/p>\n<p>Vanaf dat moment begint onze strijd tegen de belasting en voor de stabilisatie van het systeem (van de herfst van 2015 tot de herfst van 2018). Juist toen gebeurde de \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Grote val<\/u><\/a><\/noindex>\". Ook daarna kwamen er af en toe storingen voor, sommige waren behoorlijk gevoelig, maar de algemene periode van instabiliteit kan nu als overwonnen worden beschouwd.<\/p>\n<h4>Stormachtige groei van het bedrijf<\/h4>\n<p>Waarom kon het niet \"direct goed gedaan worden\"? Het is voldoende om naar de volgende grafieken te kijken.<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ook in 2014-2015 was er een opening in Roemeni\u00eb en was de opening in de VS in voorbereiding.<\/p>\n<p>Het netwerk groeide heel snel, nieuwe landen werden geopend, er kwamen nieuwe formaten van pizzeria's, bijvoorbeeld, er werd een pizzeria geopend in een foodcourt. Dit vereiste significante aandacht voor de uitbreiding van de functies van Dodo IS. Zonder al deze functies, zonder tracking in de keuken, het bijhouden van producten en verliezen in het systeem, de weergave van de orderuitgifte in de zaal van het foodcourt, zouden we nu waarschijnlijk niet spreken over een \"juiste\" architectuur en een \"juiste\" benadering van ontwikkeling.<\/p>\n<p>Nog een obstakel voor tijdige herziening van de architectuur en \u00fcberhaupt aandacht voor technische problemen was de crisis van 2014. Dergelijke zaken hebben een grote impact op de groeimogelijkheden van teams, vooral voor jonge bedrijven, zoals Dodo Pizza.<\/p>\n<h3>Snelle oplossingen die hielpen<\/h3>\n<p>De problemen vereisten oplossingen. Voorwaardelijk kunnen de oplossingen in 2 groepen worden verdeeld:<\/p>\n<ul>\n<li>\n<p>Snelle oplossingen, die het vuur blussen en een kleine reserve bieden om ons tijd te geven voor veranderingen.<\/p>\n<\/li>\n<li>\n<p>Systemische en dus langdurige oplossingen. Het herontwerpen van een aantal modules, het splitsen van de monolithische architectuur in aparte diensten (de meeste hiervan zijn niet echt micro, maar eerder macroservices, en hierover is er <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>rapport van Andrei Morevsky<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>De lijst van snelle wijzigingen is als volgt:<\/p>\n<h4>Scale up master database<\/h4>\n<p>Natuurlijk is het eerste wat wordt gedaan om de belasting te verminderen, het verhogen van de servercapaciteit. Dit is gedaan voor de master database en voor de webservers. Helaas is dit maar tot op zekere hoogte mogelijk, verder wordt het te duur.<\/p>\n<p>Sinds 2014 zijn we overgestapt op Azure, hierover schreven we ook eerder in het artikel \u201c<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">Hoe Dodo Pizza pizza levert met behulp van Microsoft Azure<\/a><\/noindex>\u201d. Maar na een reeks serververhogingen voor de database stuitten we op kosten.&nbsp;<\/p>\n<h4>Database replica's voor lezen<\/h4>\n<p>We hebben twee replica's voor de database gemaakt:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>voor verzoeken naar de naslagwerken<\/strong>. Dit wordt gebruikt voor het lezen van naslagwerken, zoals steden, straten, pizzeria's, producten (slowly changed domain), en in die interfaces waar een kleine vertraging acceptabel is. Deze replica's waren er 2, we zorgden ervoor dat ze beschikbaar waren, net als de master.<\/p>\n<p><strong>ReadReplica voor rapportverzoeken<\/strong>. Deze database had een lagere beschikbaarheid, maar alle rapporten kwamen hierin binnen. Hoewel ze zware verzoeken voor enorme dataverkeringen bevatten, be\u00efnvloeden ze de hoofd-database en operationele interfaces niet.&nbsp;<\/p>\n<h4>Caches in de code<\/h4>\n<p>Er waren nergens caches in de code (over het algemeen). Dit leidde tot extra, niet altijd noodzakelijke, verzoeken naar de overbelaste database. De caches waren aanvankelijk zowel in het geheugen als op een externe cache-service, dat was Redis. Alles werd op tijd ongeldig gemaakt, instellingen werden in de code opgegeven.<\/p>\n<h4>Meerdere servers voor de backend<\/h4>\n<p>De backend van de applicatie moest ook opgeschaald worden om de verhoogde belasting aan te kunnen. Het was nodig om van \u00e9\u00e9n iis-server een cluster te maken. We hebben de <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>applicatiesessies<\/u><\/a><\/noindex> van het geheugen naar RedisCache verplaatst, wat het mogelijk maakte om meerdere servers achter een eenvoudige load balancer met round robin te plaatsen. Eerst werd dezelfde Redis gebruikt als voor de caches, later hebben we het verspreid over meerdere.&nbsp;<\/p>\n<p>Uiteindelijk is de architectuur complexer geworden...<\/p>\n<p><img decoding=\"async\" alt=\"De geschiedenis van de architectuur van Dodo IS: de vroege monoliet\" src=\"\/wp-content\/uploads\/2020\/10\/70a3e8d5578469239c08b4759ab32264.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026maar een deel van de spanning kon worden verminderd.<\/p>\n<p>Daarna moesten de zwaarbelaste componenten worden herzien, en daar gingen we mee aan de slag. Hierover vertellen we in de volgende sectie.<\/p>\n<p>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47Geschiedenis van de architectuur van Dodo IS: vroege monoliet | ProHoster","description":"Of elke ongelukkige onderneming met een monoliet is op zijn eigen manier ongelukkig. De ontwikkeling van het Dodo IS-systeem begon gelijktijdig met het Dodo Pizza-bedrijf \u2014 in 2011.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/95804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=95804"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/95804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/95805"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=95804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=95804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=95804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}