{"id":95786,"date":"2020-10-03T13:42:12","date_gmt":"2020-10-03T11:42:12","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-put-bekofisa"},"modified":"2020-10-03T13:42:12","modified_gmt":"2020-10-03T11:42:12","slug":"istoriya-arhitektury-dodo-is-put-bekofisa","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-put-bekofisa","title":{"rendered":"Geschichte der Dodo IS-Architektur: der Weg des Backoffice","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Habr ver\u00e4ndert die Welt. Seit \u00fcber einem Jahr f\u00fchren wir unseren Blog. Vor etwa einem halben Jahr erhielten wir ein v\u00f6llig logisches Feedback von den Habr-Nutzern: \u201eDodo, ihr sagt \u00fcberall, dass ihr euer eigenes System habt. Was ist das f\u00fcr ein System? Und warum ist es f\u00fcr eine Pizzakette notwendig?\u201c. <\/p>\n<p>Wir haben uns zusammengesetzt, nachgedacht und verstanden, dass ihr recht habt. Wir versuchen, alles einfach zu erkl\u00e4ren, aber es kommt in abgehackten H\u00e4ppchen und es gibt nirgendwo eine vollst\u00e4ndige Beschreibung des Systems. So begann ein langer Weg zur Informationssammlung, der Suche nach Autoren und dem Schreiben einer Reihe von Artikeln \u00fcber Dodo IS. Lass uns loslegen!<\/p>\n<blockquote><p><i>Dankesch\u00f6n: Vielen Dank, dass ihr euer Feedback mit uns teilt. Dank euch haben wir endlich das System beschrieben, einen Technologieradar erstellt und werden bald eine ausf\u00fchrliche Beschreibung unserer Prozesse ver\u00f6ffentlichen. Ohne euch s\u00e4\u00dfen wir wahrscheinlich noch weitere 5 Jahre hier. <\/i><\/p><\/blockquote>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/dcfd06b2ec1544e1e19994d60e9594ac.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Die Artikelreihe \u00abWas ist Dodo IS?\u00bb wird erz\u00e4hlen \u00fcber:<\/b><\/p>\n<ol>\n<li>Fr\u00fches Monolith in Dodo IS (2011-2015 Jahre). (In Bearbeitung\u2026)<\/li>\n<li>Der Weg des Backoffice: separate Datenbanken und ein Bus. (Du bist hier)<\/li>\n<li>Der Weg des Client-Teils: Fassade \u00fcber der Datenbank (2016-2017 Jahre). (In Bearbeitung\u2026)<\/li>\n<li>Die Geschichte echter Mikrodienste. (2018-2019 Jahre). (In Bearbeitung\u2026)<\/li>\n<li>Abgeschlossene Zerlegung des Monolithen und Stabilisierung der Architektur. (In Bearbeitung\u2026)<\/li>\n<\/ol>\n<p>\n<b>Wenn du etwas anderes wissen m\u00f6chtest, schreib uns in die Kommentare. <\/b><\/p><\/blockquote>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Meinung zur chronologischen Beschreibung vom Autor<\/b><br \/>\n                        Ich halte regelm\u00e4\u00dfig ein Treffen f\u00fcr neue Mitarbeiter zum Thema \u201eArchitektur des Systems\u201c. Bei uns hei\u00dft es \u201eEinf\u00fchrung in die Dodo IS-Architektur\u201c und ist Teil des Onboarding-Prozesses neuer Entwickler. W\u00e4hrend ich in der einen oder anderen Form \u00fcber unsere Architektur und ihre Besonderheiten spreche, entwickelte sich ein gewisser historischer Ansatz zur Beschreibung. <\/p>\n<p>Traditionell betrachten wir das System als eine Ansammlung von Komponenten (technischen oder h\u00f6herstufigen), Gesch\u00e4ftsmodulen, die miteinander interagieren, um ein bestimmtes Ziel zu erreichen. Und wenn ein solcher Blick f\u00fcr das Design gerechtfertigt ist, passt er nicht ganz zu Beschreibung und Verst\u00e4ndnis. Daf\u00fcr gibt es mehrere Gr\u00fcnde:<\/p>\n<ul>\n<li>Die Realit\u00e4t unterscheidet sich von dem, was auf Papier steht. Nicht alles, was geplant wurde, funktioniert auch so. Uns interessiert, wie es tats\u00e4chlich aussieht und funktioniert. <\/li>\n<li>Fortlaufende Darstellung von Informationen. Im Grunde kann man chronologisch vom Anfang bis zum aktuellen Zustand vorgehen. <\/li>\n<li>Von einfach zu komplex. Nicht universell, aber in unserem Fall genau so. Von einfacheren Ans\u00e4tzen entwickelte sich die Architektur zu komplexeren. Oft wurden durch Verkomplizierungen Probleme bei der Umsetzungsgeschwindigkeit und Stabilit\u00e4t sowie Dutzende anderer Eigenschaften aus der Liste der nicht funktionalen Anforderungen gel\u00f6st (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=6m4XPje76WU\">hier<\/a><\/noindex> gut erkl\u00e4rt zum Gegensatz von Komplexit\u00e4t zu anderen Anforderungen).<\/li>\n<\/ul>\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 Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/3f447154d2d7e7323806f11aeec88e98.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bis 2020 hatte es sich etwas verkompliziert und war so geworden:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/407b5fead36d6d6d39ab14ea5edcdd5b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWie kam es zu dieser Evolution? Warum sind verschiedene Teile des Systems notwendig? Welche architektonischen Entscheidungen wurden getroffen und warum? Lassen Sie uns in dieser Artikelreihe kl\u00e4ren. <\/p>\n<h2>Die ersten Probleme des Jahres 2016: Warum m\u00fcssen Dienste aus dem Monolithen ausbrechen?<\/h2>\n<p>\nDie ersten Artikel der Reihe handeln von den Diensten, die als erste vom Monolithen getrennt wurden. Um Ihnen den Kontext zu geben, werde ich erl\u00e4utern, welche Probleme wir zu Beginn des Jahres 2016 in unserem System hatten und was wir mit der Trennung der Dienste zu tun hatten.<\/p>\n<p><b>Eine einzige MySql-Datenbank, in die alle Anwendungen, die zu diesem Zeitpunkt in Dodo IS existierten, ihre Eintr\u00e4ge schrieben.<\/b> Die Folgen waren folgende:<\/p>\n<ul>\n<li>Hohe Last (85 % der Anfragen entfielen auf das Lesen). <\/li>\n<li>Die Datenbank wuchs. Dadurch wurde ihre Kosten- und Wartung zu einem Problem.<\/li>\n<li>Einzelner Ausfallpunkt. Wenn eine Anwendung, die in die Datenbank schreibt, pl\u00f6tzlich aktiver wurde, sp\u00fcrten die anderen Anwendungen dies.<\/li>\n<li>Ineffizienz bei Speicherung und Abfragen. Oft wurden Daten in einer Struktur gespeichert, die f\u00fcr bestimmte Szenarien praktisch war, aber f\u00fcr andere nicht geeignet war. Indizes beschleunigten einige Operationen, konnten jedoch andere verlangsamen.<\/li>\n<li>Ein Teil der Probleme wurde durch hastig eingerichtete Caches und Read-Replikate auf den Datenbanken gel\u00f6st (dar\u00fcber wird es einen separaten Artikel geben), aber sie schenkten uns nur Zeit und l\u00f6sten das grunds\u00e4tzliche Problem nicht.<\/li>\n<\/ul>\n<p>\n<b>Ein Problem war das Vorhandensein des Monolithen.<\/b>Die Folgen waren folgende:<\/p>\n<ul>\n<li>Einheitliche und seltene Releases.<\/li>\n<li>Schwierigkeiten bei der gemeinsamen Entwicklung vieler Menschen.<\/li>\n<li>Unm\u00f6glichkeit, neue Technologien, neue Frameworks und Bibliotheken einzuf\u00fchren. <\/li>\n<\/ul>\n<p>\nProbleme mit der Datenbank und dem Monolithen wurden oft beschrieben, beispielsweise im Kontext von Ausf\u00e4llen zu Beginn des Jahres 2018 (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/455264\/\">Sei wie Munk oder ein paar Worte zur technischen Schuld<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/461081\/\">Der Tag, an dem Dodo IS anhielt. Asynchrones Szenario<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\">Eine Geschichte \u00fcber den Dodo, eine Art von Ph\u00f6nixen. Der gro\u00dfe Fall von Dodo IS<\/a><\/noindex>), daher werde ich nicht weiter darauf eingehen. Ich kann nur sagen, dass wir mehr Flexibilit\u00e4t bei der Entwicklung der Dienste erm\u00f6glichen wollten. Dies galt insbesondere f\u00fcr die am st\u00e4rksten belasteten und entscheidenden Dienste in unserem gesamten System \u2014 Auth und Tracker.<\/p>\n<h2>Der Weg des Backoffice: getrennte Datenbanken und Bus<\/h2>\n<p><\/p>\n<blockquote><p><b>Navigation im Kapitel<\/b><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"#Q0\">Schema des Monolithen aus dem Jahr 2016<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q1\">Wir beginnen, den Monolithen zu entlasten: Trennung von Auth und Tracker<br \/>\n<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q2\">Womit besch\u00e4ftigt sich Auth?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q3\">Woher kommen die Lasten?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q4\">Entlastung von Auth<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q5\">Womit besch\u00e4ftigt sich der Tracker?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q6\">Woher kommen die Lasten?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q4\">Entlastung des Trackers<\/a><\/noindex><\/li>\n<\/ol>\n<\/blockquote>\n<p>\n<noindex><a rel=\"nofollow\" name=\"Q0\"><\/a><\/noindex><\/p>\n<h4>Schema des Monolithen aus dem Jahr 2016<\/h4>\n<p>\nVor Ihnen liegen die Hauptbl\u00f6cke des Dodo IS Monolithen aus dem Jahr 2016, und etwas weiter unten finden Sie die Erl\u00e4uterung ihrer Hauptaufgaben. <br \/>\n<img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/25ae104d94957aebbbab6d54ebb62f5e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Auslieferungsstelle.<\/b> Verwaltung der Kuriere, Ausgabe der Bestellungen an die Kuriere.<br \/>\n<b>Kontaktzentrum<\/b>. Bestellannahme durch einen Operator. <br \/>\n<b>Site<\/b>. Unsere Websites (dodopizza.ru, dodopizza.co.uk, dodopizza.by usw.).<br \/>\n<b>Auth<\/b>. Authentifizierungs- und Autorisierungsservice f\u00fcr das Backoffice.<br \/>\n<b>Tracker<\/b>. Bestelltracker in der K\u00fcche. Dienst zur Statusmarkierung der Fertigstellung w\u00e4hrend der Zubereitung der Bestellung. <br \/>\n<b>Restaurantkasse<\/b>. Bestellannahme im Restaurant, Kassieroberfl\u00e4chen.<br \/>\n<b>Export<\/b>. Erstellung von Berichten f\u00fcr 1C f\u00fcr die Buchhaltung.<br \/>\n<b>Benachrichtigungen und Belege<\/b>. Sprachbefehle in der K\u00fcche (zum Beispiel: \u201eEine neue Pizza ist eingetroffen\u201c) + Druck von Belegen f\u00fcr die Kuriere.<br \/>\n<b>Schichtmanager<\/b>. Oberfl\u00e4chen f\u00fcr die Arbeit des Schichtmanagers: Bestelllisten, Leistungsgrafiken, Mitarbeiteranzeigen f\u00fcr die Schicht. <br \/>\n<b>B\u00fcromanagement<\/b>. Oberfl\u00e4chen f\u00fcr die Arbeit der Franchisenehmer und Manager: Mitarbeiterverwaltung, Berichte \u00fcber die Arbeit der Pizzeria.<br \/>\n<b>Restaurantdisplay<\/b>. Anzeige des Men\u00fcs auf Fernsehern in den Pizzerien.<br \/>\n<b>Admin-Bereich<\/b>. Einstellungen in der jeweiligen Pizzeria: Men\u00fc, Preise, Buchhaltung, Aktionscodes, Aktionen, Banner f\u00fcr die Website usw.<br \/>\n<b>Mitarbeiter-Dashboard<\/b>. Arbeitspl\u00e4ne der Mitarbeiter, Informationen \u00fcber die Mitarbeiter.<br \/>\n<b>Motivationsdisplay der K\u00fcche<\/b>. Ein separater Bildschirm, der in der K\u00fcche h\u00e4ngt und die Arbeitsgeschwindigkeit der Pizzab\u00e4cker anzeigt.<br \/>\n<b>Kommunikation<\/b>. Versand von SMS und E-Mails.<br \/>\n<b>Dateispeicher<\/b>. Eigener Service zum Abrufen und Bereitstellen statischer Dateien.<\/p>\n<p>Die ersten Versuche, Probleme zu l\u00f6sen, haben uns geholfen, waren jedoch nur eine vor\u00fcbergehende L\u00f6sung. Sie haben sich nicht als systematische L\u00f6sungen erwiesen, daher war klar, dass etwas mit den Datenbanken geschehen muss. Beispielsweise eine gemeinsame Datenbank in mehrere spezialisierte Datenbanken aufzuteilen. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q1\"><\/a><\/noindex><\/p>\n<h4>Wir beginnen, den Monolithen zu entlasten: Trennung von Auth und Tracker<\/h4>\n<p>\nDie wichtigsten Dienste, die damals mehr als andere auf die Datenbank zugriffen:<\/p>\n<ol>\n<li>Auth. Authentifizierungs- und Autorisierungsservice f\u00fcr das Backoffice.<\/li>\n<li>Tracker. Bestelltracker in der K\u00fcche. Dienst zur Statusmarkierung der Fertigstellung w\u00e4hrend der Zubereitung der Bestellung. <\/li>\n<\/ol>\n<p>\n<noindex><a rel=\"nofollow\" name=\"Q2\"><\/a><\/noindex><\/p>\n<h4>Womit besch\u00e4ftigt sich Auth?<\/h4>\n<p>\nAuth ist der Service, \u00fcber den sich die Nutzer im Backoffice einloggen (auf der Kundenwebsite gibt es einen separaten, unabh\u00e4ngigen Zugang). Dieser Service wird auch in Anfragen genutzt, um sicherzustellen, dass die entsprechenden Zugriffsrechte vorhanden sind und dass sich diese Rechte seit dem letzten Login nicht ge\u00e4ndert haben. \u00dcber diesen Service erfolgt auch der Zugang von Ger\u00e4ten in den Pizzerien. <\/p>\n<p>Zum Beispiel m\u00f6chten wir auf dem Fernseher im Wohnzimmer ein Display mit den Status bereitgestellter Bestellungen \u00f6ffnen. Dann gehen wir zu auth.dodopizza.ru, w\u00e4hlen \"Einloggen als Ger\u00e4t\", ein Code erscheint, den man auf einer speziellen Seite auf dem Computer des Schichtmanagers eingeben kann, wobei der Ger\u00e4tetyp (Device) angeben werden muss. Der Fernseher wechselt automatisch zur richtigen Benutzeroberfl\u00e4che seiner Pizzeria und beginnt, die Namen der Kunden anzuzeigen, deren Bestellungen bereit sind. <\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/7a246bcbdbf0dcd6af3e21eb1645e9ac.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q3\"><\/a><\/noindex><\/p>\n<h4>Woher kommen die Lasten? <\/h4>\n<p>\nJeder eingeloggte Benutzer im Backoffice greift bei jeder Anfrage auf die Benutzerdatenbank zu, zieht \u00fcber eine SQL-Abfrage den Benutzer heraus und \u00fcberpr\u00fcft, ob er die erforderlichen Zugriffsrechte f\u00fcr diese Seite hat. <\/p>\n<p>Jedes Ger\u00e4t macht dasselbe, aber mit der Ger\u00e4tetabelle, indem es seine Rolle und Zugriffsrechte \u00fcberpr\u00fcft. Eine gro\u00dfe Anzahl von Anfragen an die Masterdatenbank f\u00fchrt zu ihrer Belastung und zu einer Ressourcennutzung der gemeinsamen Datenbank f\u00fcr diese Vorg\u00e4nge.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q4\"><\/a><\/noindex><\/p>\n<h4>Entlastung von Auth<\/h4>\n<p>\nAuth hat eine isolierte Domain, das hei\u00dft, Daten \u00fcber Benutzer, Logins oder Ger\u00e4te gelangen in den (noch zuk\u00fcnftigen) Dienst und verbleiben dort. Wenn jemand sie ben\u00f6tigt, wird er sich an diesen Dienst wenden, um die Daten zu erhalten.<\/p>\n<p><b>WAR.<\/b> Der urspr\u00fcngliche Arbeitsablauf war folgender:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/60ca37fb873cb4fff4a30691e9f1ea56.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIch m\u00f6chte ein wenig erkl\u00e4ren, wie das funktioniert hat:<\/p>\n<ol>\n<li>Eine Anfrage von au\u00dfen kommt an das Backend (dort Asp.Net MVC) und bringt ein Cookie mit, das f\u00fcr den Zugriff auf die Sitzungsdaten aus Redis(1) verwendet wird. Entweder enth\u00e4lt es Informationen \u00fcber Berechtigungen, dann ist der Zugriff zum Controller offen (3,4), oder nicht. <\/li>\n<li>Wenn kein Zugriff besteht, muss man das Autorisierungsverfahren durchlaufen. Hier wurde es zur Vereinfachung als Teil des Weges im gleichen Attribut dargestellt, obwohl es sich um einen \u00dcbergang zur Login-Seite handelt. Im positiven Fall erhalten wir eine richtig ausgef\u00fcllte Sitzung und gelangen in den Backoffice-Controller. <\/li>\n<li>Wenn Daten vorhanden sind, m\u00fcssen diese auf Aktualit\u00e4t in der Benutzerdatenbank \u00fcberpr\u00fcft werden. Hat sich seine Rolle ge\u00e4ndert, darf er nun nicht auf die Seite zugelassen werden? In diesem Fall muss nach dem Erhalt der Sitzung (1) direkt in die Datenbank gegangen und die Zugriffsrechte des Benutzers \u00fcber die Authentifizierungsschicht (2) \u00fcberpr\u00fcft werden. Danach entweder zur Login-Seite oder direkt in den Controller. So ein einfaches System, aber nicht wirklich Standard.<\/li>\n<li>Wenn alle Verfahren durchlaufen sind, lassen wir weiter in der Logik der Controller und Methoden durch. <\/li>\n<\/ol>\n<p>\nBenutzerdaten sind von allen anderen Daten getrennt und werden in einer separaten Tabelle gespeichert. Funktionen aus der Logikschicht AuthService k\u00f6nnen durchaus zu API-Methoden werden. Die Grenzen des Fachgebiets sind klar definiert: Benutzer, deren Rollen, Zugangsdaten, die Vergabe und Entziehung von Zugriffsrechten. Alles deutet darauf hin, dass es als separater Dienst ausgegliedert werden kann.<\/p>\n<p><b>WURDE.<\/b> Das haben wir auch gemacht:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/3e8629b75ae68b95afa475286d4c5d2c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDieser Ansatz hat eine Reihe von Problemen. Zum Beispiel ist der Aufruf einer Methode im Prozess nicht dasselbe wie der HTTP-Aufruf eines externen Dienstes. Latenz, Zuverl\u00e4ssigkeit, Wartbarkeit und Transparenz der Operationen sind v\u00f6llig anders. \u00dcber genau solche Probleme sprach Andrei Morevsky in seinem Vortrag <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\">\u201e50 Schattierungen von Mikrodiensten\u201c<\/a><\/noindex>.<\/p>\n<p>Der Authentifizierungsdienst und der Dienst f\u00fcr Ger\u00e4te werden f\u00fcr das Backoffice verwendet, also f\u00fcr die Dienste und Schnittstellen, die in der Produktion verwendet werden. Die Authentifizierung f\u00fcr Kundendienste (wie die Website oder die mobile App) erfolgt separat ohne Verwendung von Auth. Die Trennung dauerte etwa ein Jahr, und jetzt besch\u00e4ftigen wir uns erneut mit diesem Thema, indem wir das System auf neue Authentifizierungsdienste (mit standardisierten Protokollen) umstellen. <\/p>\n<p>                        <b class=\"spoiler_title\">Warum hat die Trennung so lange gedauert?<\/b><br \/>\n                        Auf dem Weg gab es viele Probleme, die den Prozess verlangsamt haben:<\/p>\n<ol>\n<li>Wir wollten die Daten \u00fcber Benutzer, Ger\u00e4te und Authentifizierung aus nationalen Datenbanken in eine einzige \u00fcberf\u00fchren. Daf\u00fcr mussten alle Tabellen umgestellt werden, wobei die Verwendung von int-Identifikatoren auf globale UUID-Identifikatoren umgestellt wurde (dieser Code wurde k\u00fcrzlich \u00fcberarbeitet <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=OGK4Lkd6p6s\">Roman Bukin \u201eUuid \u2014 eine gro\u00dfe Geschichte \u00fcber eine kleine Struktur\u201c<\/a><\/noindex> und ein Open-Source-Projekt <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dodopizza\/primitives\">Primitives<\/a><\/noindex>). Die Speicherung von Benutzerdaten (da es sich um pers\u00f6nliche Informationen handelt) hat ihre Einschr\u00e4nkungen, und f\u00fcr einige L\u00e4nder m\u00fcssen sie separat gespeichert werden. Aber eine globale Benutzer-ID muss vorhanden sein.<\/li>\n<li>Viele Tabellen in der Datenbank enthalten Audit-Informationen \u00fcber den Benutzer, der die Operation durchgef\u00fchrt hat. Das erforderte einen zus\u00e4tzlichen Mechanismus, um die Konsistenz zu gew\u00e4hrleisten.<\/li>\n<li>Nach der Erstellung der API-Services begann eine lange und schrittweise Phase der Umstellung auf ein anderes System. Die Umstellungen mussten nahtlos f\u00fcr die Benutzer erfolgen und erforderten manuelle Arbeiten.<\/li>\n<\/ol>\n<p>Das Schema zur Registrierung eines Ger\u00e4ts in der Pizzeria:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/1e054d01de40d63c2994a4d49e47b215.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie Gesamte Architektur nach der Ausgliederung des Auth- und Ger\u00e4teservices:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/069d176197674ef8414981ac98f30704.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><b>Hinweis<\/b>. Bis zum Jahr 2020 arbeiten wir an einer neuen Version von Auth, die auf dem Autorisierungsstandard OAuth 2.0 basiert. Dieser Standard ist ziemlich komplex, wird jedoch f\u00fcr die Entwicklung eines durchg\u00e4ngigen Authentifizierungsdienstes n\u00fctzlich sein. Im Artikel \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/520046\/\">Die Feinheiten der Autorisierung: Ein \u00dcberblick \u00fcber die Technologie OAuth 2.0<\/a><\/noindex>\u201c hat Alexey Chernyaev versucht, den Standard so einfach und verst\u00e4ndlich wie m\u00f6glich zu erkl\u00e4ren, damit Sie Zeit beim Lernen sparen.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q5\"><\/a><\/noindex><\/p>\n<h4>Womit besch\u00e4ftigt sich der Tracker? <\/h4>\n<p>\nJetzt zum zweiten der stark belasteten Dienste. Der Tracker hat eine doppelte Rolle:<\/p>\n<ul>\n<li>Auf der einen Seite besteht seine Aufgabe darin, den Mitarbeitern in der K\u00fcche zu zeigen, welche Bestellungen gerade bearbeitet werden und welche Produkte zubereitet werden m\u00fcssen. <\/li>\n<li>Auf der anderen Seite dient er der Digitalisierung aller Prozesse in der K\u00fcche. <\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/5d13756308ee0cdb6e4000489b6b402d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWenn in einer Bestellung ein neues Produkt (zum Beispiel eine Pizza) erscheint, gelangt es zur Tracker-Station \u201eTeig ausrollen\u201c. An dieser Station steht ein Pizzab\u00e4cker, der einen Teigling der richtigen Gr\u00f6\u00dfe nimmt und ihn ausrollt, anschlie\u00dfend auf dem Tracker-Tablet markiert, dass er seine Aufgabe erledigt hat, und den ausgerollten Pizzaboden zur n\u00e4chsten Station \u201eF\u00fcllen\u201c \u00fcbergibt. <\/p>\n<p>Dort f\u00fcllt der n\u00e4chste Pizzab\u00e4cker die Pizza, markiert dann auf dem Tablet, dass er seine Aufgabe erf\u00fcllt hat, und gibt die Pizza in den Ofen (dies ist auch eine separate Station, die auf dem Tablet markiert werden muss). Ein solches System gibt es seit den Anf\u00e4ngen von Dodo und der ersten Existenz von Dodo IS. Es erm\u00f6glicht eine vollst\u00e4ndige Verfolgung und Digitalisierung aller Vorg\u00e4nge. Dar\u00fcber hinaus gibt der Tracker Hinweise, wie man das jeweilige Produkt zubereitet, f\u00fchrt jedes Produkt durch seine eigenen Herstellungspl\u00e4ne, speichert die optimale Zubereitungszeit des Produkts und verfolgt alle Vorg\u00e4nge mit dem Produkt. <\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/d745bf6f981c1a5b43e6091b090644ad.png\" style=\"display:block;margin: 0 auto;\" \/><i>So sieht der Bildschirm des Tablets an der Tracker-Station \u201eTeig ausrollen\u201c aus.<\/i><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q6\"><\/a><\/noindex><\/p>\n<h4>Woher kommen die Lasten? <\/h4>\n<p>\nIn jeder Pizzeria gibt es etwa f\u00fcnf Tablets mit einem Tracker. Im Jahr 2016 hatten wir \u00fcber 100 Pizzerien (und jetzt sind es mehr als 600). Jedes der Tablets sendet alle 10 Sekunden eine Anfrage an das Backend und sammelt Daten aus der Bestelltabelle (verkn\u00fcpft mit dem Kunden und der Adresse), der Bestellzusammensetzung (verkn\u00fcpft mit dem Produkt und der Menge), der Motivationsdatenbank (in der die Klickzeiten erfasst werden). Wenn ein Pizzab\u00e4cker auf das Produkt im Tracker klickt, erfolgt eine Aktualisierung der Eintr\u00e4ge in all diesen Tabellen. Die Bestelltabelle ist allgemein, in sie werden gleichzeitig Einf\u00fcgungen bei der Annahme einer Bestellung, Aktualisierungen von anderen Teilen des Systems und zahlreiche Abfragen, zum Beispiel auf dem Fernseher, der in der Pizzeria h\u00e4ngt und den Kunden die fertigen Bestellungen anzeigt, eingetragen. <\/p>\n<p>W\u00e4hrend des Kampfes gegen die Lasten, als alles und jeder zwischengespeichert und auf eine asynchrone Replik der Datenbank umgestellt wurde, hielten diese Operationen mit dem Tracker weiterhin an die Master-Datenbank. Hier sollte es keine Verz\u00f6gerung geben, die Daten m\u00fcssen aktuell sein, eine Desynchronisation ist inakzeptabel.<\/p>\n<p>Das Fehlen eigener Tabellen und Indizes erlaubte es au\u00dferdem nicht, spezifischere Anfragen zu formulieren, die auf die eigene Nutzung zugeschnitten sind. Zum Beispiel k\u00f6nnte es f\u00fcr den Tracker effizient sein, einen Index auf die Pizzeria in der Bestelltabelle zu haben. Wir rufen immer die Bestellungen nach Pizzeria aus der Tracker-Datenbank ab. In diesem Fall spielt es f\u00fcr die Annahme der Bestellung keine so gro\u00dfe Rolle, in welche Pizzeria sie gelangt, wichtiger ist, welcher Kunde diese Bestellung aufgegeben hat. Das bedeutet, dass dort ein Index auf den Kunden ben\u00f6tigt wird. Au\u00dferdem muss der Tracker in der Bestelltabelle nicht unbedingt die ID des gedruckten Belegs oder die mit der Bestellung verbundenen Bonusaktionen speichern. Diese Informationen interessieren unseren Tracker-Service nicht. In der gemeinsamen monolithischen Datenbank konnten die Tabellen nur einen Kompromiss zwischen allen Nutzern darstellen. Das war eines der anf\u00e4nglichen Probleme.<\/p>\n<p><b>WAR. <\/b>Urspr\u00fcnglich war die Architektur so:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/085ebab3131ae5edc772d1e6f8c6de76.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelbst nach der Auslagerung in separate Prozesse blieb der gr\u00f6\u00dfte Teil des Codebestands f\u00fcr verschiedene Services gemeinsam. Alles, was unterhalb der Controller liegt, war einheitlich und lebte in einem Repository. Es wurden gemeinsame Methoden von Services, Repositories sowie eine gemeinsame Datenbank verwendet, in der sich gemeinsame Tabellen befanden.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q7\"><\/a><\/noindex><\/p>\n<h4>Entlastung des Trackers<br \/>\n<\/h4>\n<p>\nDas Hauptproblem mit dem Tracker besteht darin, dass die Daten zwischen verschiedenen Datenbanken synchronisiert werden m\u00fcssen. Das ist auch das Hauptunterscheidungsmerkmal im Vergleich zur Trennung des Auth-Dienstes; die Bestellung und deren Status k\u00f6nnen sich \u00e4ndern und m\u00fcssen in verschiedenen Diensten angezeigt werden. <\/p>\n<p>Wir nehmen die Bestellung an der Restaurantkasse entgegen (das ist der Dienst), sie wird in der Datenbank mit dem Status \"Angenommen\" gespeichert. Danach muss sie zum Tracker gelangen, wo ihr Status noch mehrere Male ge\u00e4ndert wird: von \"K\u00fcche\" bis \"Verpackt\". Dabei k\u00f6nnen mit der Bestellung externe Einfl\u00fcsse von der Kasse oder der Benutzeroberfl\u00e4che des Schichtmanagers auftreten. Ich werde in der Tabelle die Bestellstatus mit ihren Beschreibungen anf\u00fchren:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/b6a5a586a3f65715acccea2114725c8e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDas Schema zur \u00c4nderung der Bestellstatus sieht folgenderma\u00dfen aus:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/92e58a2d60706b0e32aedbef7fa42f93.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie Status wechseln zwischen verschiedenen Systemen. Und hier ist der Tracker nicht das endg\u00fcltige System, in dem die Daten zusammenlaufen. Wir haben einige m\u00f6gliche Ans\u00e4tze f\u00fcr die Trennung in einem solchen Fall gesehen:<\/p>\n<ol>\n<li><b>Alle Aktionen der Bestellung in einem einzigen Dienst konzentrieren.<\/b> In unserem Fall erfordert diese Option einen zu gro\u00dfen Dienst zur Bearbeitung der Bestellung. H\u00e4tten wir uns daf\u00fcr entschieden, w\u00e4re es ein zweites Monolith geworden. Die Probleme w\u00e4ren nicht gel\u00f6st worden.<\/li>\n<li><b>Ein System ruft ein anderes auf.<\/b> Die zweite Option ist bereits interessanter. Aber dabei sind Kettenaufrufe m\u00f6glich (<noindex><a rel=\"nofollow\" href=\"https:\/\/landing.google.com\/sre\/sre-book\/chapters\/addressing-cascading-failures\/\">kaskadierende Fehler<\/a><\/noindex>), die Komponenten sind st\u00e4rker miteinander verbunden, das Management hiervon ist schwieriger. <\/li>\n<li><b>Wir organisieren Ereignisse, und jeder Dienst tauscht sich \u00fcber diese Ereignisse aus.<\/b> Letztendlich wurde genau die dritte Option gew\u00e4hlt, nach der alle Dienste beginnen, Ereignisse miteinander auszutauschen. <\/li>\n<\/ol>\n<p>\nDie Wahl der dritten Option bedeutet, dass der Tracker eine eigene Datenbank haben wird und bei jeder \u00c4nderung der Bestellung ein Ereignis dar\u00fcber sendet, auf das sich andere Dienste abonnieren und das auch in die Master-Datenbank gelangt. Zu diesem Zweck ben\u00f6tigten wir einen Dienst, der die Nachrichtenzustellung zwischen den Diensten erm\u00f6glicht. <\/p>\n<p>Zu diesem Zeitpunkt hatten wir bereits RabbitMQ in unserem Stack, daher die endg\u00fcltige Entscheidung, es als Nachrichtenbroker zu verwenden. Das Diagramm zeigt den \u00dcbergang der Bestellung von der Restaurantkasse \u00fcber den Tracker, wo sie ihre Status \u00e4ndert und ihre Anzeige in der Benutzeroberfl\u00e4che der Bestellungen des Managers. <b>GEWORDEN<\/b>: <\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/eed09f7b11202556d6641036aa8ffb1f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>                        <b class=\"spoiler_title\">Der Weg der Bestellung in Schritten<\/b><br \/>\n                        Der Weg der Bestellung beginnt bei einem der Quellendienste f\u00fcr die Bestellung. Hier ist es die Restaurantkasse: <\/p>\n<ol>\n<li>An der Kasse ist die Bestellung vollst\u00e4ndig bereit, und es ist Zeit, sie an den Tracker zu senden. Ein Ereignis wird ausgel\u00f6st, auf das der Tracker abonniert ist. <\/li>\n<li>Der Tracker speichert die Bestellung in seiner eigenen Datenbank, w\u00e4hrend er das Ereignis \u201eBestellungVomTrackerAkzeptiert\u201c generiert und an RMQ sendet. <\/li>\n<li>In der Ereignisbus sind bereits mehrere Handler f\u00fcr die Bestellung abonniert. F\u00fcr uns ist der Handler wichtig, der die Synchronisation mit der monolithischen Datenbank vornimmt. <\/li>\n<li>Der Handler empf\u00e4ngt das Ereignis, extrahiert die f\u00fcr ihn relevanten Daten: In unserem Fall ist dies der Bestellstatus \u201eVomTrackerAkzeptiert\u201c und aktualisiert sein Bestellobjekt in der Hauptdatenbank. <\/li>\n<\/ol>\n<p>Wenn jemand eine Bestellung genau aus der monolithischen Tabelle orders ben\u00f6tigt, kann man sie auch dort abrufen. Zum Beispiel wird das f\u00fcr die Benutzeroberfl\u00e4che Bestellungen im Schichtmanager ben\u00f6tigt:<\/p>\n<p><img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/97c16e7fecd6709aad7e10f9dff6c037.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlle anderen Dienste k\u00f6nnen sich ebenfalls auf die Bestellereignisse des Trackers abonnieren, um diese f\u00fcr sich zu nutzen.<\/p>\n<p>Wenn die Bestellung nach einiger Zeit in Bearbeitung genommen wird, \u00e4ndert sich ihr Status zun\u00e4chst in ihrer eigenen Datenbank (Tracker-Datenbank) und sofort wird das Ereignis \u201eBestellungInArbeit\u201c generiert. Auch dieses gelangt in RMQ, von wo aus es mit der monolithischen Datenbank synchronisiert und an andere Dienste geliefert wird. Auf diesem Weg k\u00f6nnen verschiedene Probleme auftauchen, die genauer im Bericht von Jewgeni Peshkov betrachtet werden k\u00f6nnen. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=DWfJWCWV_eQ\">\u00fcber die Details der Implementierung der Eventually Consistency im Tracker<\/a><\/noindex>. <\/p>\n<h4>Die endg\u00fcltige Architektur nach \u00c4nderungen im Auth und Tracker<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Geschichte der Dodo IS-Architektur: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/7cc517f78c8a381bd570cd26be25ace0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><b>Zusammenfassend:<\/b> Zun\u00e4chst hatte ich die Idee, die neunj\u00e4hrige Geschichte des Dodo IS-Systems in einem Artikel zusammenzufassen. Ich wollte schnell und einfach \u00fcber die Entwicklungsphasen berichten. Doch als ich mich an das Material setzte, wurde mir klar, dass alles viel komplexer und interessanter ist, als es scheint. <\/p>\n<p>W\u00e4hrend ich \u00fcber den Nutzen (oder dessen Fehlen) eines solchen Materials nachdachte, kam ich zu dem Schluss, dass kontinuierliche Entwicklung ohne vollst\u00e4ndige Chroniken der Ereignisse, umfassende Retrospektiven und Analysen eigener fr\u00fcherer Entscheidungen unm\u00f6glich ist.<\/p>\n<p>Ich hoffe, es war f\u00fcr Sie interessant und n\u00fctzlich, mehr \u00fcber unseren Weg zu erfahren. Jetzt stehe ich vor der Wahl, welchen Teil des Dodo IS-Systems ich im n\u00e4chsten Artikel beschreiben soll: Schreiben Sie in die Kommentare oder stimmen Sie ab.<\/p>\n<p class=\"for_users_only_msg\">Nur registrierte Benutzer k\u00f6nnen an der Umfrage teilnehmen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Bitte einloggen<\/a><\/noindex>.<\/p>\n<h2 class=\"default-block__polling-title\">\u00dcber welchen Teil von Dodo IS m\u00f6chten Sie im n\u00e4chsten Artikel mehr erfahren?<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">24,1%<\/strong>Fr\u00fcherer Monolith in Dodo IS (2011-2015 Jahre)14<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">24,1%<\/strong>Die ersten Probleme und deren L\u00f6sungen (2015-2016 Jahre)14<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">20,7%<\/strong>Der Weg des Client-Teils: Fassade \u00fcber der Datenbank (2016-2017 Jahre)12<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">36,2%<\/strong>Die Geschichte echter Mikrodienste (2018-2019 Jahre)21<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent  poll-result__data-percent_winner\">44,8%<\/strong>Vollst\u00e4ndiger Schnitt des Monolithen und Stabilisierung der Architektur26<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">29,3%<\/strong>\u00dcber die weiteren Pl\u00e4ne zur Entwicklung des Systems17<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">19,0%<\/strong>Ich m\u00f6chte nichts \u00fcber Dodo IS11 wissen<\/p>\n<\/li>\n<\/ul>\n<p>    58 Benutzer haben abgestimmt. 6 Benutzer haben sich enthalten.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0425\u0430\u0431\u0440 \u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0438\u0440. \u0411\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430 \u043c\u044b \u0432\u0435\u0434\u0451\u043c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u0433. \u0413\u0434\u0435-\u0442\u043e \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0444\u0438\u0434\u0431\u044d\u043a \u043e\u0442 \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d: \u00ab\u0414\u043e\u0434\u043e, \u0432\u043e\u0442 \u0432\u044b \u0432\u0435\u0437\u0434\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0410 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430? \u0418 \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0441\u0435\u0442\u0438 \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0439?\u00bb. \u041c\u044b \u043f\u043e\u0441\u0438\u0434\u0435\u043b\u0438, \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438 \u0438 \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u0430\u0432\u044b. \u041c\u044b \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445, \u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95787,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95786","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=\"\u0425\u0430\u0431\u0440 \u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0438\u0440. \u0411\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430 \u043c\u044b \u0432\u0435\u0434\u0451\u043c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u0433. \u0413\u0434\u0435-\u0442\u043e \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0444\u0438\u0434\u0431\u044d\u043a \u043e\u0442 \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d: \u00ab\u0414\u043e\u0434\u043e, \u0432\u043e\u0442 \u0432\u044b \u0432\u0435\u0437\u0434\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430.\" \/>\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-put-bekofisa\" \/>\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: \u043f\u0443\u0442\u044c \u0431\u044d\u043a\u043e\u0444\u0438\u0441\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0425\u0430\u0431\u0440 \u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0438\u0440. \u0411\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430 \u043c\u044b \u0432\u0435\u0434\u0451\u043c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u0433. \u0413\u0434\u0435-\u0442\u043e \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0444\u0438\u0434\u0431\u044d\u043a \u043e\u0442 \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d: \u00ab\u0414\u043e\u0434\u043e, \u0432\u043e\u0442 \u0432\u044b \u0432\u0435\u0437\u0434\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-put-bekofisa\" \/>\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:12+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-03T11:42:12+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 Geschichte der Architektur von Dodo IS: Der Weg des Backoffice | ProHoster","description":"Habr ver\u00e4ndert die Welt. Seit mehr als einem Jahr f\u00fchren wir unseren Blog. Vor etwa einem halben Jahr erhielten wir ein durchaus logisches Feedback von den Habr-Benutzern: \u201eDodo, ihr sagt \u00fcberall, dass ihr euer eigenes System habt.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-put-bekofisa","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: \u043f\u0443\u0442\u044c \u0431\u044d\u043a\u043e\u0444\u0438\u0441\u0430 | ProHoster","og:description":"\u0425\u0430\u0431\u0440 \u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0438\u0440. \u0411\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430 \u043c\u044b \u0432\u0435\u0434\u0451\u043c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u0433. \u0413\u0434\u0435-\u0442\u043e \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0444\u0438\u0434\u0431\u044d\u043a \u043e\u0442 \u0445\u0430\u0431\u0440\u043e\u0432\u0447\u0430\u043d: \u00ab\u0414\u043e\u0434\u043e, \u0432\u043e\u0442 \u0432\u044b \u0432\u0435\u0437\u0434\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0441\u0432\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-put-bekofisa","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:12+00:00","article:modified_time":"2020-10-03T11:42:12+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95786","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:48","updated":"2022-09-27 15:42:36","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\/95786","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=95786"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/95786\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/95787"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=95786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=95786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=95786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}