Microservices und monolithische Architektur im Vergleich
Wenn monolithische Architekturen zu groß werden, ist es wohl an der Zeit für Microservices
Chandler Harris
Marketing Strategist & Autor
Eine monolithische Anwendung wird als einzelne komplette Einheit erstellt, während eine Microservice-Architektur eine Ansammlung kleinerer, unabhängig einsetzbarer Services ist. Welche Lösung ist für dich die richtige? Das hängt von verschiedenen Faktoren ab.
Im Jahr 2009 hatte Netflix Wachstumsprobleme. Die Infrastruktur des Unternehmens konnte nicht mehr mit der Nachfrage nach seinen schnell wachsenden Video-Streaming-Serviceangeboten mithalten. Daher beschloss das Unternehmen, seine IT-Infrastruktur von seinen privaten Rechenzentren zu einer Public Cloud zu migrieren und die monolithische Architektur durch eine Microservice-Architektur zu ersetzen. Das einzige Problem dabei: Den Begriff "Microservice" gab es damals noch gar nicht und die Struktur war alles andere als bekannt.
Netflix war eines der ersten prominenten Unternehmen, das erfolgreich von einer monolithischen auf eine cloudbasierte Microservice-Architektur umstellte. Es erhielt 2015 den JAX Special Jury-Award zum Teil deshalb, weil sich diese neue Infrastruktur DevOps zu eigen machen konnte. Heute verfügt Netflix über mehr als tausend Microservices, die separate Teile der Plattform verwalten und unterstützen, sodass Ingenieure häufiger Code bereitstellen können – manchmal mehrere tausend Mal täglich.
Netflix war Vorreiter einer Bewegung, die heute immer gängiger wird, nämlich die Umstellung von einer monolithischen Architektur auf eine Microservice-Architektur.
Teste Compass kostenlos
Als Unterstützung beim Entwickeln, zum Katalogisieren von Diensten und zum Optimieren des Softwarezustands.
Was ist eine monolithische Architektur?
Eine monolithische Architektur ist ein herkömmliches Modell eines Softwareprogramms, das als komplette Einheit erstellt wurde, die in sich geschlossen und unabhängig von anderen Anwendungen ist. Der Begriff "Monolith" wird oft mit etwas Großem und Glazialem in Verbindung gebracht, was nicht allzu weit von der monolithischen Architektur für das Softwaredesign entfernt ist. Eine monolithische Architektur ist ein einzigartiges, großes Rechennetzwerk mit einer Codebasis, das alle geschäftlichen Belange miteinander verknüpft. Um Änderungen an dieser Art der Anwendung vorzunehmen, muss der gesamte Stack aktualisiert werden. Dabei wird auf die Codebasis zugegriffen und eine aktualisierte Version der serviceseitigen Schnittstelle erstellt und bereitgestellt. Diese Vorgehensweise macht Updates restriktiv und zeitaufwendig.
Monolithische Architekturen können in frühen Projektphasen praktisch sein, um den kognitiven Aufwand für das Codemanagement und Deployment zu erleichtern. Dadurch kann in dieser Struktur alles auf einmal veröffentlicht werden.
Zugehöriges Material
Wie erstellt man Microservices?
Lösung anzeigen
Verbesserte Entwicklung mit Compass
Vorteile einer monolithischen Architektur
Unternehmen können abhängig von einer Reihe verschiedener Faktoren von einer monolithischen Architektur oder einer Microservice-Architektur profitieren. Eine monolithische Architektur zeichnet sich vor allem durch eine schnelle Entwicklungszeit aus, weil die Anwendung mit einer Codebasis erstellt wurde und dadurch simpel ist.
Zu den Vorteilen einer monolithischen Architektur gehören:
Einfaches Deployment – Eine ausführbare Datei oder ein Verzeichnis erleichtern das Deployment.
Entwicklung – Wenn eine Anwendung mit einer Codebasis erstellt wird, ist ihre Entwicklung einfacher.
Leistung – In einer zentralisierten Codebasis und einem Repository kann eine API häufig dieselbe Funktion übernehmen, die zahlreiche APIs mit Microservices ausführen.
Vereinfachtes Testen – Da es sich bei einer monolithischen Anwendung um eine einzige, zentralisierte Einheit handelt, können End-to-End-Tests schneller durchgeführt werden als mit einer verteilten Anwendung.
Einfaches Debugging – Da sich der gesamte Code an einem Ort befindet, kannst du einfacher Anfragen verfolgen und Probleme finden.
Nachteile einer monolithischen Architektur
Wie sich bei Netflix zeigte, können monolithische Anwendungen ziemlich effektiv sein, bis sie zu groß werden und die Skalierung zur Herausforderung machen. Wenn du eine kleine Änderung in einer einzigen Funktion vornehmen möchtest, muss die gesamte Plattform kompiliert und getestet werden. Und das widerspricht dem agilen Ansatz, den Entwickler heutzutage bevorzugen.
Zu den Nachteilen einer monolithischen Architektur gehören:
Langsamere Entwicklungsgeschwindigkeit – Eine große, monolithische Anwendung macht die Entwicklung komplexer und langsamer.
Skalierbarkeit – Einzelne Komponenten können nicht skaliert werden.
Zuverlässigkeit – Wenn in einem Modul ein Fehler vorliegt, kann dieser die Verfügbarkeit der gesamten Anwendung beeinträchtigen.
Hindernis für die Einführung von Technologie – Alle Änderungen im Framework oder an der Sprache wirken sich auf die gesamte Anwendung aus, was Änderungen häufig kostspielig und zeitaufwendig macht.
Mangelnde Flexibilität – Eine monolithische Architektur wird durch die bereits darin verwendeten Technologien eingeschränkt.
Deployment – Eine geringfügige Änderung an einer monolithischen Anwendung erfordert, dass sie komplett neu bereitgestellt wird.
Was sind Microservices?
Eine Microservice-Architektur, die auch einfach als Microservices bezeichnet wird, ist eine Struktur, die auf einer Reihe von unabhängig bereitstellbaren Services beruht. Diese Services verfügen über ihre eigene Geschäftslogik und Datenbank mit einem bestimmten Ziel. Aktualisierungen, Tests, Deployments und Skalierungen erfolgen in jedem einzelnen Service. Microservices unterteilen wichtige bereichsspezifische Anliegen in separate unabhängige Codebasen. Microservices verringern nicht die Komplexität, machen diese aber sichtbar und besser handhabbar. Hierzu werden Aufgaben in kleinere Prozesse unterteilt, die unabhängig voneinander funktionieren und zur Gesamtfunktion beitragen.
Die Einführung von Microservices geht oft mit DevOps einher, schließlich bilden sie die Grundlage für Continuous-Delivery-Praktiken, die Teams eine schnelle Anpassung an Benutzeranforderungen ermöglichen.
Umstellung auf Microservices bei Atlassian
Wir bei Atlassian schickten uns im Jahr 2018 an, auf Microservices umzusteigen, nachdem wir Schwierigkeiten mit dem Wachstum und der Skalierung von Jira und Confluence hatten. Wir stellten fest, dass unsere monolithischen Einzelmandanten-Architekturen, die lokal ausgeführt wurden, nicht mit zukünftigen Skalierungsanforderungen mithalten können.
Wir beschlossen daher, die Architektur von Jira und Confluence neu zu gestalten und von einem zustandsbehafteten, monolithischen Einzelmandanten-System auf mehrmandantenfähige, zustandslose Cloud-Anwendungen von Amazon Web Services (AWS) umzustellen. Diese würden wir dann im Laufe der Zeit in Microservices zerlegen. Wir nannten das Projekt "Vertigo", nach einem erfahrenen Ingenieur, der sagte: "Mir gefällt die Idee ziemlich gut, auch wenn mir davon schwindlig wird." Bis dato war dies unser größtes Infrastrukturprojekt und es sollte zwei Jahre dauern, bis die Umstellung auf AWS abgeschlossen war. Dabei wurden in etwas mehr als zehn Monaten über 100.000 Kunden ohne Serviceunterbrechungen migriert. Außerdem haben wir uns vorgenommen, die Services in Microservices zu zerlegen.
Vorteile von Microservices
Microservices sind keineswegs eine Wunderwaffe, sie beheben jedoch diverse Probleme von wachsenden Softwarelösungen und Unternehmen. Da eine Microservice-Architektur aus Einheiten besteht, die unabhängig voneinander ausgeführt werden, kann jeder Service entwickelt, aktualisiert, bereitgestellt und skaliert werden, ohne andere Services zu beeinträchtigen. Softwareupdates können häufiger durchgeführt werden, um eine verbesserte Zuverlässigkeit, Verfügbarkeit und Leistung zu erzielen. Früher haben wir einmal pro Woche Updates durchgeführt, mittlerweile sind wir bei zwei bis drei Updates pro Tag.
Während Atlassian weiter wächst, können wir mit Microservices Teams und geografische Standorte zuverlässiger skalieren, indem wir Zuständigkeiten nach Serviceinhabern aufteilen. Vor dem Vertigo-Projekt hatte Atlassian fünf verschiedene Entwicklungszentren auf der ganzen Welt. Diese verteilten Teams waren aufgrund einer zentralisierten monolithischen Struktur eingeschränkt, deshalb mussten wir einen Weg finden, sie autonom zu unterstützen. Mit Microservices war das möglich.
Zu den Vorteilen von Vertigo gehören eine höhere Deployment-Geschwindigkeit, Disaster Recovery, geringere Kosten und eine höhere Leistung. Dank ihnen erreichen wir unser Ziel schneller und können Kunden gleichzeitig einen besseren Mehrwert bieten.
Insgesamt machen Microservices es Teams auch einfacher, Code zu aktualisieren und Release-Zyklen durch Continuous Integration und Continuous Delivery (CI/CD) zu beschleunigen. Teams können mit Code experimentieren und Änderungen rückgängig machen, falls etwas schiefgeht.
Die Vorteile von Microservices sind kurz zusammengefasst folgende:
Agilität – Du kannst agile Arbeitsweisen mit kleinen Teams fördern, die häufige Deployments vornehmen.
Flexible Skalierung – Wenn ein Microservice seine Ladekapazität erreicht, können neue Instanzen dieses Service schnell im zugehörigen Cluster bereitgestellt werden, um Abhilfe zu schaffen. Wir haben jetzt eine mehrmandatenfähige und zustandslose Architektur, bei der Kunden auf mehrere Instanzen verteilt sind. Dadurch können wir viel größere Instanzen unterstützen.
Continuous Deployment – Wir haben jetzt häufige und schnellere Release-Zyklen. Früher wurden Updates einmal pro Woche durchgeführt, mittlerweile sind wir bei zwei bis drei Updates pro Tag.
Sehr gute Wartbarkeit und Testfähigkeit – Teams können mit neuen Funktionen experimentieren und Änderungen rückgängig machen, wenn etwas nicht funktioniert. Auf diese Weise kann Code einfacher aktualisiert und die Einführung von neuen Funktionen beschleunigt werden. Außerdem lassen sich Fehler und Bugs in einzelnen Services einfach isolieren und beheben.
Unabhängig voneinander einsetzbar – Da Microservices einzelne Einheiten sind, ermöglichen sie ein schnelles und einfaches unabhängiges Deployment einzelner Funktionen.
Flexible Technologie – Microservice-Architekturen geben Teams die Möglichkeit, ihre bevorzugten Tools auszuwählen.
Hohe Zuverlässigkeit – Du kannst Änderungen für einen bestimmten Service bereitstellen, ohne zu riskieren, dass die gesamte Anwendung zum Erliegen kommt.
Zufriedenere Teams – Atlassian-Teams, die mit Microservices arbeiten, sind viel zufriedener, weil sie selbstständiger arbeiten und Funktionen selbst entwickeln und bereitstellen können, ohne wochenlang auf die Genehmigung einer Pull-Anfrage warten zu müssen.
Nachteile von Microservices
Als wir von einer kleinen Anzahl monolithischer Codebasen auf noch mehr verteilte Systeme und Services umstellten, die unsere Produkte unterstützen, verkomplizierte sich die Arbeit unerwartet. Wir hatten am Anfang Schwierigkeiten, neue Funktionen mit derselben Geschwindigkeit und Souveränität hinzuzufügen, wie wir das bisher getan hatten. Microservices können die Komplexität erhöhen, was zu einer unkontrollierten Entwicklung oder zu einem schnellen und nicht regulierten Wachstum führt. Da kann es schwierig werden herauszufinden, welchen Bezug verschiedene Komponenten zueinander haben, wer für eine bestimmte Softwarekomponente zuständig ist oder wie verhindert werden kann, dass abhängige Komponenten beeinträchtigt werden.
Mit Vertigo haben wir eine gängige Funktion entwickelt, die unsere bestehenden sowie zukünftige Produkte unterstützt, die wir erwerben und erstellen. Wenn dein Unternehmen ein einziges Produkt herstellt, wirst du wahrscheinlich keine Microservices brauchen.
Zu den Nachteilen von Microservices zählen unter anderem folgende:
Unkontrollierte Entwicklung – Microservices erhöhen im Vergleich zu einer monolithischen Architektur die Komplexität, da es an mehreren Orten mehr Services gibt, die von mehreren Teams erstellt wurden. Wenn die unkontrollierte Entwicklung nicht ordnungsgemäß eingedämmt wird, führt dies zu einer langsameren Entwicklungsgeschwindigkeit und einer schlechten Betriebsleistung.
Exponentielle Infrastrukturkosten – Für jeden neuen Microservice können eigene Kosten für Testsuite, Deployment-Playbooks, Hosting-Infrastruktur, Überwachungstools und mehr anfallen.
Zusätzlicher organisatorischer Aufwand – Teams müssen eine weitere Ebene für Kommunikation und Zusammenarbeit eröffnen, um Updates und Schnittstellen zu koordinieren.
Debugging-Herausforderungen – Jeder Microservice verfügt über eigene Protokolle, was das Debugging zum Problem macht. Darüber hinaus kann ein einzelner Geschäftsprozess auf mehreren Computern ausgeführt werden, wodurch das Debugging noch komplizierter wird.
Mangelnde Standardisierung – Ohne eine gemeinsame Plattform kann es zu einer unkontrollierten Zunahme von Sprachen, Protokollierungsstandards und Überwachungsvorgängen kommen.
Keine klaren Zuständigkeiten – Mit der Anzahl der eingeführten Services steigt auch die Zahl der Teams, die diese Services ausführen. Im Laufe der Zeit wird es schwierig festzustellen, welche Services ein Team nutzen und wer bei Supportanfragen kontaktiert werden kann.
Tipps zur Migration von einer monolithischen Architektur zur Microservice-Architektur von Atlassian
Viele Projekte haben eine monolithische Architektur als Ausgangspunkt und entwickeln sich dann zu einer Microservice-Architektur. Wenn einer monolithischen Struktur neue Funktionen hinzugefügt werden, kann es umständlich werden, wenn mehrere Entwickler an einer einzigartigen Codebasis arbeiten. Codekonflikte werden immer häufiger und das Risiko steigt, dass Updates einer Funktion Bugs bei einer nicht verwandten Funktion verursachen. Wenn diese unerwünschten Muster auftreten, ist es möglicherweise an der Zeit, über eine Migration zu Microservices nachzudenken.
Nachstehend führen wir einige Best Practices auf, die sich bei unserer Migration als nützlich erwiesen haben:
Entwickle eine Migrationsstrategie
Wir haben viel Zeit investiert, um herauszufinden, in welcher Reihenfolge wir Kunden migrieren wollen. Wir wussten, dass sich für viele unserer Kunden nach der Migration die Profile und Nutzungsdynamiken ändern würden, also planten wir diesen Umstand im Voraus ein.
Tools
Für die Migration von Microservices sind geeignete Tools enorm wichtig. Bevor wir Kunden migrierten, haben wir in Tools für die Migration investiert oder welche erstellt, weil wir wussten, dass diese Aufgabe nicht von heute auf morgen bewältigt werden kann. Das wichtigste von uns entwickelte Tool war Microscope, unser eigener interner Servicekatalog zur Verfolgung aller Microservices. Jeder Entwickler bei Atlassian kann Microscope verwenden, um sämtliche Informationen zu allen Microservices im Unternehmen einzusehen.
Wir haben auch ein Tool namens ServiceQuest in Microscope integriert, das automatisch unter anderem Qualitäts-, Servicedesign-, Datenschutz-, Sicherheits- und Zuverlässigkeitsprüfungen durchführt, bevor Code in der Produktionsumgebung bereitgestellt wird.
Außerdem entwickelten wir ein Tool, das unsere Technologie-Stacks ergänzen sollte. Wir nutzen intern einen Service, der uns noch vor der Protokollierung, Überwachung und Zwischenspeicherung erlaubt, einen neuen Service auf einem bestimmten Stack einzurichten. Abschließend automatisierten wir so viele Prozesse wie möglich, den Migrationsprozess eingeschlossen. Wir erstellten unser eigenes Dashboard, um sämtliche Migrationen effektiv und in Echtzeit anzuzeigen.
Erwarte nicht zu viel
Eine Unternehmenstransformation erfordert einen erfahrenen Executive Sponsor, der für das Ergebnis verantwortlich und bereit ist, wo nötig, Kompromisse durchzusetzen, so Sri Viswanath, CTO von Atlassian. Diese Person sollte das Unternehmen unterstützen, in neue Tools, Systeme und Prozesse zu investieren, um Verbesserungen dauerhaft umzusetzen.
Bei einer großen Infrastrukturmigration, an der viele Personen beteiligt sind, möchte das Unternehmen wissen, wie es um den ROI steht, so Mike Tria, Head of Platform bei Atlassian. Deshalb ist es extrem wichtig, dass die Kommunikation zwischen dem Führungsteam, den Stakeholdern, den Kunden, Partnern und den restlichen F&E-Teams aufrechterhalten wird. Stelle sicher, dass sie über deine aktuelle Tätigkeit und die damit verbundenen erwarteten Vorteile Bescheid wissen. Sorge außerdem dafür, dass Teilerfolge gebührend gefeiert werden.
Stelle dich auf einen kulturellen Wandel ein
"Bei derart großen Projekten spielt die Arbeitskultur eine entscheidende Rolle" so Viswanath. "Wenn ein Problem vorliegt, solltest du jedes Mal sicherstellen, dass auch die höheren Organisationsebenen davon erfahren." Bei einer Migration geht es nicht nur um technische Aspekte, sondern auch um Veränderungen innerhalb der Belegschaft und des Unternehmens. Im Jahr 2015 wurde bei Atlassian Code für das komplett separate Operations-Team geschrieben, das ihn dann ausführte und bereitstellte. Ende 2017 führten wir eine DevOps-Kultur nach dem "you build it, you run it"-Prinzip ein, nach dem jeder Entwickler bei Atlassian seine eigenen Services ausführt.
"Ich habe mehr Zeit damit verbracht, sicherzustellen, dass unser SRE-Team mit diesem Projekt erfolgreich sein konnte, als mit allen anderen Aufgaben. Durch Vertigo hat sich der kulturelle Wandel als wichtigste langfristige Änderung für Atlassian erwiesen", so Tria.
Verspiele kein Vertrauen, indem du zu schnell vorgehst
Vertigo hätte wesentlich schneller abgewickelt werden können. Nach den ersten vier Monaten hatten wir 80 % der Migrationen abgeschlossen. Wir hätten die restlichen Benutzer migrieren können, jedoch ohne zu garantieren, dass sie von der Zuverlässigkeit und Leistung profitieren würden, die wir wollten. Deshalb haben wir uns an eines der Leitprinzipien von Atlassian gehalten: Versuche nicht, den Kunden hinters Licht zu führen.
Wir haben mit unseren Entwicklern ein System der gegenseitigen Kontrolle eingerichtet, um eine hohe Zuverlässigkeit zu gewährleisten, und haben die von uns gesetzten hohen Standards auch erfüllt. Denn wenn du gleich von Anfang an alles richtig machst, ersparst du dir auf lange Sicht viel Zeit und Probleme.
Als wir bei den letzten 500 Kunden angelangt waren, deren Migration am schwierigsten war, verwendeten wir Jira und die Trello-Integration, um jedem Kunden einen Atlassian-Entwickler zuzuweisen.
Fazit
Im Januar 2016 hatten wir insgesamt etwa 15 Microservices. Mittlerweile sind es über 1.300. Wir haben 100.000 Kunden in die Cloud verlagert, dabei eine neue Plattform erstellt, unsere Unternehmenskultur verändert und am Ende neue Tools erhalten. Wir haben zufriedenere, unabhängigere Teams und unsere DevOps-Kultur hat sich verbessert.
Microservices sind nicht unbedingt für jeden geeignet. Eine veraltete monolithische Architektur kann noch einwandfrei funktionieren, sodass es sich nicht lohnt, diese zu zerlegen. Aber wenn Unternehmen wachsen und die Anforderungen an ihre Anwendungen steigen, kann sich die Microservice-Architektur bezahlt machen.
Da der Trend in vielen Unternehmen zu Microservices mit verteilten Architekturen geht, hat Atlassian Compass entwickelt, um Unternehmen bei der Handhabung komplexer verteilter Architekturen während der Skalierung zu unterstützen. Die Lösung ist eine erweiterbare Developer-Experience-Plattform, die unzusammenhängende Informationen über die gesamten Entwicklungsergebnisse und die Teamzusammenarbeit an einem zentralen, durchsuchbaren Ort zusammenführt.
Diesen Artikel teilen
Nächstes Thema
Lesenswert
Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.