Microservices: MonolithFirst?

9

Ich habe nach Mikroservice-Architekturen gesucht, um einen Überblick über alle Vor- und Nachteile, wann und warum usw. zu erhalten. Viele der Informationen, die ich lese / beobachte, stammen von ThoughtWorks (Martin Fowler, Neal Ford, et al).

Die meisten Arbeiten von Martin Fowler zu diesem Thema sind einige Jahre alt, als Microservices (als bekannter Name in der Programmierung, wenn nicht in der allgemeinen Praxis) noch jung war, daher nehme ich viel davon mit einem Körnchen Salz.

Eines ist insbesondere:

Als ich Geschichten über Teams höre, die eine Microservices-Architektur verwenden, habe ich ein gemeinsames Muster festgestellt.

  • Fast alle erfolgreichen Microservice-Geschichten haben mit einem Monolithen begonnen, der zu groß wurde und zerbrochen wurde
  • In fast allen Fällen, in denen ich von einem System gehört habe, das von Grund auf als Microservice-System entwickelt wurde, sind ernsthafte Probleme aufgetreten.

Dieses Muster hat viele meiner Kollegen dazu veranlasst zu argumentieren, dass Sie kein neues Projekt mit Microservices starten sollten, auch wenn Sie sicher sind, dass Ihre Anwendung groß genug ist, damit es sich lohnt. .

(Ref: https://martinfowler.com/bliki/MonolithFirst.html - Hervorhebung ihrer)

Jetzt, 3 Jahre später und mit Microservices, einem allgegenwärtigeren Begriff, ist es allgemein akzeptabel, dass ein neues System in der Regel besser bedient werden kann, wenn zunächst größere (als Mikroservice-aber-kleiner-als-Monolith-) Service-Chunks vorhanden sind und hergestellt werden sie granularer als Teil einer evolutionären Maßnahme?

Oder gibt es eine Norm, ein Projekt im Gegensatz zu den obigen Aussagen mit einer granularen Microservice-Architektur von Grund auf neu zu beginnen?

Scheint ein vernünftiger allgemeiner Ansatz zu sein, aber neugierig auf die Gedanken der Community.

jleach
quelle

Antworten:

2

Wenn Ihr Unternehmen schon seit einiger Zeit Microservices anbietet, werden möglicherweise bereits einige Teile erstellt, und Sie müssen sie lediglich integrieren. Mögliche Beispiele sind die Authentifizierung als Dienst oder das Speichern von Blob-Daten. In diesem Fall haben Sie die Grenzen bereits definiert und verwenden Code in einer neuen Anwendung wieder. Das ist gut.

Erstellen Sie neuen Code, bei dem Sie sich nicht sicher sind, wo sich die Grenze befinden muss, in einem Dienst. Wenn Sie es modular halten, können Sie bei Bedarf Microservices davon abspalten. Zumal Sie Teile Ihres Dienstes finden, die anders skaliert werden müssen als die anderen.

Der Vorteil von Microservices besteht darin, dass Sie Instanzen hinzufügen können, um die bei Bedarf ausgeführte Arbeit zu skalieren. Wenn ein Teil Ihrer Arbeit in Schüben ausgeführt wird, ist es möglicherweise sinnvoll, dies in einen eigenen Microservice zu unterteilen.

Im Algemeinen:

  • Wenn Sie bereits Microservices erstellt haben, verwenden Sie diese erneut
  • Wenn Sie etwas Neues bauen, lassen Sie die Idee zuerst funktionieren
  • Versuchen Sie beim Bauen, die Dinge modular zu halten, damit einige Dienste leicht ausgebrochen werden können
  • Wenn ein Teil Ihres Service während des Aufbaus in der Lage sein muss, bei Bedarf mit einer anderen Rate skaliert zu werden, trennen Sie diesen in seinen eigenen Service

Allzu oft hören wir nützliche Richtlinien von klugen Leuten mit gutem Ruf wie Martin Fowler und verwandeln sie dann in eine harte Doktrin, von der in keiner Weise abgewichen werden kann.

Sie müssen solche Aussagen im Geiste ihrer Bedeutung treffen . Martin Fowler versucht, Menschen durch Analyse vor Lähmungen zu bewahren und ihnen zu sagen, dass sie etwas bauen sollen, das zuerst funktioniert. Sie können es später jederzeit auseinander brechen, wenn Sie mehr darüber wissen, wie Ihre Anwendung wirklich funktioniert.

Berin Loritsch
quelle
13

Die unmittelbar wertvollsten Vorteile von Microservices können durch einfache Codemodularisierung erzielt werden. Sie können Gruppen von Features mit jedem Modulsystem (maven, npm, nuget, was auch immer) in Module isolieren. Jedes Modul kann einem einzigen Zweck dienen, ein eigenes Repo erstellen, ein eigenes DB-Schema verwenden, eine eigene Konfiguration verwalten, einen eigenen Funktionsrückstand und einen eigenen Release-Zeitplan haben. Sie können weiterhin zusammen auf einem Monolithen eingesetzt werden. Dies ist eine sehr überschaubare Menge an Overhead und bietet einige gute Vorteile. Der größere Aufwand entsteht durch das Trennen von Bereitstellungen, was erst dann wirklich wertvoll ist, wenn Sie über genügend Skalierbarkeit verfügen, um dies zu erfordern. Wenn Ihr Code bereits modular aufgebaut ist, wird die Migration zu gegebener Zeit einfacher.

jiggy
quelle
Klingt nach einer gesunden Best-Practice-Methode für die allgemeine Codierung, gemischt mit ein wenig verbessertem Codebasis-Management, entspricht jedoch nicht dem Pfad "Sie müssen nicht den gesamten Monolithen bei einem geringfügigen Service-Update aktualisieren", bei dem ich davon ausgehe, dass Microservices dazu neigen Leuchten. Auf jeden Fall gute Ratschläge, danke.
Jleach
1
Stimmen Sie der Antwort voll und ganz zu. Ein gut gebauter und korrekt modularisierter Monolith bietet die meisten (wenn auch nicht alle) Vorteile, die Microservices bieten. Auf der anderen Seite haben Microservices einige ziemlich große Probleme.
Milos Mrdovic
@jleach Eine Eigenschaft einer guten Modularisierung ist die unabhängige Bereitstellbarkeit. Wenn Sie Ihren gesamten Monolithen neu kompilieren und erneut bereitstellen müssen, um ein geringfügiges Modul-Update durchzuführen, machen Sie etwas falsch.
Milos Mrdovic
2
Dies ist ein guter Ansatz. Erstellen Sie keinen Microservice, um Microservice zu betreiben. Die Microservice-Architektur sollte zur Lösung von Problemen verwendet werden, sie hat jedoch auch eine Reihe eigener Probleme. Wenn Sie diese Kompromisse nicht kennen, sollten Sie bei der Entwicklung von Microservice von Grund auf vorsichtig sein.
Lie Ryan
1
@MilosMrdovic Selbst mit dem Modulansatz können Sie dennoch eine gewisse Effizienz bei der Bereitstellung erzielen, da Sie nicht Ihren gesamten Monolithen erneut testen müssen, sondern nur das Modul, das Sie aktualisieren. Wenn Ihr Modul alle Qualitätsgatter passiert, können Sie es bauen und versenden. Dann muss Ihr Monolith nur noch seine Abhängigkeitsversion aktualisieren und erneut bereitstellen. Sie müssen keine anderen Module neu erstellen.
Jiggy
2

Meiner Meinung nach kann es vorteilhaft sein, zuerst einen Monolithen zu entwickeln (oder besser: Teile Ihrer Anwendung als Monolithen zu entwickeln).

Es gibt Fälle, in denen Sie sich über die Domäne und die Grenzen Ihres Problems nicht sicher sind (z. B. baue ich eine Schiffsverwaltungssite, benötige ich einen Schiffsservice UND einen Flottenservice oder ist ein Schiffsservice ausreichend?), Und in solchen Fällen a Monolith kann leichter zu entwickeln sein.

Sie sollten damit aufhören, wenn Sie verschiedene Technologien in den Mix einbringen müssen (z. B. Ihre vorhandenen Teile sind in C # geschrieben, aber Ihr neues Problem erfordert maschinelles Lernen, am besten mit Python). Sie müssen die Domänen in Ihrem System gut verstehen Projekt oder Ihr Monolith versucht zu galvanisieren, z. B. baut jeder nur diesen Monolithen und unterdrückt den Begriff der separaten Dienste.

Christian Sauer
quelle
1
„Und in solchen Fällen kann ein Mikroservice einfacher zu entwickeln sein“ - wollten Sie dort über Monolithen sprechen ?
Amon
@amon Danke, ich habe den Satz korrigiert - mein Sohn hat mich 34235 Mal unterbrochen, so dass ich verwirrt war;)
Christian Sauer
Obwohl ich Ihrem ersten Satz zustimme, sollten Sie bedenken, dass sogar Ihr Monolith im Inneren bereits "modular" sein sollte, sonst können Sie einfach nichts trennen, ohne dass alles herunterfällt.
Walfrat
@Walfrat Ich stimme eher zu, aber die Versuchung, vorhandenen Code wiederzuverwenden, ist in einem Monolithen viel größer (und weniger leicht zu zerquetschen). ZB "Oh, sieh mal, jemand hat eine WidgetId definiert, ich werde das nur für meine FormId wiederverwenden": Außerdem kann man nicht einfach eine andere Sprache / Datenbank für ein Projekt verwenden, was das Denken "Jeder muss gemeinsame Werkzeuge verwenden" wirklich fördert
Christian Sauer
1

Ich bin mir ziemlich sicher, dass es zu diesem genauen Artikel von MF einige Fragen gegeben hat.

Meine Einstellung dazu ist folgende:

Ein Monolith mit Wartungs- oder Skalierbarkeitsproblemen wird verbessert, indem er in Mikrodienste unterteilt wird. Ein solches Projekt wird fast immer „erfolgreich“ sein, da selbst das Aufteilen eines kleinen Abschnitts zu messbaren Gewinnen führen kann und Sie eine Linie darunter ziehen können, wenn Sie zufrieden sind.

Ob Ihr halber Monolith + eine Nachrichtenwarteschlange und ein paar Arbeitsprozesse als "Microservice Architecture" gelten, ist ein Argument, das Sie in der Kneipe haben sollten, aber Sie werden es definitiv so nennen , wenn Sie über das Projekt sprechen.

Auf der anderen Seite läuft jedes neue Projekt unabhängig von der gewählten Architektur Gefahr, die Erwartungen nicht zu erfüllen. Daher würden Sie natürlich eine niedrigere Erfolgsquote erwarten. Wenn Sie zu Beginn versucht haben, das Ganze von Grund auf zu einer „Best Practice Microservice Architecture“ zu machen, wagen Sie sich möglicherweise in neue Technologien und die schwierigeren Bereiche von Microservices.

Wir müssen uns auch daran erinnern, dass MF aus einer großen OOP-Perspektive schreibt. Er ist natürlich skeptisch gegenüber einem moderneren verteilten Ansatz.

In der heutigen Zeit würde ich erwarten, dass jede große Geschäftslösung ein Element von Microservices enthält, und nur ein Narr würde empfehlen, dass Sie eine riesige Monolith-Anwendung erstellen, es sei denn, Sie vertreiben eine einzige Desktop-Anwendung.

Ewan
quelle
Vielen Dank. Wenn MF dazu neigt, leicht voreingenommen zu sein, gibt es jemanden, dessen Arbeit ich auf der anderen Seite studieren kann, um die Tiefe der Perspektive zu verbessern?
Jleach
Ich würde "Web-Promis" nicht als Lernressource empfehlen. Es ist in Ordnung für ein paar Anekdoten und ein lustiges Gespräch, aber meiner Erfahrung nach ist es das Detail, das den Unterschied zwischen Erfolg und Misserfolg ausmacht.
Ewan
0

In meiner (umfangreichen) Erfahrung habe ich gesehen, dass viel mehr Projekte aufgrund von Menschenproblemen als aufgrund von Technologieproblemen scheitern. Leider scheitern die Leute nicht gern und neigen daher dazu, die Gründe für das Versagen falsch zu melden und die Technologie zu beschuldigen.

In meinem Bereich Finanzen folgen die meisten neuen Projekte heutzutage Microservice-Architekturen, und aus Sicht der Gesamtbetriebskosten (Total Cost of Ownership) scheint dies eine erfolgreiche Architektur zu sein. Diese Projekte scheinen nicht so oft zu scheitern, und wenn sie die angegebenen Gründe erfüllen, wird die Anwendungsarchitektur nicht oft als Problem aufgeführt.

Softwareentwickler
quelle
Microservices lösen tatsächlich viele organisatorische Probleme. Wenn jeder Dienst einen Eigentümer hat, wissen Sie, wie man erstickt, wenn etwas nicht funktioniert.
Jiggy
@jiggy: Wenn der Code gut modularisiert ist, müssen Sie ihn nicht unbedingt in mehrere Dienste aufteilen, um zu wissen, wen Sie ersticken müssen.
Lie Ryan
@ Ryan, wenn jemand denkt, dass Microservices und Modularisierung synonym sind, dann hat er den Punkt völlig verfehlt.
Software Engineer