{"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":"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Oder jedes ungl\u00fcckliche Unternehmen ist auf seine 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. Im Kern stand die Idee der vollst\u00e4ndigen und totalen Digitalisierung von Gesch\u00e4ftsprozessen, wobei <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>auf eigene Faust<\/u><\/a><\/noindex>, was bereits 2011 viele Fragen und Skepsis aufwarf. Doch nun sind wir seit 9 Jahren auf diesem Weg \u2014 mit einer eigenen Entwicklung, die als Monolith begann.<\/p>\n<p>Dieser Artikel ist eine \u201eAntwort\u201c auf die Fragen \u201eWarum die Architektur neu schreiben und solch umfangreiche und langwierige \u00c4nderungen vornehmen?\u201c auf den vorherigen Artikel <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\u201eDie Geschichte der Architektur von Dodo IS: der Weg des Backoffice\u201c<\/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 zu umfangreichen \u00c4nderungen f\u00fchrten.<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>Die Artikelserie \u201eWas ist Dodo IS?\u201c wird erz\u00e4hlen \u00fcber:<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>Der fr\u00fche Monolith in Dodo IS (2011-2015 Jahre). (Hier sind Sie)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">Backoffice-Weg: getrennte Datenbanken und Bus<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>Der Weg des Kundenbereichs: Fassade \u00fcber der Datenbank (2016-2017). (In Bearbeitung\u2026)<\/p>\n<\/li>\n<li>\n<p>Die Geschichte echter Mikrodienste. (2018-2019). (In Bearbeitung\u2026)<\/p>\n<\/li>\n<li>\n<p>Abgeschlossene Zerlegung des Monolithen und Stabilisierung der Architektur. (In Bearbeitung\u2026)<\/p>\n<\/li>\n<\/ol>\n<h3>Die urspr\u00fcngliche Architektur<\/h3>\n<p>Im Jahr 2011 sah die Architektur von Dodo IS so aus:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Das erste Modul in der Architektur ist die Bestellannahme. 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 das Telefon ab;<\/p>\n<\/li>\n<li>\n<p>nimmt die Bestellung am Telefon entgegen;<\/p>\n<\/li>\n<li>\n<p>gleichzeitig gibt er sie im Bestellannahme-Interface ein: Die Informationen \u00fcber den Kunden, die Bestelldetails und die Lieferadresse werden erfasst.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Das Interface des Informationssystems sah ungef\u00e4hr so aus\u2026<\/p>\n<p>Die erste Version von 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 einem kleinen Team erledigt werden. Ein kleines Team bedeutet 2 Entwickler, die das Fundament des gesamten zuk\u00fcnftigen Systems gelegt haben.<\/p>\n<p>Ihre erste Entscheidung pr\u00e4gte das weitere Schicksal des technologischen Stacks:<\/p>\n<ul>\n<li>\n<p>Backend auf ASP.NET MVC, Sprache C#. Die Entwickler waren .NET-Experten, dieser Stack war ihnen vertraut und angenehm. <\/p>\n<\/li>\n<li>\n<p>Frontend auf Bootstrap und JQuery: Nutzeroberfl\u00e4chen mit selbstgeschriebenen Stilen und Skripten.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Datenbank MySQL: ohne Lizenzkosten, einfach zu bedienen.<\/p>\n<\/li>\n<li>\n<p>Server auf Windows Server, da .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 dedizierten Server beim Anbieter.&nbsp;<\/p>\n<h4>Architektur der Bestellannahme-Anwendung<\/h4>\n<p>Damals sprach jeder von Mikroservices, w\u00e4hrend SOA bereits seit etwa 5 Jahren in gro\u00dfen Projekten verwendet wurde. Zum Beispiel wurde WCF 2006 eingef\u00fchrt. Dennoch entschied man sich f\u00fcr eine bew\u00e4hrte und zuverl\u00e4ssige L\u00f6sung.<\/p>\n<p>Hier ist es.<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche 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 serverseitigem Rendering liefert. Auf dem Client werden CSS und JS-Skripte eingesetzt, um Informationen darzustellen und bei Bedarf AJAX-Anfragen \u00fcber JQuery auszuf\u00fchren.<\/p>\n<p>Serveranfragen gelangen in Klassen *Controller, wo die Verarbeitung und Generierung der finalen HTML-Seite in einer Methode erfolgt. Die Controller stellen Anfragen an die Logikschicht, die *Services genannt wird. Jeder dieser Services ist f\u00fcr einen bestimmten Aspekt des Gesch\u00e4fts zust\u00e4ndig:<\/p>\n<ul>\n<li>\n<p>Zum Beispiel lieferte der DepartmentStructureService Informationen \u00fcber Pizzerien und Abteilungen. Eine Abteilung ist eine Gruppe von Pizzerien, die von einem Franchisenehmer verwaltet wird.<\/p>\n<\/li>\n<li>\n<p>ReceivingOrdersService nahm die Bestellungen entgegen und berechnete deren Inhalt.<\/p>\n<\/li>\n<li>\n<p>Der SmsService versendete SMS, indem er API-Services f\u00fcr den SMS-Versand aufrief.<\/p>\n<\/li>\n<\/ul>\n<p>Die Dienste verarbeiteten Daten aus der Datenbank und speicherten die Gesch\u00e4ftslogik. Jeder Dienst verf\u00fcgte \u00fcber ein oder mehrere *Repository mit entsprechenden Bezeichnungen. Darin befanden sich bereits Abfragen f\u00fcr gespeicherte Prozeduren in der Datenbank sowie eine Mapper-Schicht. In den Speicherprozeduren war die Gesch\u00e4ftslogik implementiert, insbesondere in denjenigen, die Berichtsdaten auslieferten. ORM wurde nicht verwendet; alle vertrauten auf selbstgeschriebenen SQL-Code.&nbsp;<\/p>\n<p>Es gab auch eine Schicht der Dom\u00e4nenmodellierung und allgemeine Hilfsklassen, wie z.B. die Klasse Order, die den Auftrag speicherte. Auch in dieser Schicht befand sich ein Helfer zur Umwandlung des Darstellungstextes je nach gew\u00e4hlter W\u00e4hrung.<\/p>\n<p>All dies kann durch folgendes Modell veranschaulicht werden: <\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche 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 Prozess zur Erstellung einer solchen Bestellung.<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche 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 die Preise aufgef\u00fchrt, und oben stand eine Telefonnummer mit dem Hinweis \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 der angenommenen Bestellungen angezeigt.<\/p>\n<\/li>\n<\/ul>\n<p>Alles beginnt mit der Anzeige des Men\u00fcs. Ein angemeldeter Benutzer-Operator kann zu einem bestimmten Zeitpunkt nur eine Bestellung annehmen. Daher kann der Entwurf-Warenkorb in seiner Sitzung gespeichert werden (die Benutzersitzung wird im Speicher gehalten). Darin befindet sich das Objekt Cart, das Produkte und Informationen \u00fcber den Kunden enth\u00e4lt.<\/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 zu dem Produkt werden aus der Datenbank abgerufen und die Produktinformationen werden dem Warenkorb hinzugef\u00fcgt.<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Hinweis<\/strong>. Ja, hier kann das Produkt auch \u00fcber das Frontend \u00fcbergeben werden, aber zur Veranschaulichung habe ich den Weg \u00fcber die Datenbank gezeigt.&nbsp;<\/p>\n<p>Anschlie\u00dfend geben wir die Adresse und den Namen des Kunden ein.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Beim Dr\u00fccken von \u201eAuftrag erstellen\u201c:<\/p>\n<ul>\n<li>\n<p>Wird die Anfrage an OrderController.SaveOrder() gesendet.<\/p>\n<\/li>\n<li>\n<p>Wir erhalten den Cart aus der Sitzung, dort liegen die Produkte in der ben\u00f6tigten Menge.<\/p>\n<\/li>\n<li>\n<p>Wir erg\u00e4nzen den Cart mit den Informationen des Kunden und \u00fcbergeben ihn an die Methode AddOrder der Klasse ReceivingOrderService, wo er in der Datenbank gespeichert wird.&nbsp;<\/p>\n<\/li>\n<li>\n<p>In der Datenbank gibt es Tabellen mit der Bestellung, dem Bestellinhalt, dem Kunden, und diese sind alle miteinander verbunden.<\/p>\n<\/li>\n<li>\n<p>Die Benutzeroberfl\u00e4che zur Anzeige der Bestellung ruft die letzten Bestellungen ab und zeigt sie an.<\/p>\n<\/li>\n<\/ul>\n<h4>Neue Module<\/h4>\n<p>\u041f\u0440\u0438\u0435\u043c \u0437\u0430\u043a\u0430\u0437\u0430 \u0431\u044b\u043b \u0432\u0430\u0436\u0435\u043d \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c. \u041d\u0435\u043b\u044c\u0437\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441 \u043f\u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u043f\u0438\u0446\u0446\u044b, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u043f\u0440\u0438\u0435\u043c\u0430 \u0437\u0430\u043a\u0430\u0437\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u0436\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u0440\u0430\u0441\u0442\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u2014&nbsp;\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441 2012 \u043f\u043e 2015 \u0433\u043e\u0434\u0430. \u0417\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0431\u0443\u0434\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c <strong>Module<\/strong>, im Gegensatz zum Konzept eines Dienstes oder Produkts, bezeichnen werde.&nbsp;<\/p>\n<p>Ein Modul ist eine Funktionseinheit, die mit einem gemeinsamen Gesch\u00e4ftsziel verkn\u00fcpft ist. Physisch befinden sie sich jedoch in einer Anwendung.<\/p>\n<p>Module k\u00f6nnen als Systembl\u00f6cke betrachtet werden. Zum Beispiel gibt es ein Modul f\u00fcr Berichte, Admin-Interfaces, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>Produkt-Tracker in der K\u00fcche<\/u><\/a><\/noindex>, Authentifizierung. All diese sind unterschiedliche Benutzeroberfl\u00e4chen, einige haben sogar verschiedene visuelle Stile. Dennoch sind sie alle Teil einer einzigen Anwendung und eines gemeinsamen Prozesses.&nbsp;<\/p>\n<p>Technisch wurden die Module als Area gestaltet (diese Idee findet sich 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>). \u0422\u0430\u043c \u0431\u044b\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430, \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0432\u043e\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438\u0437 \u0442\u0430\u043a\u043e\u0439&#8230;<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026zu einem solchen:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Einige Module werden von separaten Websites (ausf\u00fchrbares Projekt) realisiert, aufgrund v\u00f6llig unterschiedlicher Funktionen und teilweise wegen einer fokussierter entwickelten Umsetzung. Dies sind:<\/p>\n<ul>\n<li>\n<p><strong>Website<\/strong> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2013\/08\/06\/new_site_dodopizza_ru\/\"><u>erste Version<\/u><\/a><\/noindex> der Website dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Export<\/strong>: Export von Berichten aus Dodo IS f\u00fcr 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Personal<\/strong> \u2014 pers\u00f6nliches Mitarbeiter-Dashboard. Wurde separat entwickelt und hat einen eigenen Zugang sowie ein individuelles Design.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 Projekt f\u00fcr das Hosting von statischen Inhalten. Sp\u00e4ter haben wir davon abgesehen und alle statischen Inhalte auf das CDN Akamai migriert.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Die anderen Bl\u00f6cke waren in der BackOffice-Anwendung untergebracht.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Erkl\u00e4rung zu den Bezeichnungen:<\/p>\n<ul>\n<li>\n<p>Cashier \u2014 Kasse des Restaurants.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 Schnittstellen f\u00fcr die Rolle \"Schichtmanager\": \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f Statistiken \u00fcber den Verkauf der Pizzeria, die M\u00f6glichkeit, Produkte auf die Stop-Liste zu setzen, Bestellung zu \u00e4ndern.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 Schnittstellen f\u00fcr die Rollen \"Pizzeria-Manager\" und \"Franchisenehmer\". Hier sind die Funktionen zur Einrichtung der Pizzeria, ihrer Bonusaktionen sowie zur Verwaltung und Berichterstattung \u00fcber Mitarbeiter gesammelt.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 Schnittstellen f\u00fcr Fernseher und Tablets, die in Pizzerien h\u00e4ngen. Auf den Fernsehern wird das Men\u00fc, Werbeinformationen und der Status der Bestellungen angezeigt.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Sie verwendeten eine gemeinsame Service-Schicht, einen gemeinsamen Block von Domain-Klassen Dodo.Core sowie eine gemeinsame Datenbank. Manchmal konnten sie auch zwischen den einzelnen Modulen hin und her navigieren, einschlie\u00dflich des Zugriffs auf gemeinsame Dienste von separaten Websites wie dodopizza.de oder personal.dodopizza.de.<\/p>\n<p>Bei der Einf\u00fchrung neuer Module wurde versucht, den bereits erstellten Code von Diensten, gespeicherten Prozeduren und Tabellen in der Datenbank maximal wiederzuverwenden.&nbsp;<\/p>\n<p>Um das Ausma\u00df der in der System entwickelten Module besser zu verstehen, sehen Sie hier ein Schema aus dem Jahr 2012 mit Entwicklungspl\u00e4nen:<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bis 2015 war alles im Schema und sogar mehr in der Produktion.<\/p>\n<ul>\n<li>\n<p>Die Bestellannahme entwickelte sich zu einem separaten Block des Kontaktcenters, in dem die Bestellungen von einem Operator entgegengenommen werden.<\/p>\n<\/li>\n<li>\n<p>Es wurden \u00f6ffentliche Bildschirme mit Men\u00fcs und Informationen eingerichtet, die in den Pizzerien aufgeh\u00e4ngt sind.<\/p>\n<\/li>\n<li>\n<p>In der K\u00fcche gibt es ein Modul, das automatisch die sprachliche Nachricht \u201eNeue Pizza\u201c abspielt, wenn eine neue Bestellung eingeht, und auch einen Lieferschein f\u00fcr den Kurier druckt. Dies vereinfacht die Prozesse in der K\u00fcche erheblich und erm\u00f6glicht es den Mitarbeitern, sich nicht mit einer Vielzahl von einfachen Aufgaben ablenken zu lassen.<\/p>\n<\/li>\n<li>\n<p>Der Zustellblock wurde zu einer separaten Lieferkasse, wo die Bestellung an den Kurier \u00fcbergeben wurde, der sich zuvor f\u00fcr seine Schicht gemeldet hatte. Seine Arbeitszeit wurde zur Gehaltsabrechnung ber\u00fccksichtigt.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Parallel dazu entstanden zwischen 2012 und 2015 mehr als 10 Entwickler, 35 Pizzerien wurden er\u00f6ffnet, das System wurde in Rum\u00e4nien implementiert und die Er\u00f6ffnung von Standorten in den USA vorbereitet. Die Entwickler waren nicht mehr mit allen Aufgaben betraut, sondern in Teams aufgeteilt, wobei jedes Team sich auf seinen Teil des Systems spezialisierte.&nbsp;<\/p>\n<h3>Die Probleme<\/h3>\n<p>Weshalb auch aufgrund der Architektur (aber nicht nur).<\/p>\n<h4>Chaos in der Datenbank<\/h4>\n<p>Eine Datenbank ist praktisch. Man kann Konsistenz erreichen, insbesondere durch Mittel, die in relationale Datenbanken integriert sind. Die Arbeit mit ihr ist gewohnt und angenehm, besonders wenn es wenige Tabellen und wenig Daten gibt.<\/p>\n<p>Aber nach 4 Jahren Entwicklung gab es in der Datenbank etwa 600 Tabellen und 1500 gespeicherte Prozeduren, viele davon enthielten sogar Logik. Leider bringen gespeicherte Prozeduren bei der Arbeit mit MySQL keine besonderen Vorteile. 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>Viele Tabellen hatten keine geeigneten Indizes.<\/strong>, wo es viele Indizes gab, die das Einf\u00fcgen erschwerten. Etwa 20 Tabellen mussten modifiziert werden \u2013 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 geeignetsten Form.<\/strong>. An einigen Stellen war eine Denormalisierung erforderlich. Ein Teil der regelm\u00e4\u00dfig abgerufenen Daten lag in einer XML-Struktur in einer Spalte vor, was die Ausf\u00fchrungszeit verl\u00e4ngerte, die Abfragen komplizierter machte und die Entwicklung erschwerte.<\/p>\n<p>F\u00fcr dieselben Tabellen wurden sehr <strong>heterogene Abfragen<\/strong>. Besonders litten die beliebten Tabellen, wie die erw\u00e4hnte Tabelle <em>orders<\/em> oder die Tabelle <em>pizzeria<\/em>. Sie wurden f\u00fcr die Anzeige von operativen Schnittstellen in der K\u00fcche und f\u00fcr Analysen verwendet. Auch die Website<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>, die jederzeit unerwartet viele Anfragen erhalten konnte.&nbsp;<\/p>\n<p><strong>Die Daten waren nicht aggregiert<\/strong> und viele Berechnungen fanden in Echtzeit mit Mitteln der Datenbank statt. Das erzeugte \u00fcberfl\u00fcssige Berechnungen und zus\u00e4tzliche Last.&nbsp;<\/p>\n<p>Oft wurde die Datenbank aufgerufen, obwohl dies nicht notwendig war. An einigen Stellen fehlten Bulk-Operationen, an anderen h\u00e4tte man eine Anfrage auf mehrere verteilen m\u00fcssen, um die Geschwindigkeit zu erh\u00f6hen und die Zuverl\u00e4ssigkeit zu verbessern.&nbsp;<\/p>\n<h4>Zusammenhang und Verwirrung im Code<\/h4>\n<p><strong>Module, die f\u00fcr ihren Gesch\u00e4ftsbereich verantwortlich sein sollten, haben dies nicht ordnungsgem\u00e4\u00df getan.<\/strong>. Einige von ihnen hatten funktionale \u00dcberschneidungen f\u00fcr verschiedene Rollen. Zum Beispiel musste der lokale Marketingmitarbeiter, der f\u00fcr die Marketingaktivit\u00e4ten im Netzwerk in seiner Stadt zust\u00e4ndig war, sowohl die Admin-Schnittstelle (f\u00fcr die Erstellung von Aktionen) als auch die Schnittstelle des B\u00fcromanager (f\u00fcr die Auswertung 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>Die Services (Klassen innerhalb eines monolithischen gro\u00dfen Projekts) konnten sich gegenseitig aufrufen, um ihre Daten anzureichern.<\/p>\n<p>Mit den Klassenmodellen, die Daten speichern, <strong>wurde im Code unterschiedlich gearbeitet.<\/strong>. An manchen Stellen gab es Konstruktoren, \u00fcber die man die Pflichtfelder angeben konnte. An anderen Stellen geschah dies \u00fcber \u00f6ffentliche Eigenschaften. Nat\u00fcrlich war das Abrufen und Verarbeiten von Daten aus der Datenbank unterschiedlich.&nbsp;<\/p>\n<p><strong>Die Logik lag entweder in den Controllern oder in den Serviceklassen.<\/strong>&nbsp;<\/p>\n<p>Das m\u00f6gen kleine Probleme erscheinen, aber sie haben die Entwicklung stark verlangsamt und die Qualit\u00e4t gesenkt, was zu Instabilit\u00e4t und Fehlern f\u00fchrte.&nbsp;<\/p>\n<h4>Die Komplexit\u00e4t gro\u00dfer Entwicklungen.<\/h4>\n<p><strong>Es gab Herausforderungen bereits in der Entwicklung selbst.<\/strong>. Es musste an verschiedenen Systembl\u00f6cken gleichzeitig gearbeitet werden. Die Bed\u00fcrfnisse jedes einzelnen Bausteins in einen einheitlichen Code zu integrieren, wurde immer schwieriger. Es war nicht einfach, sich zu einigen und allen Komponenten gleichzeitig gerecht zu werden. Hinzu kamen technologische Einschr\u00e4nkungen, insbesondere im Hinblick auf die Datenbank und das Frontend. Wir mussten aufh\u00f6ren, JQuery zu verwenden und auf hochrangige Frameworks umzusteigen, insbesondere im Bereich der Client-Services (Website).<\/p>\n<p><strong>In einigen Teilen des Systems h\u00e4tten Datenbanken verwendet werden k\u00f6nnen, die besser geeignet w\u00e4ren.<\/strong>. Zum Beispiel hatten wir sp\u00e4ter einen Fall, in dem wir von Redis zu CosmosDB gewechselt sind, um den Warenkorb zu speichern.&nbsp;<\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u0432\u043e\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u044f\u0432\u043d\u043e \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u0430\u043a \u0432 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0430\u043a \u0438 \u0432 \u0447\u0430\u0441\u0442\u0438 \u0432\u044b\u043a\u0430\u0442\u043a\u0438. \u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u043f\u0440\u0438 \u043c\u0435\u0440\u0436\u0435, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u0438 \u0440\u0435\u043b\u0438\u0437\u0430\u0445. \u0415\u0441\u043b\u0438 \u0434\u043b\u044f 5 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u044d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430, \u0442\u043e \u043f\u0440\u0438 10, \u0430 \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435&nbsp; \u043f\u0440\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u0440\u043e\u0441\u0442\u0435, \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u0431\u044b \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0435\u0435. \u0410 \u0430 \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043e\u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0430\u043d\u0443\u043b\u0430 \u0432 2017, \u0430 \u0432 2018 \u0431\u044b\u043b\u043e <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">a significant drop<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>Different parts of the system required different stability metrics<\/strong>, but due to the strong interconnectivity of the system, we were unable to ensure this. An error during the development of a new feature in the admin panel could easily affect order processing on the website, since the code is shared and reusable, and the database and data are also unified.<\/p>\n<p>Es w\u00e4re wahrscheinlich m\u00f6glich gewesen, innerhalb einer solchen monolithisch-modularen Architektur diese Fehler und Probleme zu vermeiden: Verantwortlichkeiten klar zu trennen, sowohl den Code als auch die Datenbank regelm\u00e4\u00dfig zu refaktorisieren, die Schichten klar voneinander zu halten und t\u00e4glich auf die Qualit\u00e4t zu achten. Doch die getroffenen architektonischen Entscheidungen und der Fokus auf eine schnelle Erweiterung der Systemfunktionen f\u00fchrten zu Stabilit\u00e4tsproblemen.<\/p>\n<h4>Wie der Blog \"Kraft des Geistes Kassen in Restaurants eingebracht hat\"<\/h4>\n<p>W\u00e4re das Wachstum des Pizza-Netzwerks (und der Last) im gleichen Tempo weitergegangen, w\u00e4ren die Ausf\u00e4lle irgendwann so gravierend geworden, dass das System nicht mehr hochgefahren werden k\u00f6nnte. Eine anschauliche Geschichte, die die Herausforderungen verdeutlicht, mit denen wir ab 2015 konfrontiert waren.&nbsp;<\/p>\n<p>Im Blog \"<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>Kraft des Geistes<\/u><\/a><\/noindex>\" gab es ein Widget, das die Einnahmen der gesamten Kette f\u00fcr das Jahr anzeigte. Das Widget griff auf die \u00f6ffentliche API von Dodo zu, die diese Daten bereitstellt. Jetzt ist diese Statistik 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 machte alle 20 Sekunden Anfragen. Die Anfrage wurde an api.dodopizza.ru gesendet und fragte nach:<\/p>\n<ul>\n<li>\n<p>der Anzahl der Pizzerien im Netzwerk;<\/p>\n<\/li>\n<li>\n<p>den Gesamteinnahmen des Netzwerks seit Jahresbeginn;<\/p>\n<\/li>\n<li>\n<p>den Einnahmen von heute.<\/p>\n<\/li>\n<\/ul>\n<p>Die Anfrage nach den Einnahmen wurde direkt an die Datenbank gesendet, um die Bestelldaten zu sammeln und diese in Echtzeit zu aggregieren und die Summe auszugeben.&nbsp;<\/p>\n<p>In dieselbe Bestelltabelle importierten die Kassen in den Restaurants die Liste der heute angenommenen Bestellungen, und neue Bestellungen wurden ebenfalls hinzugef\u00fcgt. Die Kassen f\u00fchrten ihre Anfragen alle 5 Sekunden oder bei einer Seitenaktualisierung durch.<\/p>\n<p>Das Schema sah so aus:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Eines Herbsts schrieb Fjodor Owtschinnikow einen langen und beliebten Artikel in seinem Blog. Viele Menschen besuchten den Blog und lasen aufmerksam alles. W\u00e4hrend jeder der Besucher den Artikel las, arbeitete das Widget zur Einnahmen\u00fcberpr\u00fcfung und forderte alle 20 Sekunden die API an.<\/p>\n<p>Die API rief eine gespeicherte Prozedur auf, um die Summe aller Bestellungen seit Jahresbeginn in allen Pizzerien der Kette zu berechnen. Die Aggregation erfolgte \u00fcber die Tabelle 'orders', die sehr beliebt ist. Au\u00dferdem greifen alle Kassen aller zu diesem Zeitpunkt ge\u00f6ffneten Restaurants auf diese zu. Die Kassen h\u00f6rten auf zu reagieren, Bestellungen wurden nicht angenommen. Sie wurden auch nicht \u00fcber die Website angenommen und erschienen nicht im Tracker; der Schichtleiter konnte sie in seiner Benutzeroberfl\u00e4che nicht sehen.&nbsp;<\/p>\n<p>Dies ist nicht die einzige Geschichte. Bis zum Herbst 2015 war die Systemlast jeden Freitag kritisch. Mehrfach mussten wir die \u00f6ffentliche API deaktivieren, und einmal mussten wir sogar die Website abschalten, da nichts mehr half. Es gab sogar eine Liste von Diensten mit einer Reihenfolge der Abschaltung bei schwerwiegenden Lasten.<\/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 dann kam es zu der \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Gro\u00dfen Katastrophe<\/u><\/a><\/noindex>\". Auch danach gab es gelegentlich Ausf\u00e4lle, einige waren ziemlich empfindlich, aber die allgemeine Phase der Instabilit\u00e4t kann jetzt als \u00fcberwunden betrachtet werden.<\/p>\n<h4>Starkes Unternehmenswachstum<\/h4>\n<p>Warum konnte man nicht \"von Anfang an alles richtig machen\"? Ein Blick auf die folgenden Grafiken reicht aus.<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche Monolith\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Au\u00dferdem gab es 2014-2015 eine Er\u00f6ffnung in Rum\u00e4nien und die Vorbereitung einer Er\u00f6ffnung in den USA.<\/p>\n<p>Das Netzwerk entwickelte sich sehr schnell, neue L\u00e4nder wurden erschlossen, neue Formate von Pizzerien kamen hinzu, wie zum Beispiel die Er\u00f6ffnung einer Pizzeria in einer Food Hall. All dies erforderte erhebliche Aufmerksamkeit f\u00fcr die Weiterentwicklung der Dodo IS-Funktionen. Ohne all diese Funktionen, ohne K\u00fcchen-Tracking, Ber\u00fccksichtigung von Produkten und Verlusten im System, sowie die Anzeige der Auftragsausgabe im Food-Hall-Bereich, w\u00e4re es wahrscheinlich nicht m\u00f6glich gewesen, \u00fcber die \"richtige\" Architektur und den \"richtigen\" Ansatz bei der Entwicklung zu diskutieren.<\/p>\n<p>Ein weiteres Hindernis f\u00fcr eine zeitnahe \u00dcberpr\u00fcfung der Architektur und generell f\u00fcr die Aufmerksamkeit auf technische Probleme war die Krise im Jahr 2014. Solche Ereignisse wirken sich stark auf das Wachstumspotenzial der Teams aus, besonders f\u00fcr ein junges Unternehmen wie Dodo Pizza.<\/p>\n<h3>Schnelle L\u00f6sungen, die geholfen haben<\/h3>\n<p>Die Probleme verlangten nach L\u00f6sungen. Man kann die L\u00f6sungen grob in zwei Gruppen unterteilen:<\/p>\n<ul>\n<li>\n<p>Schnelle L\u00f6sungen, die das Feuer l\u00f6schen und einen kleinen Puffer bieten, um uns Zeit f\u00fcr \u00c4nderungen zu gewinnen.<\/p>\n<\/li>\n<li>\n<p>Systemische und daher langwierige L\u00f6sungen. Die Neugestaltung verschiedener Module, die Aufteilung der monolithischen Architektur in separate Dienste (die meisten von ihnen sind eher Makro- als Mikrodienste, und dar\u00fcber gibt es) <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>den Bericht von Andrei Morevsky<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Die \u00dcbersicht der schnellen \u00c4nderungen lautet wie folgt:<\/p>\n<h4>Master-Datenbank skalieren<\/h4>\n<p>Nat\u00fcrlich ist der erste Schritt zur Bew\u00e4ltigung von Lasten die Erh\u00f6hung der Serverleistung. Dies wurde sowohl f\u00fcr die Master-Datenbank als auch f\u00fcr die Web-Server durchgef\u00fchrt. Leider ist dies nur bis zu einem gewissen Punkt m\u00f6glich, danach werden die Kosten zu hoch.<\/p>\n<p>Seit 2014 haben wir auf Azure umgestellt, dar\u00fcber haben wir zu dieser Zeit auch in dem Artikel \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">Wie Dodo Pizza mit Microsoft Azure Cloud Pizza ausliefert<\/a><\/noindex>\" geschrieben. Nach einer Reihe von Servererh\u00f6hungen f\u00fcr die Datenbank sind die Kosten an eine Grenze gesto\u00dfen.&nbsp;<\/p>\n<h4>Lese-Replikate der Datenbank<\/h4>\n<p>Es wurden zwei Replikate f\u00fcr die Datenbank erstellt:<\/p>\n<p><strong>ReadReplica<\/strong> <strong>f\u00fcr Abfragen von Verzeichnissen<\/strong>. Es wird verwendet, um Verzeichnisse zu lesen, wie zum Beispiel St\u00e4dte, Stra\u00dfen, Pizzerien, Produkte (langsam ge\u00e4nderter Bereich), und in solchen Schnittstellen, wo eine kleine Verz\u00f6gerung akzeptabel ist. Diese Replikate waren zwei, wir haben ihre Verf\u00fcgbarkeit genauso sichergestellt wie die der Master-Datenbank.<\/p>\n<p><strong>ReadReplica f\u00fcr Berichtsanfragen<\/strong>. Bei dieser Datenbank war die Verf\u00fcgbarkeit geringer, aber sie hatte alle Berichte. Auch wenn sie schwere Abfragen f\u00fcr enorme Datenberechnungen haben, wirken sie sich nicht auf die Hauptdatenbank und die operativen Schnittstellen aus.&nbsp;<\/p>\n<h4>Caches im Code<\/h4>\n<p>Im Code gab es keine Caches (\u00fcberhaupt). Dies f\u00fchrte zu zus\u00e4tzlichen, nicht immer erforderlichen Anfragen an die stark belastete Datenbank. Die Caches waren zun\u00e4chst sowohl im Speicher als auch in einem externen Cache-Dienst, dem Redis, vorhanden. Alle wurden zeitgesteuert invalidiert, die Einstellungen waren im Code angegeben.<\/p>\n<h4>Mehrere Server f\u00fcr das Backend<\/h4>\n<p>Das Backend der Anwendung musste ebenfalls skaliert werden, um h\u00f6heren Lasten standzuhalten. Es war notwendig, aus einem IIS-Server ein Cluster zu bilden. Wir haben <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>die Anwendungssitzung<\/u><\/a><\/noindex> vom Speicher auf RedisCache umgestellt, was die Einrichtung mehrerer Server hinter einem einfachen Load-Balancer mit Round Robin erm\u00f6glichte. Zun\u00e4chst wurde derselbe Redis wie f\u00fcr die Caches verwendet, sp\u00e4ter wurde er auf mehrere verteilt.&nbsp;<\/p>\n<p>Letztendlich hat sich die Architektur kompliziert \u2026<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der fr\u00fche 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>Als N\u00e4chstes mussten die stark belasteten Komponenten \u00fcberarbeitet werden, wof\u00fcr wir uns auch eingesetzt 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 4.9.10 - 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. \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 \u0442\u0430\u043a\u043e\u043c\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) 4.9.10\" \/>\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. \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 \u0442\u0430\u043a\u043e\u043c\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\udd47Die Entwicklungsgeschichte der Architektur von Dodo IS: Der fr\u00fche Monolith | ProHoster","description":"Jedes ungl\u00fcckliche Unternehmen hat auf seine eigene Weise mit einem Monolithen zu k\u00e4mpfen. Die Entwicklung des Dodo IS-Systems begann parallel zur Gr\u00fcndung von Dodo Pizza im Jahr 2011. Im Vordergrund stand die Idee, die Gesch\u00e4ftsprozesse umfassend und vollst\u00e4ndig zu digitalisieren, und das mit eigenen Mitteln \u2014 was bereits 2011 viele Fragen und Skepsis aufwarf. Doch nun, nach 9 Jahren, setzen wir unseren Weg fort.","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. \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 \u0442\u0430\u043a\u043e\u043c\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"},"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}]}}