Eines der häufigsten Argumente für die Verwendung von Microservices ist die bessere Skalierbarkeit. Aber ich frage mich, ob dieses Argument wirklich zutrifft.
Nehmen wir an, wir hatten eine Anwendung bestehend aus 10 Mikrodiensten, von denen 9 jeweils zwei Instanzen (aus Redundanzgründen) und eine mit 4 Instanzen für die Lastverwaltung (Skalierbarkeit) hatten. Das Argument pro-microservice lautet dann, dass Sie diesen miroservice unabhängig von den anderen Diensten skalieren können.
Nehmen wir jedoch an, dass alle 10 Mikrodienste Module in einem einzelnen Monolithen waren und dass mehrere (z. B. 22 wie die Summe von oben) Instanzen dieses Monolithen eingesetzt wurden. Das System sollte in der Lage sein, die Last für den einen kritischen Teil zu bewältigen, da genügend Instanzen dafür vorhanden sind. Wenn Instanzen Programmlogik enthalten, die nicht benötigt wird, ist der einzige Nachteil, dass die Binärdatei und die Menge des benötigten RAM etwas größer sind. Andererseits sollte der Unterschied in den meisten Fällen nicht zu groß sein - zumindest nicht im Vergleich zum Rest des Stapels (denken Sie an Spring Boot). Die Oberseite eines skalierten Monoliths wäre ein einfacheres System ohne (die meisten) Irrtümer eines verteilten Systems.
Vermisse ich etwas?
quelle
Antworten:
Bei Microservices geht es nicht darum, die Prozessorlast zu reduzieren. Aufgrund des Kommunikationsaufwands und der Wiederholung von Funktionen, bei denen es sich früher um globalen Dienstprogrammcode handelte, wird die Prozessorlast in der Regel etwas erhöht .
Die Aufgabe der Abschaffung eines Monolithen besteht vielmehr darin, ein komplexes Funktionssystem überhaupt warten, bereitstellen und ausführen zu können . Sobald Ihr System eine bestimmte Größe erreicht hat, wird das Kompilieren, Testen, Bereitstellen usw. eines Monolithen zu teuer, um durchführbar zu sein und gleichzeitig eine angemessene Betriebszeit aufrechtzuerhalten. Mit microservices können Sie ein System stückweise aktualisieren, neu starten oder zurücksetzen.
Machen Sie keinen Fehler, wir schreiben keine Microservices, weil es von Natur aus eine bessere Lösung ist , Dinge lose über entfernte Schnittstellen zu koppeln. In der Tat ist der Verlust einer starken Typ- und Konsistenzprüfung, die ein Monolith liefern könnte, oft ein Hauptnachteil. Wir tun es, weil wir müssen, weil die Komplexität uns überwunden hat und wir das Beste aus einer suboptimalen Situation machen.
quelle
Sie haben größtenteils recht. Wenn Sie schnelle Dienste haben, die gleichmäßig geladen sind, können Sie sie auch auf allen Boxen installieren. Es ist nicht so schön wie eine Box pro Service, aber es spart Geld.
Jedoch. Sobald Sie ein Ungleichgewicht haben, sagen wir, dass Service 5 2 Minuten lang 100% der CPU benötigt, möchten Sie diesen Service auf eine eigene Box verschieben, damit er nicht alle anderen Services blockiert, wenn er ausgeführt wird.
Wenn aufgrund des Ladevorgangs das Zeitlimit für Anrufe an den Service 5 überschritten wird, fallen nur einige Funktionen Ihrer App aus.
Jetzt können Sie dasselbe mit einem gut modularisierten Monolithen tun. Installieren Sie alle Dienste, leiten Sie jedoch nur den Verkehr von Dienst 5 an einen von ihnen weiter. Während der Weiterleitung von 5 Dienstverkehr zu den anderen Boxen.
Aber normalerweise sind Monolithe von Natur aus keine lose Sammlung von Diensten, die zufällig auf derselben Box installiert werden. Zwischen den Modulen befinden sich Speicheraufrufe, die zum Ausfall der App führen.
quelle
Der Punkt von Mikrodiensten ist 1) Trennung von Bedenken und 2) Verteilung der Last. Dies gibt uns im Wesentlichen die Freiheit, den bestmöglichen Black-Boxed-Service mit Technologien zu erbringen, die für diese Aufgabe spezifisch sind. Unsere Dienstleistungen können mehrsprachig sein - das heißt, in verschiedenen Programmiersprachen auf verschiedenen Stapeln geschrieben. Verschiedene Teams können an jedem Service arbeiten, ohne zu wissen, wie die anderen über den Vertrag ihrer API hinaus arbeiten. Insgesamt gesehen ermöglicht dies eine viel einfachere Codebasis für jeden Dienst, die leichter zu debuggen, zu verstehen und hinsichtlich der Leistung zu optimieren ist.
quelle