{"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":"Die Geschichte der Architektur Dodo IS: der Weg des Backoffice","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Habr ver\u00e4ndert die Welt. Seit mehr als einem Jahr f\u00fchren wir unseren Blog. Vor etwa einem halben Jahr erhielten wir ein recht naheliegendes 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 ein Pizzanetzer notwendig?\u201c <\/p>\n<p>Wir haben dar\u00fcber nachgedacht und festgestellt, dass ihr recht habt. Wir versuchen alles einfach zu erkl\u00e4ren, aber es kommt oft in Teilen und es gibt kein vollst\u00e4ndiges Systembeschreibung. So begann der lange Weg der Informationssammlung, der Suche nach Autoren und dem Schreiben einer Artikelserie \u00fcber Dodo IS. Lass uns loslegen!<\/p>\n<blockquote><p><i>Dankesch\u00f6n: Danke, dass ihr euer Feedback mit uns teilt. Dank euch haben wir endlich das System beschrieben, einen Technologieradar erstellt und werden bald eine umfassende Beschreibung unserer Prozesse ver\u00f6ffentlichen. Sonst w\u00fcrden wir wahrscheinlich noch weitere 5 Jahre ohne euch sitzen. <\/i><\/p><\/blockquote>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: 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 Artikelserie \u201eWas ist Dodo IS?\u201c wird erz\u00e4hlen \u00fcber:<\/b><\/p>\n<ol>\n<li>\u0420\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u0432 Dodo IS (2011-2015 \u0433\u043e\u0434\u044b). (In progress&#8230;)<\/li>\n<li>Der Weg des Backends: separate Datenbanken und Bus. (Sie sind hier)<\/li>\n<li>\u041f\u0443\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438: \u0444\u0430\u0441\u0430\u0434 \u043d\u0430\u0434 \u0431\u0430\u0437\u043e\u0439 (2016-2017 \u0433\u043e\u0434\u044b). (In progress&#8230;)<\/li>\n<li>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. (2018-2019 \u0433\u043e\u0434\u044b). (In progress&#8230;)<\/li>\n<li>\u0417\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0441\u043f\u0438\u043b \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0430 \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. (In progress&#8230;)<\/li>\n<\/ol>\n<p>\n<b>Wenn ihr noch etwas wissen m\u00f6chtet \u2013 schreibt in die Kommentare. <\/b><\/p><\/blockquote>\n<p><\/p>\n<p>                        <b class=\"spoiler_title\">Meinung zum chronologischen Bericht des Autors<\/b><br \/>\n                        Ich halte regelm\u00e4\u00dfig ein Treffen f\u00fcr neue Mitarbeiter zum Thema \u201eSystemarchitektur\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 unterschiedlicher Weise \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\u00f6herwertigen) und Gesch\u00e4ftsmodulen, die miteinander interagieren, um ein Ziel zu erreichen. W\u00e4hrend dieser Blickwinkel f\u00fcr die Planung gerechtfertigt ist, eignet er sich weniger gut f\u00fcr die Beschreibung und das Verst\u00e4ndnis. Es gibt mehrere Gr\u00fcnde daf\u00fcr:<\/p>\n<ul>\n<li>Die Realit\u00e4t unterscheidet sich von dem, was auf Papier steht. Nicht alles, was geplant ist, klappt auch. Uns interessiert, wie alles tats\u00e4chlich aussieht und funktioniert. <\/li>\n<li>Eine schrittweise Darlegung der Informationen. Man k\u00f6nnte im Grunde 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 hat sich die Architektur zu komplexeren entwickelt. Oft wurden durch Komplexit\u00e4t Probleme in Bezug auf Geschwindigkeit und Stabilit\u00e4t gel\u00f6st, sowie Dutzende anderer Eigenschaften aus der Liste der nicht-funktionalen Anforderungen.<noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=6m4XPje76WU\">hier.<\/a><\/noindex> gut erkl\u00e4rt im Hinblick auf die Abw\u00e4gung der Komplexit\u00e4t gegen\u00fcber 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=\"Die Geschichte der Architektur Dodo IS: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/3f447154d2d7e7323806f11aeec88e98.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bis 2020 hat sie sich etwas ver\u00e4ndert und sieht jetzt so aus:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: 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 dies in dieser Artikelreihe kl\u00e4ren. <\/p>\n<h2>Die ersten Probleme des Jahres 2016: Warum m\u00fcssen Dienste aus dem Monolithen herausl\u00f6sen?<\/h2>\n<p>\nDie ersten Artikel dieser Reihe werden sich mit den Diensten besch\u00e4ftigen, die sich zuerst vom Monolithen abgel\u00f6st haben. Um Sie in den Kontext einzuf\u00fchren, m\u00f6chte ich erl\u00e4utern, welche Probleme wir zu Beginn des Jahres 2016 in unserem System hatten und warum wir uns mit der Trennung der Dienste besch\u00e4ftigen mussten.<\/p>\n<p><b>Eine zentrale MySql-Datenbank, in die alle zum damaligen Zeitpunkt existierenden Anwendungen ihre Daten schrieben.<\/b> Die Konsequenzen waren folgende:<\/p>\n<ul>\n<li>Hohe Last (wobei 85 % der Anfragen auf Lesevorg\u00e4nge entfielen). <\/li>\n<li>Die Datenbank wuchs. Dadurch wurde die Kosten- und Supportfrage problematisch.<\/li>\n<li>Einzelner Ausfallpunkt. Wenn eine Anwendung, die in die Datenbank schreibt, pl\u00f6tzlich aktiver wird, sp\u00fcren dies die anderen Anwendungen.<\/li>\n<li>Ineffizienz bei Speicherung und Abfragen. Oft wurden Daten in einer Struktur gespeichert, die f\u00fcr einige Szenarien geeignet war, jedoch f\u00fcr andere nicht. Indizes beschleunigten bestimmte Operationen, konnten jedoch andere verlangsamen.<\/li>\n<li>Einige Probleme wurden durch hastig erstellte Caches und Read-Replikate der Datenbanken gemildert (dar\u00fcber wird in einem separaten Artikel berichtet), doch sie verschafften nur Zeit und l\u00f6sten das grunds\u00e4tzliche Problem nicht.<\/li>\n<\/ul>\n<p>\n<b>Das Problem war das Vorhandensein des Monolithen.<\/b>Die Folgen waren folgende:<\/p>\n<ul>\n<li>Einheitliche und seltene Releases.<\/li>\n<li>Komplexit\u00e4t bei der Zusammenarbeit vieler Personen.<\/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 Anfang 2018 (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/455264\/\">Sei wie Munk, oder ein paar Worte \u00fcber technische Schulden.<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/461081\/\">Der Tag, an dem Dodo IS stoppte. Asynchrones Szenario.<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\">Eine Geschichte \u00fcber den Dodo aus der Familie der Ph\u00f6nixe. Der gro\u00dfe Fall von Dodo IS.<\/a><\/noindex>), daher werde ich nicht lange pausieren. Ich m\u00f6chte nur erw\u00e4hnen, dass wir mehr Flexibilit\u00e4t bei der Entwicklung von Diensten bieten wollten. Dies betraf insbesondere die am st\u00e4rksten beanspruchten und zentralen Systeme \u2014 Auth und Tracker.<\/p>\n<h2>Backoffice-Weg: getrennte Datenbanken und Bus<\/h2>\n<p><\/p>\n<blockquote><p><b>Kapitelnavigation<\/b><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"#Q0\">Monolith-Diagramm aus dem Jahr 2016<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#Q1\">Wir beginnen mit der Entlastung des Monolithen: 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>Monolith-Diagramm aus dem Jahr 2016<\/h4>\n<p>\nVor Ihnen liegen die Hauptkomponenten des Monolithen Dodo IS aus dem Jahr 2016, und etwas weiter unten finden Sie eine Erkl\u00e4rung ihrer Hauptaufgaben. <br \/>\n<img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/25ae104d94957aebbbab6d54ebb62f5e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Lieferkasse.<\/b> Verwaltung der Kuriere, Ausgabe von Bestellungen an Kuriere.<br \/>\n<b>Kontaktzentrum<\/b>. Entgegennahme von Bestellungen \u00fcber den Operator. <br \/>\n<b>Website<\/b>. Unsere Webseiten (dodopizza.ru, dodopizza.co.uk, dodopizza.by usw.).<br \/>\n<b>Auth<\/b>. Authentifizierungs- und Autorisierungsdienst f\u00fcr das Backoffice.<br \/>\n<b>Tracker<\/b>. Bestellverfolgung in der K\u00fcche. Dienst zur Statusmarkierung bei der Zubereitung von Bestellungen. <br \/>\n<b>Restaurantkasse<\/b>. Entgegennahme von Bestellungen im Restaurant, Kassenschnittstellen.<br \/>\n<b>Export<\/b>. Erstellung von Berichten f\u00fcr die Buchhaltung in 1C.<br \/>\n<b>Benachrichtigungen und Lieferscheine<\/b>. Sprachbefehle in der K\u00fcche (zum Beispiel \u201eNeue Pizza eingetroffen\u201c) + Druck von Lieferscheinen f\u00fcr Kuriere.<br \/>\n<b>Schichtmanager<\/b>. Schnittstellen f\u00fcr das Management der Schichtleiter: Auftragsliste, Leistungsstatistiken, Mitarbeiterwechsel anzeigen. <br \/>\n<b>B\u00fcroleiter<\/b>. Schnittstellen f\u00fcr Franchise-Nehmer und Manager: Annahme von Mitarbeitern, Berichte zur Pizzastation.<br \/>\n<b>Restaurantdisplay<\/b>. Anzeige des Men\u00fcs auf Bildschirmen in Pizzerien.<br \/>\n<b>Admin-Bereich<\/b>. Einstellungen in der jeweiligen Pizzeria: Men\u00fc, Preise, Buchhaltung, Rabattcodes, Aktionen, Banner f\u00fcr die Website usw.<br \/>\n<b>Mitarbeiter-Bereich<\/b>. Arbeitspl\u00e4ne der Mitarbeiter, Informationen \u00fcber die Mitarbeiter.<br \/>\n<b>Motivationsanzeige 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-Mail.<br \/>\n<b>FileStorage<\/b>. Eigener Dienst zum Empfangen und Bereitstellen von statischen Dateien.<\/p>\n<p>. Die ersten Versuche zur L\u00f6sung der Probleme halfen uns, waren jedoch nur eine vor\u00fcbergehende Entlastung. Sie wurden nicht zu systematischen L\u00f6sungen, daher wurde klar, dass mit den Datenbanken etwas geschehen musste. Beispielsweise sollte die allgemeine Datenbank in mehrere spezialisierte unterteilt werden. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"Q1\"><\/a><\/noindex><\/p>\n<h4>Wir beginnen mit der Entlastung des Monolithen: Trennung von Auth und Tracker<\/h4>\n<p>\nDie wichtigsten Dienste, die damals mehr als andere Datenbankzugriffe hatten:<\/p>\n<ol>\n<li>Auth. Authentifizierungs- und Autorisierungsdienst f\u00fcr das Backoffice.<\/li>\n<li>Tracker. Bestellsystem in der K\u00fcche. Dienst zur Statusmarkierung der Fertigstellung w\u00e4hrend der Zubereitung von Bestellungen. <\/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 Dienst, \u00fcber den sich Benutzer im Backend anmelden (es gibt einen separaten, unabh\u00e4ngigen Zugang im Frontend). Au\u00dferdem wird er genutzt, um sicherzustellen, dass die richtigen Zugriffsrechte vorhanden sind und dass sich diese seit dem letzten Login nicht ge\u00e4ndert haben. \u00dcber diesen Dienst erfolgt auch der Zugang von Ger\u00e4ten in der Pizzeria. <\/p>\n<p>Zum Beispiel m\u00f6chten wir auf dem Fernseher im Bereich ein Display mit den Status von fertiggestellten Bestellungen \u00f6ffnen. Dazu rufen wir auth.dodopizza.ru auf, w\u00e4hlen \u201eZugang als Ger\u00e4t\u201c aus, es erscheint ein Code, den wir auf einer speziellen Seite am Computer des Schichtleiters eingeben, einschlie\u00dflich des Ger\u00e4tetyps. 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=\"Die Geschichte der Architektur Dodo IS: 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 Backend fragt mit jeder Anfrage die Benutzerdaten aus der Datenbank ab, zieht \u00fcber einen SQL-Befehl den Benutzer heraus und \u00fcberpr\u00fcft, ob er die notwendigen Zugriffsrechte und Berechtigungen f\u00fcr diese Seite hat. <\/p>\n<p>Jedes Ger\u00e4t f\u00fchrt das Gleiche aus, jedoch mit einer Ger\u00e4tetabelle, \u00fcberpr\u00fcft seine Rolle und Zugriffsrechte. Eine Vielzahl von Anfragen an die Hauptdatenbank f\u00fchrt zu ihrer \u00dcberlastung und belastet die Ressourcen 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>\nBei Auth handelt es sich um eine isolierte Domain, das hei\u00dft, dass Daten \u00fcber Benutzer, Logins oder Ger\u00e4te an den Service (zukunftsorientiert) \u00fcbermittelt werden und dort verbleiben. Wenn jemand diese Daten ben\u00f6tigt, wird er diesen Service aufsuchen.<\/p>\n<p><b>WAR.<\/b> Das urspr\u00fcngliche Funktionsschema war folgenderma\u00dfen:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/60ca37fb873cb4fff4a30691e9f1ea56.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIch m\u00f6chte kurz erkl\u00e4ren, wie das funktionierte:<\/p>\n<ol>\n<li>Eine Anfrage von au\u00dfen gelangt an das Backend (hier Asp.Net MVC), bringt ein Session-Cookie mit, das zur Abfrage der Sitzungsdaten aus Redis(1) verwendet wird. Entweder sind die Zugriffsrechte vorhanden, und der Zugang zum Controller ist gew\u00e4hrt (3,4), oder sie fehlen. <\/li>\n<li>Wenn kein Zugang besteht, muss der Authentifizierungsprozess durchlaufen werden. Hier wird zur Vereinfachung dieser Prozess als Teil des Weges im gleichen Attribut dargestellt, obwohl es sich um eine Weiterleitung zur Login-Seite handelt. Im positiven Szenario erhalten wir eine korrekt ausgef\u00fcllte Sitzung und gelangen zum Backoffice-Controller. <\/li>\n<li>Wenn Daten vorhanden sind, m\u00fcssen diese auf Aktualit\u00e4t in der Benutzerdatenbank \u00fcberpr\u00fcft werden. Hat sich die Rolle des Benutzers ge\u00e4ndert, sollte er m\u00f6glicherweise keinen Zugriff mehr auf die Seite haben. In diesem Fall sollte man nach dem Erhalt der Sitzung (1) direkt in die Datenbank gehen und die Zugriffsrechte des Benutzers \u00fcber das Authentifizierungslogikschicht (2) \u00fcberpr\u00fcfen. Danach erfolgt entweder die Weiterleitung zur Anmeldeseite oder der \u00dcbergang zum Controller. Ein einfaches System, aber nicht ganz standardisiert.<\/li>\n<li>Wenn alle Verfahren abgeschlossen sind, setzen wir die Logik in den Controllern und Methoden fort. <\/li>\n<\/ol>\n<p>\nBenutzerdaten sind von allen anderen Daten getrennt und werden in einer separaten Tabelle f\u00fcr Mitgliedschaften gespeichert. Funktionen aus der AuthService-Logik k\u00f6nnen durchaus zu API-Methoden werden. Die Grenzen des Dom\u00e4nenbereichs sind klar definiert: Benutzer, ihre Rollen, Zugriffsrechte, Erteilung und Widerruf von Zugriffsrechten. Es sieht alles so aus, dass es zu einem separaten Dienst ausgegliedert werden k\u00f6nnte.<\/p>\n<p><b>ES IST GESCHEHEN.<\/b> Genau das haben wir getan:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/3e8629b75ae68b95afa475286d4c5d2c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDieser Ansatz birgt eine Reihe von Problemen. Zum Beispiel ist der Methodenaufruf innerhalb eines Prozesses nicht dasselbe wie der Aufruf eines externen Dienstes \u00fcber HTTP. Latenz, Zuverl\u00e4ssigkeit, Wartbarkeit und Transparenz der Operationen sind v\u00f6llig unterschiedlich. Andr\u00e9 Morevsky sprach in seinem Vortrag ausf\u00fchrlich \u00fcber diese Probleme. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\">50 Schattierungen von Mikrodiensten<\/a><\/noindex>.<\/p>\n<p>Der Authentifizierungsdienst und der dazugeh\u00f6rige Ger\u00e4teservice werden f\u00fcr das Backoffice verwendet, das hei\u00dft f\u00fcr die Dienste und Schnittstellen, die in der Produktion genutzt werden. Die Authentifizierung f\u00fcr Kundenservices (wie die Website oder die mobile App) erfolgt separat ohne Auth. Die Trennung dauerte etwa ein Jahr, und jetzt widmen wir uns erneut 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 die Dinge verlangsamt haben:<\/p>\n<ol>\n<li>Wir wollten die Daten \u00fcber Benutzer, Ger\u00e4te und Authentifizierung aus den Datenbanken im Land in eine zentrale Datenbank \u00fcbertragen. Dazu mussten wir alle Tabellen und die Verwendung von int-IDs auf globale UUID-IDs umstellen (diesen Code haben wir k\u00fcrzlich \u00fcberarbeitet). <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=OGK4Lkd6p6s\">Roman Bukin \u201eUuid \u2013 eine gro\u00dfe Geschichte \u00fcber eine kleine Struktur\u201c<\/a><\/noindex> und 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 in einigen L\u00e4ndern m\u00fcssen sie separat aufbewahrt werden. Aber der globale Benutzer-Identifikator sollte vorhanden sein.<\/li>\n<li>Viele Tabellen in der Datenbank haben Audit-Informationen dar\u00fcber, welcher Benutzer die Aktion durchgef\u00fchrt hat. Dies erforderte einen zus\u00e4tzlichen Mechanismus, um Konsistenz zu gew\u00e4hrleisten.<\/li>\n<li>Nach der Erstellung von API-Diensten gab es eine lange und schrittweise Phase des Wechsels zu einem anderen System. Die Umstellungen mussten nahtlos f\u00fcr die Benutzer erfolgen und erforderten manuelle Arbeit.<\/li>\n<\/ol>\n<p>Das Schema zur Registrierung von Ger\u00e4ten in der Pizzeria:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/1e054d01de40d63c2994a4d49e47b215.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie allgemeine Architektur nach der Abtrennung des Auth- und Devices-Services:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/069d176197674ef8414981ac98f30704.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><b>Hinweis<\/b>. Im Jahr 2020 arbeiten wir an einer neuen Version von Auth, die auf dem Autorisierungsstandard OAuth 2.0 basiert. Dieser Standard ist recht komplex, wird jedoch f\u00fcr die Entwicklung eines End-to-End-Authentifizierungsdienstes n\u00fctzlich sein. Im Artikel \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/520046\/\">Details zur Autorisierung: Ein \u00dcberblick \u00fcber die Technologie OAuth 2.0<\/a><\/noindex>\u201c hat Alexey Chernyayev 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 beanspruchten Dienste. Der Tracker erf\u00fcllt eine doppelte Rolle:<\/p>\n<ul>\n<li>Einerseits hat er die Aufgabe, den Mitarbeitern in der K\u00fcche zu zeigen, welche Bestellungen gerade bearbeitet werden und welche Zutaten aktuell zubereitet werden m\u00fcssen. <\/li>\n<li>Andererseits digitalisiert er alle Prozesse in der K\u00fcche. <\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: 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 auftaucht (zum Beispiel eine Pizza), wird es zur Zyklusstation \u201eAusrollen\u201c geleitet. An dieser Station steht der Pizzab\u00e4cker, der den Teig in der ben\u00f6tigten Gr\u00f6\u00dfe ausrollt, anschlie\u00dfend auf dem Tablet des Trackers vermerkt, dass er seine Aufgabe abgeschlossen hat, und \u00fcbergibt den ausgerollten Teig an die n\u00e4chste Station \u2013 \u201eF\u00fcllung\u201c. <\/p>\n<p>Hier bereitet der n\u00e4chste Pizzab\u00e4cker die Pizza zu und vermerkt dann auf dem Tablet, dass er seine Aufgabe erledigt hat, und schiebt die Pizza in den Ofen (dies ist ebenfalls eine separate Station, die im Tablet vermerkt werden muss). Dieses System existiert seit den Anf\u00e4ngen von Dodo und der Gr\u00fcndung von Dodo IS. Es erm\u00f6glicht die vollst\u00e4ndige Nachverfolgung und Digitalisierung aller Abl\u00e4ufe. Dar\u00fcber hinaus gibt der Tracker Hinweise zur Zubereitung der jeweiligen Produkte, leitet jedes Produkt gem\u00e4\u00df seinen Herstellungsschemata und speichert die optimalen Garzeiten sowie alle Vorg\u00e4nge rund um das Produkt. <\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: 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 Station des Trackers 'Ausrollen' 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 stehen etwa f\u00fcnf Tablets mit einem Tracker zur Verf\u00fcgung. Im Jahr 2016 hatten wir mehr als 100 Pizzerien (jetzt sind es \u00fcber 600). Jedes Tablet sendet alle 10 Sekunden eine Anfrage an das Backend und ruft Daten aus der Bestelltabelle ab (Verbindung mit dem Kunden und der Adresse), der Bestellzusammensetzung (Verbindung mit dem Produkt und Angabe der Menge) sowie der Motivationstabelle (hier wird die Zeit der Bet\u00e4tigung erfasst). Wenn der Pizzab\u00e4cker auf das Produkt im Tracker klickt, werden die Eintr\u00e4ge in all diesen Tabellen aktualisiert. Die Bestelltabelle ist gemeinsam, und es erfolgen gleichzeitig Einf\u00fcgungen bei der Annahme der Bestellung, Aktualisierungen von anderen Teilen des Systems sowie zahlreiche Auslesungen, beispielsweise auf dem Fernseher, der in der Pizzeria h\u00e4ngt und den Kunden die fertigen Bestellungen anzeigt. <\/p>\n<p>W\u00e4hrend der Hochlastzeit, als alles und jeder zwischengespeichert und auf eine asynchrone Datenbankreplik umgestellt wurde, gingen diese Operationen mit dem Tracker weiterhin an die Master-Datenbank. Hier darf es keine Verz\u00f6gerungen geben, die Daten m\u00fcssen aktuell sein, eine Desynchronisation ist nicht erlaubt.<\/p>\n<p>Das Fehlen eigener Tabellen und Indizes erlaubte es nicht, spezifischere Abfragen zu erstellen, die auf den eigenen Bedarf zugeschnitten sind. Zum Beispiel k\u00f6nnte es f\u00fcr das Tracking-System sinnvoll sein, einen Index auf die Pizzaservice-Tabelle in der Bestelltabelle zu haben. Wir ziehen immer die Bestellungen vom Pizzaservice aus der Datenbank des Trackers. Dabei ist es f\u00fcr die Annahme der Bestellung nicht so wichtig, in welches Pizzarestaurant sie f\u00e4llt; entscheidend ist, welcher Kunde diese Bestellung aufgegeben hat. Daher wird ein Index f\u00fcr den Kunden ben\u00f6tigt. Au\u00dferdem ist es f\u00fcr den Tracker in der Bestelltabelle nicht notwendig, die ID des gedruckten Belegs oder die mit der Bestellung verbundenen Bonusaktionen zu speichern. Diese Informationen interessieren unseren Tracking-Service nicht. In einer zentralen Monolith-Datenbank k\u00f6nnten die Tabellen lediglich einen Kompromiss unter allen Nutzern darstellen. Das war eines der urspr\u00fcnglichen Probleme.<\/p>\n<p><b>WAR. <\/b>Urspr\u00fcnglich war die Architektur so:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: 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 Codes gemeinschaftlich f\u00fcr verschiedene Dienste. Alles unterhalb der Controller war einheitlich und lebte in einem Repository. Es wurden gemeinsame Methoden f\u00fcr Dienste, Repositories und eine gemeinsame Datenbank verwendet, in der sich die gemeinsamen 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. Dies ist auch der Hauptunterschied zum Auth-Service, da Bestellungen und deren Status sich \u00e4ndern k\u00f6nnen und in verschiedenen Diensten angezeigt werden m\u00fcssen. <\/p>\n<p>Wir nehmen Bestellungen \u00fcber die Kasse des Restaurants (das ist der Service) entgegen, diese werden in der Datenbank als \u201eAkzeptiert\u201c gespeichert. Danach m\u00fcssen sie zum Tracker gelangen, wo sich ihr Status mehrmals \u00e4ndern wird: von \u201eK\u00fcche\u201c bis \u201eVerpackt\u201c. Dabei k\u00f6nnen bei der Bestellung externe Einfl\u00fcsse von der Kasse oder der Benutzeroberfl\u00e4che des Schichtmanagers auftreten. Ich f\u00fchre in einer Tabelle die Bestellstatus mit ihren Beschreibungen auf:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: 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=\"Die Geschichte der Architektur Dodo IS: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/92e58a2d60706b0e32aedbef7fa42f93.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie Statuswechsel erfolgen zwischen verschiedenen Systemen. Hierbei ist der Tracker nicht das endg\u00fcltige System, in dem die Daten abgeschlossen werden. Wir haben mehrere m\u00f6gliche Ans\u00e4tze zur Trennung in einem solchen Fall gesehen:<\/p>\n<ol>\n<li><b>Alle Aktionen einer Bestellung in einem einzigen Service konzentrieren.<\/b> In unserem Fall erfordert diese Option jedoch einen zu gro\u00dfen Service zur Bearbeitung von Bestellungen. Wenn wir uns daf\u00fcr entscheiden w\u00fcrden, h\u00e4tten wir ein zweites Monolith-System geschaffen. So w\u00fcrden wir die Probleme nicht l\u00f6sen.<\/li>\n<li><b>Ein System ruft das andere auf.<\/b> Die zweite Variante ist bereits interessanter. Allerdings k\u00f6nnen dabei Aufrufketten auftreten (<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, was die Verwaltung komplizierter macht. <\/li>\n<li><b>Wir organisieren Ereignisse, bei denen jeder Dienst mit einem anderen \u00fcber diese Ereignisse kommuniziert.<\/b> Letztendlich wurde die dritte Variante gew\u00e4hlt, bei der alle Dienste beginnen, Ereignisse miteinander auszutauschen. <\/li>\n<\/ol>\n<p>\nDie Wahl der dritten Variante bedeutete, dass der Tracker eine eigene Datenbank hat, und bei jeder \u00c4nderung der Bestellung ein Ereignis dar\u00fcber sendet, auf das andere Dienste abonnieren und das auch in der Master-Datenbank landet. Daf\u00fcr ben\u00f6tigten wir einen Dienst, der die Nachrichten\u00fcbermittlung zwischen den Diensten gew\u00e4hrleistet. <\/p>\n<p>Zu diesem Zeitpunkt hatten wir bereits RabbitMQ in unserem Stack, weshalb die endg\u00fcltige Entscheidung fiel, es als Nachrichtenbroker zu verwenden. In der Abbildung ist der \u00dcbergang der Bestellung von der Restaurantkasse \u00fcber den Tracker dargestellt, wo sich ihr Status \u00e4ndert und sie im Manager-Interface angezeigt wird. <b>WURDE<\/b>: <\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: 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 Bestellprozess in Schritten<\/b><br \/>\n                        Der Bestellprozess beginnt bei einem der Quellendienste f\u00fcr Bestellungen. Hier ist es die Restaurantkasse: <\/p>\n<ol>\n<li>An der Kasse ist die Bestellung vollst\u00e4ndig vorbereitet und kann an den Tracker gesendet werden. 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 erstellt und es an RMQ sendet. <\/li>\n<li>Im Event-Bus sind bereits mehrere Handler f\u00fcr die Bestellung abonniert. F\u00fcr uns ist derjenige wichtig, der die Synchronisierung mit der monolithischen Datenbank durchf\u00fchrt. <\/li>\n<li>Der Handler empf\u00e4ngt das Ereignis, w\u00e4hlt relevante Informationen daraus aus: in unserem Fall den Status der Bestellung \u201eVomTrackerAkzeptiert\u201c und aktualisiert seinen Bestellentit\u00e4t in der Hauptdatenbank. <\/li>\n<\/ol>\n<p>Wenn jemand die Bestellung genau aus der monolithischen Tabelle orders ben\u00f6tigt, kann er diese auch dort abfragen. Zum Beispiel ist dies f\u00fcr die Schnittstelle Bestellungen im Schichtmanager notwendig:<\/p>\n<p><img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: 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 sie f\u00fcr sich zu nutzen.<\/p>\n<p>Wenn eine Bestellung nach einer gewissen Zeit in Bearbeitung genommen wird, \u00e4ndert sich ihr Status zun\u00e4chst in der Datenbank (Tracker-Datenbank), und dann wird sofort das Ereignis \u201eBestellungInBearbeitung\u201c generiert. Dieses gelangt ebenfalls in die RMQ, von wo es in die monolithische Datenbank synchronisiert und an andere Dienste geliefert wird. Auf diesem Weg k\u00f6nnen verschiedene Probleme auftreten, die n\u00e4her im Bericht von Jewgeni Peschkow betrachtet werden k\u00f6nnen. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=DWfJWCWV_eQ\">zu den Details der Umsetzung der Eventual Consistency im Tracker<\/a><\/noindex>. <\/p>\n<h4>Die endg\u00fcltige Architektur nach den \u00c4nderungen in Auth und Tracker<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Die Geschichte der Architektur Dodo IS: der Weg des Backoffice\" src=\"\/wp-content\/uploads\/2020\/10\/7cc517f78c8a381bd570cd26be25ace0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><b>Zusammenfassend l\u00e4sst sich sagen:<\/b> Urspr\u00fcnglich hatte ich die Idee, die neunj\u00e4hrige Geschichte des Dodo IS-Systems in einem einzigen Artikel zusammenzufassen. Ich wollte schnell und einfach \u00fcber die Evolution der verschiedenen Etappen berichten. Doch als ich mit dem Material begann, 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) solcher Materialien nachdachte, kam ich zu dem Schluss, dass eine kontinuierliche Weiterentwicklung ohne vollst\u00e4ndige Chroniken von Ereignissen, ausf\u00fchrlichen Retrospektiven und Analysen vergangener Entscheidungen nicht m\u00f6glich ist.<\/p>\n<p>Ich hoffe, es war f\u00fcr Sie interessant und hilfreich, mehr \u00fcber unseren Weg zu erfahren. Momentan stehe ich vor der Entscheidung, welchen Teil des Dodo IS-Systems ich im n\u00e4chsten Artikel beschreiben soll: Schreiben Sie einen Kommentar 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 melden Sie sich an.<\/a><\/noindex>Sind Sie an Contour interessiert?<\/p>\n<h2 class=\"default-block__polling-title\">Welchen Teil von Dodo IS m\u00f6chten Sie im n\u00e4chsten Artikel kennenlernen?<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">24,1%<\/strong>Der fr\u00fche Monolith in Dodo IS (2011-2015)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 ihre L\u00f6sungen (2015-2016)14<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">20,7%<\/strong>Der Weg des Clientbereichs: Die Fassade \u00fcber der Datenbank (2016-2017)12<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">36,2%<\/strong>Die Geschichte der echten Mikrodienste (2018-2019)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>Der vollst\u00e4ndige Zerschlag des Monolithen und die 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 zuk\u00fcnftigen Entwicklungspl\u00e4ne 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 IS wissen11<\/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 4.9.10 - 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. \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\" \/>\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) 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: \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. \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\" \/>\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 \u00fcber einem Jahr f\u00fchren wir unseren Blog. Vor etwa sechs Monaten erhielten wir ein sehr 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 das Netzwerk der Pizzerien wichtig?\u201c Wir haben dar\u00fcber nachgedacht und erkannt, dass Sie recht haben. Wir versuchen, alles einfach zu erkl\u00e4ren, aber","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. \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","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"},"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}]}}