Sollte ich bei der Entwicklung eines Systems selbst Microservices verwenden?

30

Ich beginne ein neues Projekt in der Arbeit und werde wahrscheinlich fast der einzige Entwickler des Projekts sein, obwohl ein oder zwei andere Entwickler vorhandene Anwendungen oder einfache Skripte in das Hauptprojekt integrieren müssen. Das Projekt muss kleine Mengen- und Streaming-Datenmengen verarbeiten und sowohl ereignisgesteuerte als auch bedarfsgesteuerte Codeausführungen durchführen. Einige Teile des Frameworks sind stark CPU-gebunden, und einige Teile können stark E / A-gebunden sein. Die meisten Daten müssen auf einem einzelnen Computer gespeichert sein, aber wir können einen Cluster erstellen und VMs verbinden, um die verfügbare Rechenleistung zu erhöhen. Es wird wahrscheinlich eine oder mehrere kleine Webanwendungen geben, die von den Diensten abhängen, die für dieses Kernframework bereitgestellt werden. Die Hauptsprache wird für fast alles Python sein.

Meine Frage ist, ob ich einen Ansatz für Microservices wählen oder bei einer monolithischen Anwendung bleiben soll, da ich den größten Teil der Entwicklung selbst vornehmen werde. Ich bin der Meinung, dass Microservices (unter Verwendung von Nameko) eine natürliche Trennung zwischen Elementen des Frameworks bieten, die unterschiedliche Ausführungsmodelle haben (Daten-Pipelines, ereignisgesteuerte, On-Demand-, Webanwendungen usw.) und eine klare Möglichkeit, die Arbeitslast zu verteilen Kommunikation über mehrere Prozesse hinweg. Ich mache mir Sorgen, dass ich wahrscheinlich einen Kubernetes-Cluster haben werde, der verwaltet werden muss (ich kenne Docker, aber Kubernetes ist noch recht neu). Mehrere Dienste (rabbitmq, redis usw.) sind erforderlich, um die Ausführung des Systems zu vereinfachen. und möglicherweise eine Menge kleiner Codestücke, um tatsächlich alle notwendigen Funktionen zu implementieren, die wir

Vereinfachen Microservices bei einem Projekt mit nur wenig mehr als einem Entwickler die Entwicklung und Wartung eines solchen komplizierten Systems? Gibt es Methoden / Systeme / Frameworks, die ich verwenden sollte, oder um den Aufwand für die Gestaltung des Systems auf diese Weise zu verringern?

scnerd
quelle
10
Sie setzen Microservices ein, wenn Sie die Vorteile von Microservices benötigen und diese die Kosten überwiegen. Ich persönlich verstehe nicht, warum Sie für eine einzelne Bewerbung, die von einer Person verfasst wurde, Mikrodienstleistungen benötigen würden, es sei denn, Sie haben sich selbst unterrichtet oder Sie hatten langfristige Aussichten für eine größere Bewerbung.
Robert Harvey

Antworten:

49

Mikrodienste sind im Allgemeinen unerwünscht, weil sie Ihre Software in ein verteiltes System verwandeln - und verteilte Systeme erschweren alles erheblich. Eine serviceorientierte Architektur bietet jedoch einige wichtige Vorteile:

  • Verschiedene Services können von verschiedenen Teams unabhängig voneinander entwickelt und bereitgestellt werden
  • Verschiedene Dienste können unabhängig voneinander skaliert werden

Da Sie der einzige Entwickler sind, benötigen Sie nicht die Flexibilität, die Dienste unabhängig voneinander zu entwickeln.

Beachten Sie jedoch, dass einige Teile möglicherweise CPU-gebunden sind. Daher ist es möglicherweise wünschenswert, diese unabhängig von der restlichen Anwendung zu skalieren. Wenn dies der Fall ist, bedeutet dies nicht, dass Sie das gesamte Projekt in eine Microservice-Architektur umwandeln müssen. Sie müssen nur diesen CPU-intensiven Teil in einen eigenen Dienst verschieben und können den Rest in einem praktischen Monolithen aufbewahren. In welcher Richtung das System aufgeteilt werden sollte, ist schwer zu sagen, aber im Allgemeinen ist die DDD-Idee von „begrenzten Kontexten“ eine gute Richtlinie.

Beachten Sie, dass Monolithen nicht schlecht sind. Monolithen sind kein riesiges, chaotisches und nicht zu wartendes Projekt. Wo Sie das System in verschiedene Mikrodienste aufteilen könnten, können Sie das System auch in verschiedene Komponenten innerhalb eines Monolithen aufteilen. Die Trennung zwischen diesen Komponenten wird in einer serviceorientierten Architektur nur sichtbarer und deutlicher erzwungen. Dies bedeutet auch, dass es für ein gut konzipiertes System relativ einfach sein sollte, eine Komponente zu einem späteren Zeitpunkt in einen Dienst zu verwandeln. Damit Sie sich jetzt nicht entscheiden müssen, können Sie zu Microservices wechseln, wenn sich ein Monolith als ungeeignet erwiesen hat.

Denken Sie auch an das Konzept von Martin Fowler für den Microservice Premium (2015): Microservices bringen neben der Basiskomplexität Ihres Systems auch eine erhebliche eigene Komplexität mit sich. Sie müssen diese „Prämie“ in Bezug auf die verringerte Produktivität bezahlen. Dies bedeutet, dass Sie bei einfachen Projekten mit Microservices weniger produktiv sind. Dies ändert sich bei komplexeren Projekten: Während die Arbeit mit einer monolithischen Lösung immer schwieriger wird, skaliert eine Microservice-Architektur viel besser und erfordert ungefähr konstanten Aufwand. Sie müssen wissen, ob sich der anfängliche Mehraufwand für Microservices für Ihr Softwaresystem lohnt. Da Sie diese Frage stellen, lautet die Antwort wahrscheinlich "nein". Fowler fährt fort:

Meine wichtigste Richtlinie wäre also, nicht einmal Mikrodienstleistungen in Betracht zu ziehen, es sei denn, Sie haben ein System, das zu komplex ist, um als Monolith verwaltet zu werden. Die meisten Softwaresysteme sollten als einzelne monolithische Anwendung erstellt werden. Achten Sie auf eine gute Modularität innerhalb dieses Monolithen, aber versuchen Sie nicht, ihn in separate Dienste zu unterteilen.

amon
quelle
31
TL; DR-Version: Fügen Sie nur dann Komplexität hinzu, wenn Sie tatsächlich auftretende Probleme lösen.
jpmc26
1
Planen Sie es so, dass Sie später leichter auf eine Microservice-Architektur migrieren können. ZB Trennung von Bedenken gegen einen großen Schlammballen, und es wird jetzt einfacher zu warten sein und Teile später heraus zu verschieben, um Dienste zu trennen. Sie können die von Mikrodiensten inspirierte Aufgabenteilung / Domains beibehalten, ohne Anrufe tätigen / Nachrichten an andere Dienste senden zu müssen.
ps2goat
1
Fowlers erstes Gesetz der verteilten Objekte: Don't
K. Alan Bates
1
Es gibt einen dritten Vorteil, auch wenn er für das OP ähnlich nutzlos ist: Wenn Sie ohnehin ein verteiltes System erstellen müssen und bereits gute Tools für Ihr verteiltes System haben oder erstellen möchten, lässt sich ein Mikroservice einfacher in dieses Tool integrieren und ermöglichen eine feinkörnigere Steuerung in vielen Aspekten. Dies kann die Fehlerbehebung, Profilerstellung, Integrationstests, Nachverfolgung usw. vereinfachen. Dies hängt jedoch natürlich von den vorhandenen Tools ab, die Ihre Microservice-Architektur unterstützen. Ohne dieses unterstützende Ökosystem werden Mikrodienstleistungen nur noch komplexer.
Kevin
2
Ja, gute Antwort. Die Leute scheinen zu vergessen, dass Microservices tatsächlich Komplexität hinzufügen - es lohnt sich also nicht, wenn sie nicht mehr Komplexität entfernen . Und in fast allen Fällen wird ein einzelner Entwickler nicht genug Nutzen daraus ziehen, MSA zu machen.
Enderland