Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Der Microservice Trade-Off für JUG (60min Version)

Der Microservice Trade-Off für JUG (60min Version)

Microservices sind irgendwie toll, das weiß ja inzwischen jeder. Aber vielen ist nicht bewusst,
dass man für diesen Architekturansatz auch einen Preis zahlt, der sich nicht immer lohnt.
Eines der schwierigsten Probleme in der Softwarearchitektur ist das Finden geeigneter
Schnitte zwischen Deploymenteinheiten verteilter Systeme ("Services"). Missverständnisse
und Fehlannahmen zu Architekturparadigmen wie "Microservices" führen immer wieder zu
schlechten Entscheidungen über Software-Schnitte, die schwer umzukehren sind und
schlechte Auswirkungen auf die Weiterentwicklung und Nachhaltigkeit eines Systems haben
können.
In diesem Talk werde ich versuchen, die verschiedenen Seiten des Trade-Off eines
Softwareschnitts zu beleuchten und so nah wie möglich an konkrete Lösungen für dieses
komplizierte "It depends" Problem zu kommen. Welche Probleme hole ich mir mit einem
Softwareschnitt ins Boot? Wann kann ich davon profitieren? Was sind weit verbreitete
Missverständnisse über Microservice Architektur? Welche Methoden und Heuristiken können
uns helfen, die richtige Entscheidung zu treffen? Wie hilft uns der modulithische Ansatz an
den Stellen, an denen ein Schnitt keinen Sinn macht? In welchen Situationen stehen wir vor
einer solchen Entscheidung und wie gehen wir sie an?
Neben Erkenntnissen aus Domain Driven Design und Team Topologies sowie Elementen der
Architekturansätze Microservices und Modulith enthält dieser Talk eine Menge real-life
Erfahrung aus Projekten mit verteilten Systemen. Der Talk wird die Zuhörer befähigen, bei
anstehenden Architekturentscheidungen die Schnitte ihrer Software besser abgewägt und
nachhaltiger zu wählen.

Avatar for Arnold Franke

Arnold Franke

July 24, 2025
Tweet

More Decks by Arnold Franke

Other Decks in Programming

Transcript

  1. • Unabhängig voneinander deployen • Unabhängig voneinander skalieren • Technologieunabhängigkeit

    untereinander • Unabhängig voneinander in verschiedenen Teams entwickeln • Resilienz und Fehlerisolierung • Leichte Ersetzbarkeit • Modularisierung – geringe Kopplung, hohe Kohäsion • Kleine, gekapselte Teile mit niedriger Komplexität • Einfach wartbar, leicht erweiterbar • Klare Abhängigkeiten mit expliziten APIs • Geringes Risiko für unerwartete Seiteneffekte • Architekturregeln enforcen • Können containerisiert werden • Einfache CI/CD Microservices sind super cool! Was versprechen Microservices?
  2. • Unabhängig voneinander deployen • Unabhängig voneinander skalieren • Technologieunabhängigkeit

    untereinander • Unabhängig voneinander in verschiedenen Teams entwickeln • Resilienz und Fehlerisolierung • Leichte Ersetzbarkeit • Modularisierung – geringe Kopplung, hohe Kohäsion • Kleine, gekapselte Teile mit niedriger Komplexität • Einfach wartbar, leicht erweiterbar • Klare Abhängigkeiten mit expliziten APIs • Geringes Risiko für unerwartete Seiteneffekte • Architekturregeln enforcen • Können containerisiert werden • Einfache CI/CD Microservices sind super cool! Was versprechen Microservices?
  3. • Unabhängig voneinander deployen • Unabhängig voneinander skalieren • Technologieunabhängigkeit

    untereinander • Unabhängig voneinander in verschiedenen Teams entwickeln • Resilienz und Fehlerisolierung • Leichte Ersetzbarkeit • Modularisierung – geringe Kopplung, hohe Kohäsion • Kleine, gekapselte Teile mit niedriger Komplexität • Einfach wartbar, leicht erweiterbar • Klare Abhängigkeiten mit expliziten APIs • Geringes Risiko für unerwartete Seiteneffekte • Architekturregeln enforcen • Können containerisiert werden • Einfache CI/CD Microservices sind … immer noch cool? Was versprechen Microservices? (das hier geht alles auch ohne Microservices)
  4. • Unabhängig voneinander deployen • Unabhängig voneinander skalieren • Technologieunabhängigkeit

    untereinander • Unabhängig voneinander in verschiedenen Teams entwickeln • Resilienz und Fehlerisolierung • Leichte Ersetzbarkeit • Modularisierung – geringe Kopplung, hohe Kohäsion • Kleine, gekapselte Teile mit niedriger Komplexität • Einfach wartbar, leicht erweiterbar • Klare Abhängigkeiten mit expliziten APIs • Geringes Risiko für unerwartete Seiteneffekte • Architekturregeln enforcen • Können containerisiert werden • Einfache CI/CD Die eine Seite des Microservice Trade-Off Was versprechen Microservices? (das hier geht alles auch ohne Microservices) Potential von Microservices. Die mögliche „plus“ Seite des Trade-Off
  5. Verbreitete Missverständnisse über Microservices • Services müssen klein sein. Je

    kleiner desto besser. • Viele kleine Services sind einfacher zu warten/betreiben als ein großer Monolith Missverständnisse
  6. Verbreitete Missverständnisse über Microservices • Services müssen klein sein. Je

    kleiner desto besser. • Viele kleine Services sind einfacher zu warten/betreiben als ein großer Service • Wenn wir gute „DevOps Automatismen“ haben, dann gibt es keinen Overhead durch mehr Microservices Missverständnisse
  7. Verbreitete Missverständnisse über Microservices • Services müssen klein sein. Je

    kleiner desto besser. • Viele kleine Services sind einfacher zu warten/betreiben als ein großer Service • Wenn wir gute „DevOps Automatismen“ haben, dann gibt es keinen Overhead durch mehr Microservices • Microservices sind der beste Weg, seine Software zu modularisieren Missverständnisse
  8. Verbreitete Missverständnisse über Microservices • Services müssen klein sein. Je

    kleiner desto besser. • Viele kleine Services sind einfacher zu warten/betreiben als ein großer Service • Wenn wir gute „DevOps Automatismen“ haben, dann gibt es keinen Overhead durch mehr Microservices • Microservices sind der beste Weg, seine Software zu modularisieren • Microservices lösen alle unsere Performance Probleme Missverständnisse
  9. Verbreitete Missverständnisse über Microservices • Services müssen klein sein. Je

    kleiner desto besser. • Viele kleine Services sind einfacher zu warten/betreiben als ein großer Service • Wenn wir gute „DevOps Automatismen“ haben, dann gibt es keinen Overhead durch mehr Microservices • Microservices sind der beste Weg, seine Software zu modularisieren • Microservices lösen alle unsere Performance Probleme • Wir haben hier fünf Teams, also ist es am besten wir bauen fünf Services Missverständnisse
  10. Welche potentiellen Probleme und Risiken birgt ein Service Schnitt? •

    Schnittstelle: Calls/Events übers Netzwerk statt innerhalb der Applikation – Protokolle (AMQP, MQTT, HTTP...) – Client/Server oder Publisher/Subscriber. Broker? Gateway? – Serialisierung/Deserialisierung – Komplizierteres Schnittstellendesign, Contract und Dokumentation – Neue Dimension an Problemen: Timeouts, Connection Probleme, Retries, Out-of-sequence delivery, At- least-once delivery, Error Handling … • Dadurch wird alles: – Langsamer – Fehleranfälliger – Aufwändiger zu bauen – Schwerer zu verstehen Die andere Seite des Trade-Off
  11. Welche potentiellen Probleme und Risiken birgt ein Service Schnitt? •

    Build, Test und Deploy – Duplikation • Zwei Pipelines statt einer • Zweimal Testsysteme plus Infrastruktur • Zweimal die Anwendungsinfrastruktur wie z.B. Datenbanken • Zwei mal die ganze Komplexität mit Load Balancing, Instanzen, Ressourcenzuweisung, Zero-Downtime-Deployment… • Zwei Artefakte statt einem, zweimal releasen, Abhängigkeiten/Kompatibilität zwischen den Artefakten – Test Setup von integriertem Test komplexer Die andere Seite des Trade-Off
  12. Welche potentiellen Probleme und Risiken birgt ein Service Schnitt? •

    In der Anwendung: – Duplikation • Zwei Anwendungen kon昀椀gurieren statt einer • Zwei mal dokumentieren • Updates von Dependencies an zwei Stellen statt einer – Cross cutting concerns wie Mandantenfähigkeit, Security, Monitoring, Tracing, Kon昀椀guration sind auf einmal verteilt und müssen konsistent gehalten werden – State an mehreren Stellen replizieren/synchronisieren • Im Team: – Cognitive Load des Teams steigt beträchtlich Die andere Seite des Trade-Off
  13. Entwicklungsteam in der Verkehrsbranche Zustand: • Moderner Tech Stack und

    hoch automatisierte CI/CD Landschaft, hoch standardisierte Pipelines • Microservice Architektur mit ca. 15 Service mit mehreren Software-Artefakten pro Service • >50 Repos Auffällige Auswirkungen: • Eine Anpassung Mehrere Änderungen in mehreren Repos (manchmal in allen) → • Häu昀椀ge Probleme und Fehlschläge in der CI/CD Infrastruktur • Schwierig, den Überblick zu behalten. Cognitive Load hoch. • Nimmt Zeit und Fokus von Weiterentwicklung Beispiele für die Auswirkungen von Vorteilen und Nachteilen
  14. Kundenstamm Team im Einzelhandel Situation: • Modulith, sauber strukturiert, sauberer

    Code • Viele Aspekte unterschiedlicher Domänen in einem Stück Software • Viele Module, die unterschiedliche Dinge tun in einem Stück Software Auffällige Auswirkungen: • Resilienzprobleme – kleine, kritische Teile nicht verfügbar, wenn es an anderer Stelle Probleme gab • Vermischung verschiedener fachlicher Domänen ungewollte Kopplung und Nebenwirkungen → • Schwierige Migration des Basisframeworks Beispiele für die Auswirkungen von Vorteilen und Nachteilen
  15. Es steckt viel Potential in einem Software-Schnitt Ein Schnitt ist

    aber ganz bestimmt nicht kostenlos und kein No-Brainer „It depends“ – es ist ein Trade-Off Zwischenfazit
  16. Entscheidende Frage, um den Trade-Off zu bewerten: Welchen konkreten Vorteil

    bringt mir ein Schnitt in meiner Software, der die potentiellen Nachteile aufwiegt? Zwischenfazit
  17. Heuristiken für Softwareschnitte – Business Domain „Align software and its

    boundaries to the business domain“ - Domain Driven Design
  18. Heuristiken für Softwareschnitte – Fracture Planes Common Fracture Planes •

    Regulatory Compliance • Performance Isolation • Technology (existing or by choice) • Criticality/Risk • User Personas • Replacability • Longevity • Change Cadence • Support Frequency • Security • ... • Individuelle Fracture Planes, die Aufwand, Komplexität oder Cognitive Load isolieren
  19. „Choosing Microservices 昀椀rst is dangerous. Choosing Monoliths for the long

    term is also dangerous." „Modules 昀椀rst, deployment last“ – Strategic Monoliths and Microservices • Keine Schnitte im Voraus planen, bis auf die völlig offensichtlichen • Mit einer Deploymenteinheit beginnen und erstmal Mehrwert liefern – deliver working Software! • Sich immer wieder fragen „Ist hier ein Schnitt sinnvoll? Welche Fracture Planes greifen hier? Lohnt sich der Trade-Off?“. • Innerhalb der Deploymenteinheit modularisieren, kapseln Modulithische Architektur → Evolution einer Systemlandschaft
  20. "Choosing Microservices 昀椀rst is dangerous. Choosing Monoliths for the long

    term is also dangerous." „Modules 昀椀rst, deployment last“ – Strategic Monoliths and Microservices • Keine Schnitte im Voraus planen, bis auf die völlig offensichtlichen • Mit einer Deploymenteinheit beginnen und erstmal Mehrwert liefern – deliver working Software! • Sich immer wieder fragen „Ist hier ein Schnitt sinnvoll? Welche Fracture Planes greifen hier? Lohnt sich der Trade-Off?“. • Innerhalb der Deploymenteinheit modularisieren, kapseln Modulithische Architektur → Evolution einer Systemlandschaft
  21. • Unabhängig voneinander deployen • Unabhängig voneinander skalieren • Technologieunabhängigkeit

    untereinander • Unabhängig voneinander in verschiedenen Teams entwickeln • Resilienz und Fehlerisolierung • Leichte Ersetzbarkeit • Modularisierung – geringe Kopplung, hohe Kohäsion • Kleine, gekapselte Teile mit niedriger Komplexität • Einfach wartbar, leicht erweiterbar • Klare Abhängigkeiten mit expliziten APIs • Geringes Risiko für unerwartete Seiteneffekte • Architekturregeln enforcen • Können containerisiert werden • Einfache CI/CD Modularer Monolith Was versprechen Microservices? (das hier geht alles auch ohne Microservices)
  22. • Unabhängig voneinander deployen • Unabhängig voneinander skalieren • Technologieunabhängigkeit

    untereinander • Unabhängig voneinander in verschiedenen Teams entwickeln • Resilienz und Fehlerisolierung • Leichte Ersetzbarkeit • Modularisierung – geringe Kopplung, hohe Kohäsion • Kleine, gekapselte Teile mit niedriger Komplexität • Einfach wartbar, leicht erweiterbar • Klare Abhängigkeiten mit expliziten APIs • Geringes Risiko für unerwartete Seiteneffekte • Architekturregeln enforcen • Können containerisiert werden • Einfache CI/CD Modularer Monolith Das liefern Microservices Das liefert ein Modulith
  23. Evolution des Systems anhand agiler Architektur • Entscheidungen für/gegen Schnitte

    so spät wie sinnvoll möglich treffen. • Entscheidungen dokumentieren und vor allem gut begründen • Vergangene Entscheidungen bei Bedarf neu bewerten. Trägt die Begründung noch? • Die Architektur den aktuellen Anforderungen und Erkenntnissen anpassen Evolution einer Systemlandschaft
  24. Legt euch nicht blind von vorne herein auf Microservices oder

    Monolithen fest! Start simple! Seid euch bei jedem Schnitt des Trade-Offs bewusst! Arbeitet agil – auch in der Architektur! Wrap-Up