Dezentrales Datenmanagement - Kapselung von Datenbanken in Microservices [geschlossen]


23

Vor kurzem habe ich einen Kurs zum Thema Software-Design besucht. Vor kurzem gab es eine Diskussion / Empfehlung zur Verwendung eines Mikrodienstmodells, bei dem Komponenten eines Dienstes in Mikrodienst-Unterkomponenten unterteilt werden, die so unabhängig wie möglich sind.

Ein Teil, der erwähnt wurde, war, dass anstelle des sehr häufig verwendeten Modells, eine einzige Datenbank zu haben, mit der alle Mikrodienste kommunizieren, für jeden Mikrodienst eine separate Datenbank ausgeführt wird.

Eine ausführlichere Erklärung hierzu finden Sie hier: http://martinfowler.com/articles/microservices.html im Abschnitt Dezentrale Datenverwaltung

der hervorstechendste Teil sagt dies:

Microservices ziehen es vor, dass jeder Service seine eigene Datenbank verwaltet, entweder unterschiedliche Instanzen derselben Datenbanktechnologie oder völlig unterschiedliche Datenbanksysteme - ein Ansatz namens Polyglot Persistence. Sie können die Polyglot-Persistenz in einem Monolithen verwenden, sie tritt jedoch häufiger bei Microservices auf.

Figur 4Bildbeschreibung hier eingeben

Ich mag dieses Konzept und sehe es unter anderem als eine deutliche Verbesserung der Wartung und der Durchführung von Projekten, an denen mehrere Personen arbeiten. Trotzdem bin ich kein erfahrener Softwarearchitekt. Hat jemand jemals versucht, es umzusetzen? Auf welche Vorteile und Hürden sind Sie gestoßen?


6
Ich bin mir nicht sicher, ob diese Frage für Programmierer nicht in Frage kommt. Es ist eine Frage zu einer bestimmten Technik und ihren Vor- und Nachteilen, um festzustellen, wann die Verwendung der Technik sinnvoll ist. Ich habe mir die Tour und die Meta-Site angesehen ( meta.stackexchange.com/questions/68384/… ). Könnten Sie bitte klarstellen, wie ich die Frage verbessern soll?
ThinkBonobo

Antworten:


35

Sprechen wir über die Vor- und Nachteile des Microservice-Ansatzes.

Erste Minuspunkte. Wenn Sie Microservices erstellen, fügen Sie Ihrem Code eine inhärente Komplexität hinzu. Sie fügen Overhead hinzu. Sie erschweren die Replikation der Umgebung (z. B. für Entwickler). Sie erschweren das Debuggen zeitweise auftretender Probleme.

Lassen Sie mich einen echten Nachteil veranschaulichen. Betrachten Sie den hypothetischen Fall, in dem beim Generieren einer Seite 100 Mikrodienste aufgerufen werden, von denen jeder in 99,9% der Fälle das Richtige tut. In 0,05% der Fälle führen sie jedoch zu falschen Ergebnissen. In 0,05% der Fälle gibt es eine langsame Verbindungsanforderung, bei der beispielsweise eine TCP / IP-Zeitüberschreitung für die Verbindung erforderlich ist und die 5 Sekunden dauert. In etwa 90,5% der Fälle funktioniert Ihre Anfrage einwandfrei. Aber in etwa 5% der Fälle haben Sie falsche Ergebnisse und in etwa 5% der Fälle ist Ihre Seite langsam. Und jeder nicht reproduzierbare Fehler hat eine andere Ursache.

Wenn Sie nicht viel über Werkzeuge zum Überwachen, Reproduzieren usw. nachdenken, wird dies zu einem Durcheinander. Besonders wenn ein Mikrodienst einen anderen aufruft, der einen anderen ein paar Schichten tief aufruft. Und sobald Sie Probleme haben, wird es mit der Zeit nur noch schlimmer.

OK, das klingt nach einem Albtraum (und mehr als ein Unternehmen hat sich auf diesem Weg große Probleme bereitet). Erfolg ist nur möglich, wenn Sie sich der potenziellen Nachteile bewusst sind und konsequent daran arbeiten, diesen zu begegnen.

Was ist also mit diesem monolithischen Ansatz?

Es zeigt sich, dass eine monolithische Anwendung genauso einfach zu modularisieren ist wie Microservices. Und ein Funktionsaufruf ist in der Praxis billiger und zuverlässiger als ein RPC-Aufruf. Sie können also dasselbe entwickeln, mit der Ausnahme, dass es zuverlässiger ist, schneller ausgeführt wird und weniger Code benötigt.

OK, warum entscheiden sich Unternehmen dann für den Microservices-Ansatz?

Die Antwort liegt darin, dass beim Skalieren die Möglichkeiten einer monolithischen Anwendung begrenzt sind. Nach so vielen Benutzern, so vielen Anfragen und so weiter erreichen Sie einen Punkt, an dem Datenbanken nicht skaliert werden können, Webserver Ihren Code nicht mehr im Speicher behalten können und so weiter. Darüber hinaus ermöglichen Microservice-Ansätze unabhängige und inkrementelle Upgrades Ihrer Anwendung. Daher ist eine Microservice-Architektur eine Lösung für die Skalierung Ihrer Anwendung.

Meine persönliche Faustregel lautet, dass der Übergang von Code in einer Skriptsprache (z. B. Python) zu optimiertem C ++ im Allgemeinen die Leistung und die Speichernutzung um 1-2 Größenordnungen verbessern kann. Wenn Sie sich für eine verteilte Architektur entscheiden, erhöht sich der Ressourcenbedarf, Sie können jedoch eine unbegrenzte Skalierung vornehmen. Sie können eine verteilte Architektur zum Laufen bringen, dies ist jedoch schwieriger.

Daher würde ich sagen, wenn Sie ein persönliches Projekt starten, gehen Sie monolithisch. Lerne, wie du das gut machst. Nicht verteilt werden, weil (Google | eBay | Amazon | etc). Wenn Sie in einem großen Unternehmen landen, das verteilt ist, achten Sie genau darauf, wie es funktioniert, und vermasseln Sie es nicht. Und wenn Sie den Übergang abschließen müssen, seien Sie sehr, sehr vorsichtig, denn Sie tun etwas Schweres, das leicht sehr, sehr falsch zu verstehen ist.

Offenlegung, ich habe fast 20 Jahre Erfahrung in Unternehmen aller Größen. Und ja, ich habe sowohl monolithische als auch verteilte Architekturen aus nächster Nähe gesehen. Basierend auf dieser Erfahrung sage ich Ihnen, dass eine verteilte Microservice-Architektur wirklich etwas ist, was Sie tun, weil Sie es brauchen, und nicht, weil es irgendwie sauberer und besser ist.


3
Eine äußerst aufschlussreiche Antwort. Vielen Dank, dass Sie diese Weisheit weitergeben.
ThinkBonobo

Hier ist ein kürzlich gehaltener Vortrag von Martin Fowler (der 3.), der einige dieser Punkte anspricht.
Whymarrh

Gibt es einen Weg zwischen Monolith und Mikrodienstleistungen? Ich habe eine mandantenfähige Monolith-Anwendung. Nach einiger Zeit sehe ich, dass ich mich pro Mieter teilen sollte. Jeder Mieter sollte über eine eigene Anwendungsinstanz verfügen, muss jedoch einige Daten gemeinsam nutzen und es muss sich um einen einzelnen / zentralen Ort handeln. Daher kann ich speziell dafür einen separaten Dienst erstellen. Es sieht so aus, als hätte ich ein paar (nicht ganz so kleine) Apps / Services. Hört sich das vernünftig an?
Dariol

@dariol Es gibt keinen guten Upgradepfad von monolithischen zu vollständigen Mikrodiensten über die Mittelschicht von "Wir laden überall eine große gemeinsame Codebasis und verwenden dann das, was wir brauchen". Es ist jedoch vernünftig, dies als temporärer Patch zu tun, um einen unmittelbaren Bedarf zu decken. Und dann fangen Sie an, echte Mikrodienste abzuspalten, bis der Kern ersetzt werden kann. Der Grund, warum dies schwierig ist, hängt mit dem Abhängigkeitsmanagement zusammen. Sie werden immer wieder sagen: "Ich brauche das nur, aber das hängt davon ab, hängt davon ab ... und jetzt habe ich die ganze Spaghetti-Kugel."
btilly

Ein weiterer Link von Martin Fowler zu diesem Thema: Monolith First
Driftcatcher

5

Ich stimme voll und ganz der Antwort von btilly zu, wollte aber nur ein weiteres Positiv für Microservices hinzufügen, das meiner Meinung nach eine originelle Inspiration darstellt.

In einer Microservices-Welt sind Dienste auf Domänen ausgerichtet und werden von separaten Teams verwaltet (ein Team kann mehrere Dienste verwalten). Dies bedeutet, dass jedes Team Dienste vollständig separat und unabhängig von anderen Diensten freigeben kann (unter der Annahme einer korrekten Versionierung usw.).

Während das wie ein trivialer Vorteil scheint, betrachten Sie das Gegenteil in einer monolithischen Welt. Hier, wo ein Teil der Anwendung häufig aktualisiert werden muss, wirkt sich dies auf das gesamte Projekt und alle anderen daran arbeitenden Teams aus. Sie müssen dann die Zeitplanung, Überprüfungen usw. usw. einführen, und der gesamte Prozess verlangsamt sich.

Berücksichtigen Sie bei Ihrer Wahl nicht nur Ihre Skalierungsanforderungen, sondern auch die erforderlichen Teamstrukturen. Ich stimme der Empfehlung von btilly zu, dass Sie Monolithic starten und später herausfinden, wo Microservices von Nutzen sein könnten. Beachten Sie jedoch, dass die Skalierbarkeit nicht der einzige Vorteil ist.


Das ist wahr. Der Rest des Artikels befasst sich insbesondere damit, wie die Segmentierung nach "Geschäftsfähigkeiten" gefördert wird. Dies ist definitiv ein entscheidender Vorteil.
ThinkBonobo

2

Ich habe an einem Ort gearbeitet, an dem es eine ganze Menge unabhängiger Datenquellen gab. Sie haben sie alle in eine einzige Datenbank gestellt, aber in verschiedene Schemata, auf die Webservices zugreifen. Die Idee war, dass jeder Dienst nur auf die Mindestmenge an Daten zugreifen konnte, die er für seine Arbeit benötigte.

Es war im Vergleich zu einer monolithischen Datenbank nicht viel Aufwand, aber ich denke, dies lag hauptsächlich an der Art der Daten, die sich bereits in isolierten Gruppen befanden.

Die Webservices wurden von dem Webserver-Code aufgerufen, der eine Seite generiert hat. Dies entspricht also weitgehend Ihrer Microservices-Architektur, ist jedoch möglicherweise nicht so umfangreich wie das Wort vermuten lässt und möglicherweise nicht verteilt (beachten Sie, dass ein WS aufgerufen hat) um Daten von einem Drittanbieter-Dienst abzurufen, gab es dort also 1 Instanz eines verteilten Datendienstes). Das Unternehmen, das dies tat, war mehr an Sicherheit als an Skalierbarkeit interessiert. Diese Dienste und die Datendienste boten jedoch eine sicherere Angriffsfläche, da ein ausnutzbarer Fehler in einem der Dienste keinen uneingeschränkten Zugriff auf das gesamte System gewährte.

Ähnliches beschrieb Roger Sessions in seinen hervorragenden Objectwatch-Newslettern mit seinem Software Fortresses-Konzept (leider sind die Newsletter nicht mehr online, aber Sie können sein Buch kaufen).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.