{"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\/de\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","title":{"rendered":"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Oder jede ungl\u00fcckliche Firma mit einem Monolithen ist auf ihre eigene Weise ungl\u00fccklich.<\/p>\n<p>Die Entwicklung des Dodo IS-Systems begann gleichzeitig mit dem Gesch\u00e4ft von Dodo Pizza \u2014 im Jahr 2011. Grundlage war die Idee einer vollst\u00e4ndigen und totalen Digitalisierung der Gesch\u00e4ftsprozesse, wobei <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>aus eigenen Kr\u00e4ften<\/u><\/a><\/noindex>, was bereits 2011 viele Fragen und Skepsis aufwarf. Aber nun sind es schon 9 Jahre, in denen wir diesen Weg gehen \u2014 mit einer eigenen Entwicklung, die mit einem Monolithen begann.<\/p>\n<p>Dieser Artikel ist eine \u00abAntwort\u00bb auf die Fragen \u00abWarum die Architektur umschreiben und so umfangreiche und langwierige \u00c4nderungen vornehmen?\u00bb zu dem vorhergehenden Artikel <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\u00abDie Geschichte der Architektur von Dodo IS: der Weg des Backoffice\u00bb<\/u><\/a><\/noindex>. Ich beginne damit, wie die Entwicklung von Dodo IS begann, wie die urspr\u00fcngliche Architektur aussah, wie neue Module entstanden und welche Probleme umfangreiche \u00c4nderungen erforderlich machten.<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>Die Artikelreihe \u00abWas ist Dodo IS?\u00bb wird erz\u00e4hlen \u00fcber:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>Das fr\u00fche Monolith in Dodo IS (2011-2015 Jahre). (Sie sind hier)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">Der Weg des Backoffice: getrennte Datenbanken und Bus<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>Der Weg des Kundenbereichs: Fassade \u00fcber der Datenbank (2016-2017 Jahre). (In Bearbeitung\u2026)<\/p>\n<\/li>\n<li>\n<p>Die Geschichte echter Mikrodienste. (2018-2019 Jahre). (In Bearbeitung\u2026)<\/p>\n<\/li>\n<li>\n<p>Vollendeter Schnitt des Monolithen und Stabilisierung der Architektur. (In Bearbeitung\u2026)<\/p>\n<\/li>\n<\/ol>\n<h3>Urspr\u00fcngliche Architektur<\/h3>\n<p>Im Jahr 2011 sah die Architektur von Dodo IS so aus:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Das erste Modul in der Architektur \u2014 die Bestellung annehmen. Der Gesch\u00e4ftsprozess war folgenderma\u00dfen:<\/p>\n<ul>\n<li>\n<p>Der Kunde ruft die Pizzeria an;<\/p>\n<\/li>\n<li>\n<p>der Manager nimmt den H\u00f6rer ab;<\/p>\n<\/li>\n<li>\n<p>nimmt die Bestellung am Telefon entgegen;<\/p>\n<\/li>\n<li>\n<p>gibt sie parallel in die Schnittstelle zur Bestellannahme ein: Informationen \u00fcber den Kunden, Daten zu den Bestelldetails, Lieferadresse werden ber\u00fccksichtigt.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Die Benutzeroberfl\u00e4che des Informationssystems sah ungef\u00e4hr so aus\u2026<\/p>\n<p>Die erste Version vom 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>Etwas verbessert im Januar 2012<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/h2Cdht01gDA\">Informationssystem Dodo Pizza Delivery Pizza Restaurant<\/a><\/noindex><\/p>\n<p>Die Ressourcen f\u00fcr die Entwicklung des ersten Moduls zur Bestellannahme waren begrenzt. Es musste viel, schnell und mit kleinem Team gemacht werden. Kleines Team \u2014 das sind 2 Entwickler, die das Fundament des gesamten zuk\u00fcnftigen Systems gelegt haben.<\/p>\n<p>Ihre erste Entscheidung bestimmte das weitere Schicksal des Technologie-Stacks:<\/p>\n<ul>\n<li>\n<p>Backend auf ASP.NET MVC, Sprache C#. Die Entwickler waren .NET-Entwickler, dieser Stack war ihnen vertraut und angenehm. <\/p>\n<\/li>\n<li>\n<p>Frontend auf Bootstrap und jQuery: Benutzeroberfl\u00e4chen basierend auf eigenen Stilen und Skripten.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Datenbank MySQL: ohne Lizenzkosten, einfach zu verwenden.<\/p>\n<\/li>\n<li>\n<p>Server auf Windows Server, weil .NET damals nur unter Windows verf\u00fcgbar war (Mono lassen wir au\u00dfen vor).<\/p>\n<\/li>\n<\/ul>\n<p>Physisch \u00e4u\u00dferte sich das alles in einem \u201eDedizierten Server beim Hoster\u201c.&nbsp;<\/p>\n<h4>Architektur der Bestellannahme-Anwendung<\/h4>\n<p>Damals sprach jeder von Mikrodiensten, w\u00e4hrend SOA schon seit etwa 5 Jahren in gro\u00dfen Projekten verwendet wurde, zum Beispiel kam WCF 2006 heraus. Aber damals w\u00e4hlte man eine zuverl\u00e4ssige und bew\u00e4hrte L\u00f6sung.<\/p>\n<p>Hier ist es.<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/688da7d4e02a6310bf7d2da1b767fe10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asp.Net MVC ist Razor, das auf Anfrage von einem Formular oder vom Client eine HTML-Seite mit Rendering auf dem Server ausgibt. Am Client zeigen dann CSS und JS-Skripte die Informationen an und f\u00fchren bei Bedarf AJAX-Anfragen \u00fcber JQuery aus.<\/p>\n<p>Anfragen auf dem Server gelangen in Klassen *Controller, wo in der Methode die Verarbeitung und Generierung der finalen HTML-Seite erfolgt. Controller stellen Anfragen an die Logikschicht, die *Services genannt wird. Jeder der Dienste war f\u00fcr einen bestimmten Aspekt des Gesch\u00e4fts zust\u00e4ndig:<\/p>\n<ul>\n<li>\n<p>Zum Beispiel gab der DepartmentStructureService Informationen \u00fcber Pizzerien und Abteilungen aus. Eine Abteilung ist eine Gruppe von Pizzerien unter der Leitung eines Franchisenehmers.<\/p>\n<\/li>\n<li>\n<p>Der ReceivingOrdersService nahm Bestellungen entgegen und berechnete die Zusammensetzung der Bestellung.<\/p>\n<\/li>\n<li>\n<p>Und der SmsService versandte SMS, indem er API-Dienste zum SMS-Versand aufrief.<\/p>\n<\/li>\n<\/ul>\n<p>Die Services verarbeiteten Daten aus der Datenbank, speicherten Gesch\u00e4ftslogik. In jedem Service gab es ein oder mehrere *Repository mit entsprechendem Namen. In diesen befanden sich bereits Anfragen an gespeicherte Prozeduren in der Datenbank und eine Schicht von Mappern. In den gespeicherten Prozeduren war die Gesch\u00e4ftslogik untergebracht, besonders viel in denjenigen, die Berichtsdaten ausgaben. ORM wurde nicht verwendet, alle verlie\u00dfen sich auf manuell geschriebene SQL.&nbsp;<\/p>\n<p>Es gab auch eine Schicht des Dom\u00e4nenmodells und allgemeiner Hilfsklassen, wie beispielsweise die Klasse Order, die die Bestellung speicherte. Auch hier gab es in dieser Schicht einen Helper zur Umwandlung des Anzeige-Texts in der gew\u00e4hlten W\u00e4hrung.<\/p>\n<p>All dies kann man sich mit folgendem Modell vorstellen: <\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Bestellweg<\/h4>\n<p>Betrachten wir den vereinfachten urspr\u00fcnglichen Weg zur Erstellung einer solchen Bestellung.<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Urspr\u00fcnglich war die Website statisch. Dort waren Preise angegeben, und oben war die Telefonnummer sowie der Schriftzug \u201eWillst du Pizza, ruf die Nummer an und bestelle\u201c. F\u00fcr die Bestellung m\u00fcssen wir einen einfachen Ablauf umsetzen:&nbsp;<\/p>\n<ul>\n<li>\n<p>Der Kunde besucht die statische Website mit den Preisen, w\u00e4hlt Produkte aus und ruft die Nummer an, die auf der Website angegeben ist.<\/p>\n<\/li>\n<li>\n<p>Der Kunde nennt die Produkte, die er zur Bestellung hinzuf\u00fcgen m\u00f6chte.<\/p>\n<\/li>\n<li>\n<p>Er nennt seine Adresse und seinen Namen.<\/p>\n<\/li>\n<li>\n<p>Der Operator nimmt die Bestellung entgegen.<\/p>\n<\/li>\n<li>\n<p>Die Bestellung wird in der Benutzeroberfl\u00e4che f\u00fcr eingegangene Bestellungen angezeigt.<\/p>\n<\/li>\n<\/ul>\n<p>Alles beginnt mit der Anzeige des Men\u00fcs. Der eingeloggte Benutzer-Operator kann zu einem bestimmten Zeitpunkt nur einen Auftrag annehmen. Daher kann der Entwurf-Warenkorb in seiner Sitzung gespeichert werden (die Benutzersitzung wird im Speicher gehalten). Dort befindet sich das Objekt Cart, in dem Produkte und Informationen \u00fcber den Kunden enthalten sind.<\/p>\n<p>Der Kunde nennt das Produkt, der Operator klickt auf <code>+<\/code> neben dem Produkt, und eine Anfrage wird an den Server gesendet. Die Informationen \u00fcber das Produkt werden aus der Datenbank abgerufen und dem Warenkorb hinzugef\u00fcgt.<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Hinweis<\/strong>. Ja, man kann das Produkt hier auch nicht aus der Datenbank abfragen, sondern von der Frontend-Seite \u00fcbermitteln. Aber zur Veranschaulichung habe ich genau den Weg aus der Datenbank gezeigt.&nbsp;<\/p>\n<p>Dann geben wir die Adresse und den Namen des Kunden ein.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Beim Klicken auf \u201eBestellung erstellen\u201c:<\/p>\n<ul>\n<li>\n<p>Senden wir die Anfrage an OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>Wir erhalten den Warenkorb aus der Sitzung, in dem die Produkte in der ben\u00f6tigten Menge liegen.<\/p>\n<\/li>\n<li>\n<p>Wir erg\u00e4nzen den Warenkorb mit den Informationen \u00fcber den Kunden und \u00fcbergeben ihn an die Methode AddOrder der Klasse ReceivingOrderService, wo er in die Datenbank gespeichert wird.&nbsp;<\/p>\n<\/li>\n<li>\n<p>In der Datenbank gibt es Tabellen mit Auftr\u00e4gen, dem Auftragsinhalt und den Kunden, und sie sind alle miteinander verbunden.<\/p>\n<\/li>\n<li>\n<p>Die Schnittstelle zur Anzeige von Bestellungen wird ausgef\u00fchrt und ruft die letzten Bestellungen ab und zeigt sie an.<\/p>\n<\/li>\n<\/ul>\n<h4>Neue Module<\/h4>\n<p>Die Annahme von Bestellungen war wichtig und notwendig. Man kann kein Pizza-Gesch\u00e4ft aufbauen, wenn es keine Bestellannahme gibt. Daher begann das System, sich mit Funktionen zu erweitern \u2013 etwa von 2012 bis 2015. In dieser Zeit entstanden viele verschiedene Module des Systems, die ich als <strong>Module<\/strong>bezeichnen werde, im Gegensatz zu dem Begriff Dienst oder Produkt.&nbsp;<\/p>\n<p>Ein Modul ist eine Gruppe von Funktionen, die durch ein gemeinsames Gesch\u00e4ftsziel vereint sind. Dabei befinden sie sich physisch in einer Anwendung.<\/p>\n<p>Module k\u00f6nnen als Bl\u00f6cke des Systems betrachtet werden. Zum Beispiel gibt es das Modul Berichte, die Admin-Schnittstellen, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>den Produkttracker in der K\u00fcche<\/u><\/a><\/noindex>, die Autorisierung. All dies sind verschiedene Schnittstellen f\u00fcr den Benutzer, einige haben sogar unterschiedliche visuelle Stile. Dabei bleiben sie alle innerhalb einer Anwendung, eines arbeitenden Prozesses.&nbsp;<\/p>\n<p>Technisch wurden die Module als Area strukturiert (eine solche Idee blieb sogar in <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>). Dort gab es separate Dateien f\u00fcr das Frontend, Modelle sowie eigene Controller-Klassen. Letztendlich verwandelte sich das System von so\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026zu einem solchen entwickelt:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Einige Module sind als separate Websites (ausf\u00fchrbares Projekt) implementiert, aufgrund von v\u00f6llig separaten Funktionen und teilweise aufgrund einer etwas anderen, fokussierten Entwicklung. Dazu z\u00e4hlen:<\/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>erste Version<\/u><\/a><\/noindex> seite dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Export<\/strong>: Datenexport aus Dodo IS f\u00fcr 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Personal<\/strong> \u2014 pers\u00f6nlicher Bereich f\u00fcr Mitarbeiter. Wurde separat entwickelt und hat seinen eigenen Zugangspunkt sowie ein eigenes Design.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 Projekt f\u00fcr das Hosting von statischen Inhalten. Sp\u00e4ter haben wir uns davon entfernt und alle statischen Inhalte auf das CDN Akamai \u00fcbertragen.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Die anderen Bl\u00f6cke waren in der BackOffice-Anwendung.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Erl\u00e4uterung zu den Bezeichnungen:<\/p>\n<ul>\n<li>\n<p>Cashier \u2014 Restaurantkasse.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 Schnittstellen f\u00fcr die Rolle \u201eSchichtmanager\u201c: aktuelle Statistiken \u00fcber den Pizzaverkauf, M\u00f6glichkeit, Produkte auf die Sperrliste zu setzen und Bestellungen zu \u00e4ndern.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 Schnittstellen f\u00fcr die Rolle \u201ePizzamanager\u201c und \u201eFranchisenehmer\u201c. Hier sind Funktionen zur Einstellung der Pizzeria, ihrer Bonusaktionen, Bearbeitung von Mitarbeitern und Berichten zusammengefasst.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 Schnittstellen f\u00fcr Fernseher und Tablets, die in den Pizzerien h\u00e4ngen. Auf den Fernsehern werden das Men\u00fc, Werbeinformationen und der Status der Bestellungen w\u00e4hrend der Ausgabe angezeigt.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Sie verwendeten eine gemeinsame Serviceschicht, einen gemeinsamen Block von Domainklassen Dodo.Core sowie eine gemeinsame Datenbank. Manchmal konnten sie auch durch \u00dcberg\u00e4nge zueinander gef\u00fchrt werden. Auch einzelne Websites wie dodopizza.ru oder personal.dodopizza.ru griffen auf die gemeinsamen Services zu.<\/p>\n<p>Bei der Einf\u00fchrung neuer Module wurde versucht, den bereits erstellten Code von Services, gespeicherten Prozeduren und Tabellen in der Datenbank maximal wiederzuverwenden.&nbsp;<\/p>\n<p>Um das Ausma\u00df der in das System implementierten Module besser zu verstehen, hier ein Diagramm aus dem Jahr 2012 mit Entwicklungspl\u00e4nen:<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bis 2015 war alles im Diagramm und sogar mehr in der Produktion.<\/p>\n<ul>\n<li>\n<p>Die Auftragsannahme entwickelte sich zu einem separaten Block des Contact Centers, wo die Bestellungen von einem Operator entgegengenommen werden.<\/p>\n<\/li>\n<li>\n<p>\u00d6ffentlich zug\u00e4ngliche Bildschirme mit dem Men\u00fc und Informationen wurden in den Pizzerien installiert.<\/p>\n<\/li>\n<li>\n<p>In der K\u00fcche gibt es ein Modul, das automatisch die Sprachmeldung \u201eNeue Pizza\u201c abspielt, wenn eine neue Bestellung eingeht, und auch die Quittung f\u00fcr den Kurier druckt. Dies vereinfacht die Abl\u00e4ufe in der K\u00fcche erheblich und entlastet die Mitarbeiter von einer Vielzahl einfacher Aufgaben.<\/p>\n<\/li>\n<li>\n<p>Der Lieferblock wurde zu einer separaten Lieferkasse, wo die Bestellung an den Kurier ausgegeben wurde, der zuvor einen Schichtwechsel vorgenommen hatte. Seine Arbeitszeit wurde f\u00fcr die Gehaltsabrechnung ber\u00fccksichtigt.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Parallel zwischen 2012 und 2015 kamen \u00fcber 10 Entwickler hinzu, es wurden 35 Pizzerien er\u00f6ffnet, das System wurde auf Rum\u00e4nien ausgeweitet und die Er\u00f6ffnung von Standorten in den USA vorbereitet. Die Entwickler besch\u00e4ftigten sich bereits nicht mehr mit allen Aufgaben, sondern waren in Teams aufgeteilt, die jeweils auf ihren Teil des Systems spezialisiert waren.&nbsp;<\/p>\n<h3>Probleme<\/h3>\n<p>Unter anderem aufgrund der Architektur (aber nicht nur).<\/p>\n<h4>Chaos in der Datenbank<\/h4>\n<p>Eine Datenbank \u2014 das ist praktisch. Damit kann man Konsistenz erreichen, und zwar durch Mittel, die in relationale Datenbanken integriert sind. Der Umgang mit ihr ist vertraut und bequem, besonders wenn es wenig Tabellen und wenig Daten gibt.<\/p>\n<p>Aber in den 4 Jahren der Entwicklung gab es in der Datenbank etwa 600 Tabellen, 1500 gespeicherte Prozeduren, in vielen davon war auch Logik enthalten. Leider bieten gespeicherte Prozeduren bei der Arbeit mit MySQL keinen besonderen Vorteil. Sie werden nicht von der Datenbank zwischengespeichert, und die Speicherung von Logik darin erschwert die Entwicklung und das Debugging. Die Wiederverwendung von Code ist ebenfalls erschwert.<\/p>\n<p><strong>Bei vielen Tabellen gab es keine passenden Indizes<\/strong>, woanders hingegen gab es sehr viele Indizes, was das Einf\u00fcgen erschwerte. Etwa 20 Tabellen mussten modifiziert werden \u2014 die Transaktion zur Erstellung einer Bestellung konnte etwa 3-5 Sekunden in Anspruch nehmen.&nbsp;<\/p>\n<p><strong>Die Daten in den Tabellen waren nicht immer in der am besten geeigneten Form<\/strong>. An manchen Stellen musste eine Denormalisierung durchgef\u00fchrt werden. Ein Teil der regelm\u00e4\u00dfig erhaltenen Daten war in einer Spalte in Form einer XML-Struktur, was die Ausf\u00fchrungszeit erh\u00f6hte, die Abfragen verl\u00e4ngerte und die Entwicklung erschwerte.<\/p>\n<p>Auf die gleichen Tabellen wurden sehr <strong>heterogene Abfragen ausgef\u00fchrt<\/strong>. Besonders litten die beliebten Tabellen, wie beispielsweise die erw\u00e4hnte Tabelle <em>orders<\/em> oder die Tabelle <em>pizzeria<\/em>. Sie wurden f\u00fcr die Darstellung operativer Schnittstellen in der K\u00fcche und f\u00fcr die Analytik verwendet. Au\u00dferdem wurde auf sie von der Website (<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>), die jederzeit viele pl\u00f6tzliche Anfragen erhalten konnte, zugegriffen.&nbsp;<\/p>\n<p><strong>Die Daten waren nicht aggregiert<\/strong> und viele Berechnungen fanden in Echtzeit durch die Datenbank statt. Das f\u00fchrte zu unn\u00f6tigen Berechnungen und zus\u00e4tzlicher Last.&nbsp;<\/p>\n<p>Oftmals wurde der Code in die Datenbank aufgerufen, wenn er es nicht h\u00e4tte tun m\u00fcssen. An manchen Stellen fehlten Bulk-Operationen, an anderen h\u00e4tte man eine Anfrage \u00fcber den Code in mehrere aufteilen m\u00fcssen, um die Geschwindigkeit zu erh\u00f6hen und die Zuverl\u00e4ssigkeit zu verbessern.&nbsp;<\/p>\n<h4>Verkn\u00fcpfung und Komplexit\u00e4t im Code<\/h4>\n<p><strong>Die Module, die f\u00fcr ihren Gesch\u00e4ftsbereich verantwortlich sein sollten, erf\u00fcllten dies nicht verl\u00e4sslich.<\/strong>. Einige von ihnen hatten Funktionalit\u00e4ten f\u00fcr Rollen, die sich \u00fcberschnitten. Zum Beispiel musste ein lokaler Marketingmitarbeiter, der f\u00fcr die Marketingaktivit\u00e4ten des Netzwerks in seiner Stadt verantwortlich war, sowohl das \u201eAdmin\u201c-Interface (f\u00fcr die Erstellung von Aktionen) als auch das \u201eB\u00fcromanager\u201c-Interface (f\u00fcr die Anzeige der Auswirkungen von Aktionen auf das Gesch\u00e4ft) nutzen. Nat\u00fcrlich verwendeten beide Module intern denselben Service, der mit den Bonusaktionen arbeitete.<\/p>\n<p>Dienste (Klassen innerhalb eines gro\u00dfen monolithischen Projekts) konnten sich gegenseitig aufrufen, um ihre Daten zu bereichern.<\/p>\n<p>Mit den Modellklassen, die die Daten speichern, <strong>wurde unterschiedlich im Code gearbeitet<\/strong>. An einigen Stellen gab es Konstruktoren, \u00fcber die man die erforderlichen Felder angeben konnte. An anderen Stellen wurde dies durch \u00f6ffentliche Eigenschaften erledigt. Nat\u00fcrlich war das Abrufen und Transformieren von Daten aus der Datenbank vielf\u00e4ltig.&nbsp;<\/p>\n<p><strong>Die Logik lag entweder in den Controllern oder in den Dienstklassen.<\/strong>&nbsp;<\/p>\n<p>Das sind zwar scheinbar kleine Probleme, aber sie verz\u00f6gerten die Entwicklung erheblich und verringerten die Qualit\u00e4t, was zu Instabilit\u00e4t und Fehlern f\u00fchrte.&nbsp;<\/p>\n<h4>Die Komplexit\u00e4t gro\u00dfer Entwicklungen<\/h4>\n<p><strong>Schwierigkeiten traten auch in der eigentlichen Entwicklung auf<\/strong>. Es mussten verschiedene Systembl\u00f6cke erstellt werden, und das parallel. Es wurde immer schwieriger, die Bed\u00fcrfnisse der einzelnen Komponenten in einen einheitlichen Code zu integrieren. Es war nicht einfach, sich zu einigen und allen Komponenten gleichzeitig gerecht zu werden. Hinzu kamen technologische Einschr\u00e4nkungen, insbesondere in Bezug auf die Datenbank und das Frontend. Man musste auf JQuery zugunsten hochgradiger Frameworks verzichten, insbesondere im Bereich der Client-Services (Webseite).<\/p>\n<p><strong>An bestimmten Stellen im System k\u00f6nnten besser geeignete Datenbanken eingesetzt werden<\/strong>. Beispielsweise hatten wir sp\u00e4ter einen Fall, in dem wir von Redis auf CosmosDB umgestiegen sind, um den Warenkorb zu speichern.&nbsp;<\/p>\n<p>Teams und Entwickler, die sich auf ihrem Gebiet engagierten, wollten eindeutig mehr Eigenverantwortung f\u00fcr ihre Dienste, sowohl in der Entwicklung als auch beim Rollout. Konflikte beim Mergen, Probleme bei Releases. Wenn dieses Problem f\u00fcr 5 Entwickler nicht erheblich war, so w\u00fcrde es bei 10, ganz zu schweigen von dem geplanten Wachstum, bedeutend ernster werden. Und in der Zukunft sollte die Entwicklung einer mobilen Anwendung beginnen (sie startete 2017, und 2018 gab es bereits <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">einen starken R\u00fcckgang<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>Verschiedene Teile des Systems erforderten unterschiedliche Stabilit\u00e4tsmerkmale.<\/strong>, aber aufgrund der starken Verkn\u00fcpfung des Systems konnten wir das nicht sicherstellen. Ein Fehler bei der Entwicklung einer neuen Funktion im Admin-Bereich h\u00e4tte durchaus Auswirkungen auf die Bestellannahme auf der Website haben k\u00f6nnen, denn der Code ist gemeinsam genutzt und wiederverwendbar, ebenso wie die Datenbank und die Daten.<\/p>\n<p>Wahrscheinlich h\u00e4tte man auch innerhalb solch einer monolithisch-modularen Architektur diese Fehler und Probleme vermeiden k\u00f6nnen: Verantwortung aufteilen, sowohl den Code als auch die Datenbank refaktorisieren, Schichten klar voneinander trennen und t\u00e4glich auf Qualit\u00e4t achten. Aber die gew\u00e4hlten Architekturl\u00f6sungen und der Fokus auf eine schnelle Erweiterung der Systemfunktionen f\u00fchrten zu Problemen in Bezug auf die Stabilit\u00e4t.<\/p>\n<h4>Wie der Blog von Sila umma in Restaurants Kassen gebracht hat<\/h4>\n<p>Wenn das Wachstum der Pizzakette (und die Last) im gleichen Tempo weitergegangen w\u00e4re, w\u00e4ren die Einbr\u00fcche irgendwann so gravierend geworden, dass das System nicht mehr hochgefahren werden k\u00f6nnte. Eine solche Geschichte veranschaulicht gut die Probleme, mit denen wir ab 2015 konfrontiert waren.&nbsp;<\/p>\n<p>Im Blog \u201e<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>Sila umma<\/u><\/a><\/noindex>\u201c gab es ein Widget, das die Einnahmedaten der gesamten Kette f\u00fcr ein Jahr anzeigte. Das Widget sprach die \u00f6ffentliche API von Dodo an, die diese Daten bereitstellt. Diese Statistiken sind jetzt verf\u00fcgbar unter <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. Das Widget wurde auf jeder Seite angezeigt und f\u00fchrte alle 20 Sekunden Anfragen \u00fcber einen Timer durch. Die Anfrage ging an api.dodopizza.ru und fragte an:<\/p>\n<ul>\n<li>\n<p>die Anzahl der Pizzerien im Netzwerk;<\/p>\n<\/li>\n<li>\n<p>die Gesamteinnahmen des Netzwerks seit Jahresbeginn;<\/p>\n<\/li>\n<li>\n<p>die Einnahmen f\u00fcr heute.<\/p>\n<\/li>\n<\/ul>\n<p>Die Anfrage nach den Einnahmen-Statistiken ging direkt an die Datenbank und begann, die Bestelldaten abzufragen, aggregierte die Daten in Echtzeit und gab die Summe aus.&nbsp;<\/p>\n<p>In diese Tabelle der Bestellungen flossen auch die Kassen in den Restaurants, die die Liste der heute angenommenen Bestellungen exportierten, und neue Bestellungen wurden ebenfalls hinzugef\u00fcgt. Die Kassen stellten alle 5 Sekunden oder bei einer Aktualisierung der Seite ihre Anfragen.<\/p>\n<p>Das Schema sah so aus:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Eines Herbstes schrieb Fedor Owtschinnikow einen langen und beliebten Artikel in seinem Blog. Der Blog wurde von sehr vielen Leuten aufgerufen und alle begannen, sorgf\u00e4ltig zu lesen. W\u00e4hrend jede Person, die gekommen war, den Artikel las, arbeitete das Widget mit den Einnahmen einwandfrei und fragte alle 20 Sekunden die API ab.<\/p>\n<p>Die API rief eine gespeicherte Prozedur zur Berechnung der Gesamtsumme aller Bestellungen seit Jahresbeginn in allen Pizzerien der Kette auf. Die Aggregation erfolgte \u00fcber die Tabelle orders, die sehr beliebt ist. In sie m\u00fcndeten alle Kassen aller zu diesem Zeitpunkt ge\u00f6ffneten Restaurants. Die Kassen h\u00f6rten auf zu antworten, Bestellungen wurden nicht angenommen. Zudem wurden sie auch nicht von der Website angenommen und erschienen nicht im Tracker, der Schichtmanager konnte sie nicht in seiner Benutzeroberfl\u00e4che sehen.&nbsp;<\/p>\n<p>Dies ist nicht die einzige Geschichte. Bis zum Herbst 2015 war die Last auf dem System jeden Freitag kritisch. Mehrmals schalteten wir die \u00f6ffentliche API aus, und einmal mussten wir sogar die Website abschalten, weil nichts mehr half. Es gab sogar eine Liste von Diensten mit einer Reihenfolge der Abschaltung bei ernsthaften Belastungen.<\/p>\n<p>Von diesem Zeitpunkt an begann unser Kampf gegen die Lasten und f\u00fcr die Stabilisierung des Systems (von Herbst 2015 bis Herbst 2018). Genau zu dieser Zeit geschah das \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Gro\u00dfe Fallen<\/u><\/a><\/noindex>\u201c. Auch danach gab es gelegentlich Ausf\u00e4lle, einige waren ziemlich empfindlich, aber den allgemeinen Zeitraum der Instabilit\u00e4t kann man jetzt als \u00fcberstanden betrachten.<\/p>\n<h4>Starker Wachstum des Gesch\u00e4fts<\/h4>\n<p>Warum konnte man nicht \u201esofort alles gut machen\u201c? Es reicht aus, sich die folgenden Grafiken anzusehen.<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Auch in den Jahren 2014-2015 gab es eine Er\u00f6ffnung in Rum\u00e4nien und die Er\u00f6ffnung in den USA wurde vorbereitet.<\/p>\n<p>Das Netzwerk wuchs sehr schnell, neue L\u00e4nder wurden er\u00f6ffnet, neue Formate von Pizzerien kamen hinzu, zum Beispiel wurde eine Pizzeria im Food Court er\u00f6ffnet. All dies erforderte erhebliche Aufmerksamkeit f\u00fcr die Erweiterung der Funktionen von Dodo IS. Ohne all diese Funktionen, ohne Tracking in der K\u00fcche, Produkt- und Verluststatistik im System, sowie die Anzeige der Bestellabgabe im Food Court, w\u00fcrden wir wohl heute nicht \u00fcber die \u201erichtige\u201c Architektur und den \u201erichtigen\u201c Ansatz in der Entwicklung sprechen.<\/p>\n<p>Ein weiteres Hindernis f\u00fcr eine zeitnahe \u00dcberarbeitung der Architektur und \u00fcberhaupt f\u00fcr die Aufmerksamkeit auf technische Probleme war die Krise von 2014. Solche Dinge treffen die Wachstumsf\u00e4higkeiten von Teams hart, besonders f\u00fcr junges Gesch\u00e4ft, wie Dodo Pizza es war.<\/p>\n<h3>Schnelle L\u00f6sungen, die geholfen haben<\/h3>\n<p>Die Probleme verlangten nach L\u00f6sungen. Grob gesagt, kann man die L\u00f6sungen in zwei Gruppen unterteilen:<\/p>\n<ul>\n<li>\n<p>Schnelle, die das Feuer l\u00f6schen und eine kleine Sicherheitsmarge bieten und uns Zeit f\u00fcr Ver\u00e4nderungen verschaffen.<\/p>\n<\/li>\n<li>\n<p>Systematische und daher langwierige. Reinventing mehrerer Module, Trennung der monolithischen Architektur in separate Dienste (die meisten sind durchaus keine Mikro-, sondern eher Makrodienste, und dar\u00fcber gibt es) <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>Bericht von Andrei Morevsky<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Die kurze Liste der schnellen \u00c4nderungen ist wie folgt:<\/p>\n<h4>Master-Datenbank skalieren<\/h4>\n<p>Nat\u00fcrlich ist das Erste, was zur Bek\u00e4mpfung von Belastungen getan wird, die Erh\u00f6hung der Serverleistung. Das wurde sowohl f\u00fcr die Master-Datenbank als auch f\u00fcr die Web-Server durchgef\u00fchrt. Leider ist dies nur bis zu einem bestimmten Punkt m\u00f6glich, danach wird es zu teuer.<\/p>\n<p>Seit 2014 haben wir auf Azure umgeschaltet, \u00fcber dieses Thema haben wir auch damals in dem Artikel \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">Wie Dodo Pizza Pizza mit Microsoft Azure Cloud liefert<\/a><\/noindex>\" geschrieben. Aber nach einer Reihe von Servererh\u00f6hungen f\u00fcr die Datenbank haben wir die Kosten \u00fcberschritten.&nbsp;<\/p>\n<h4>Lesereplikate der Datenbank<\/h4>\n<p>Es wurden zwei Replikate f\u00fcr die Datenbank erstellt:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>f\u00fcr Anfragen an Verzeichnisse<\/strong>. Es wird f\u00fcr das Lesen von Verzeichnissen verwendet, wie St\u00e4dte, Stra\u00dfen, Pizzerien, Produkte (slowly changed domain) und in den Schnittstellen, wo eine geringe Verz\u00f6gerung zul\u00e4ssig ist. Es gab 2 dieser Replikate, wir haben deren Verf\u00fcgbarkeit wie die der Master-Instanz sichergestellt.<\/p>\n<p><strong>ReadReplica f\u00fcr Berichtsanfragen<\/strong>. Diese Datenbank hatte eine geringere Verf\u00fcgbarkeit, aber alle Berichte liefen darauf. Auch wenn sie schwere Anfragen f\u00fcr enorme Datenberechnungen hatten, beeinflussten sie nicht die Hauptdatenbank und die Betriebsoberfl\u00e4chen.&nbsp;<\/p>\n<h4>Caches im Code<\/h4>\n<p>Es gab keine Caches im Code (\u00fcberhaupt). Das f\u00fchrte zu zus\u00e4tzlichen, nicht immer notwendigen Anfragen an die belastete Datenbank. Zun\u00e4chst waren Caches sowohl im Speicher als auch auf einem externen Cache-Dienst vorhanden, das war Redis. Alle wurden zeitlich invalidiert, die Einstellungen wurden im Code angegeben.<\/p>\n<h4>Mehrere Server f\u00fcr das Backend<\/h4>\n<p>Das Backend der Anwendung musste ebenfalls skaliert werden, um die gestiegenen Belastungen zu bew\u00e4ltigen. Es war notwendig, aus einem IIS-Server ein Cluster zu bilden. Wir haben die <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>Anwendungssitzung<\/u><\/a><\/noindex> von der Speicherung im Speicher auf RedisCache \u00fcbertragen, was die Einrichtung mehrerer Server hinter einem einfachen Lastenausgleich mit Round Robin erm\u00f6glichte. Zun\u00e4chst wurde dasselbe Redis verwendet wie f\u00fcr die Caches, sp\u00e4ter haben wir es auf mehrere verteilt.&nbsp;<\/p>\n<p>Insgesamt hat sich die Architektur verkompliziert\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur von Dodo IS: fr\u00fches Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/70a3e8d5578469239c08b4759ab32264.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026aber ein Teil der Anspannung konnte abgebaut werden.<\/p>\n<p>Dann mussten die belasteten Komponenten \u00fcberarbeitet werden, woran wir uns gemacht haben. Dar\u00fcber werden wir im n\u00e4chsten Teil berichten.<\/p>\n<p>Quelle: <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.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47Geschichte der Architektur Dodo IS: fr\u00fcher Monolith | ProHoster","description":"Oder jedes arme Unternehmen mit einem Monolithen ist auf seine Weise ungl\u00fccklich. Die Entwicklung des Systems Dodo IS begann gleichzeitig mit dem Gesch\u00e4ft von Dodo Pizza \u2013 im Jahr 2011.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/95804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=95804"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/95804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/95805"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=95804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=95804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=95804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}