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.