Monolithische Architektur
Was ist eine monolithische Architektur?
Eine monolithische Architektur ist das traditionelle, einheitliche Modell für den Entwurf eines Softwareprogramms. Monolithisch bedeutet in diesem Zusammenhang aus einem Guss. Laut dem Cambridge-Wörterbuch bedeutet das Adjektiv monolithisch auch zu groß und nicht veränderbar. Der Duden gibt die Bedeutungen aus einem Stück bestehend, zusammenhängend und fugenlos an.
Monolithische Architektur für Software erklärt
Monolithische Software ist so konzipiert, dass sie in sich geschlossen ist, das heißt die Komponenten oder Funktionen des Programms sind eng miteinander gekoppelt und nicht lose, wie bei modularen Softwareprogrammen. In einer monolithischen Architektur müssen alle Komponenten und ihre zugehörigen Komponenten vorhanden sein, damit der Code ausgeführt oder kompiliert werden kann und die Software läuft.
Monolithische Anwendungen sind einstufig, das heißt mehrere Komponenten werden zu einer großen Anwendung kombiniert. Folglich haben sie in der Regel große Codebasen, deren Verwaltung im Laufe der Zeit mühsam sein kann.
Wenn eine Programmkomponente aktualisiert werden muss, müssen unter Umständen auch andere Elemente neu geschrieben werden, und die gesamte Anwendung muss neu kompiliert und getestet werden. Dieser Prozess kann sehr zeitaufwändig sein und die Flexibilität und Geschwindigkeit von Softwareentwicklungsteams einschränken. Trotz dieser Probleme wird dieser Ansatz immer noch verwendet, da er einige Vorteile bietet. Außerdem wurden viele frühe Anwendungen als monolithische Software entwickelt, so dass dieser Ansatz nicht völlig außer Acht gelassen werden kann, wenn diese Anwendungen noch immer in Gebrauch sind und aktualisiert werden müssen.
Monolithischen Architektur anhand eines Beispiels erklärt
Um die monolithische Architektur zu verstehen, nehmen wir ein Beispiel einer Bankanwendung. Die Webseite der Bankanwendung autorisiert zunächst die Kunden, meldet sie bei ihrem Konto an und ermöglicht es ihnen, Online-Überweisungen auf andere Konten vorzunehmen. An diesem gesamten Prozess sind mehrere Komponenten beteiligt, darunter die kundenorientierte Benutzeroberfläche sowie Dienste für die Benutzerauthentifizierung, das Herunterladen von Kontoauszügen, Geldüberweisungen und andere Finanzservices.
Wenn die Anwendung eine monolithische Architektur verwendet, wird sie als eine einzige Anwendung erstellt und bereitgestellt, unabhängig davon, wie ein Kunde sie nutzt. Unabhängig davon, ob die Benutzer von ihrem Desktop oder von einem mobilen Gerät aus auf die Anwendung zugreifen, bleibt die Anwendung eng gekoppelt, und alle verschiedenen Komponenten und Module sind direkt miteinander verbunden. Sie kann auch ein relationales Datenbankmanagementsystem (DBMS) als einzige Datenquelle nutzen. Schließlich sind bei Änderungen an einer Komponente auch Codeänderungen für alle anderen betroffenen Komponenten erforderlich.
Schlüsselkomponenten monolithischer Anwendungen
Monolithische Anwendungen bestehen in der Regel aus mehreren Komponenten, die miteinander verbunden sind und eine große Anwendung bilden. Diese Komponenten können die folgenden Funktionen enthalten:
- Autorisierung. Um einen Benutzer zu autorisieren und ihm die Nutzung der Anwendung zu ermöglichen.
- Darstellung. Zur Bearbeitung von HTTP-Anfragen und zur Beantwortung mit Hypertext Markup Language, Extensible Markup Language oder JavaScript Object Notation (JSON).
- Geschäftslogik. Die zugrunde liegende Geschäftslogik, die die Funktionalität und die Merkmale der Anwendung steuert.
- Datenbankebene. Umfasst die Datenzugriffsobjekte, die auf die Datenbank der Anwendung zugreifen.
- Anwendungsintegration. Kontrolliert und verwaltet die Integration der Anwendung mit anderen Diensten oder Datenquellen.
Einige Anwendungen können auch ein Benachrichtigungsmodul zur Steuerung und zum Versand automatischer E-Mail-Nachrichten an die Benutzer enthalten.
Vorteile der monolithischen Architektur
Monolithische Architekturen haben einige Vorteile, weshalb viele Anwendungen immer noch nach diesem Entwicklungsparadigma erstellt werden. Zum einen können monolithische Programme einen besseren Durchsatz haben als modulare Anwendungen. Sie sind auch einfacher zu testen und zu debuggen, da bei weniger Elementen weniger Testvariablen und Szenarien ins Spiel kommen.
Zu Beginn des Lebenszyklus der Softwareentwicklung ist es in der Regel einfacher, sich für eine monolithische Architektur zu entscheiden, da die Entwicklung in der Anfangsphase einfacher sein kann. Eine einzige Codebasis vereinfacht auch die Protokollierung, das Konfigurationsmanagement, die Überwachung der Anwendungsleistung und andere Entwicklungsbelange. Auch die Bereitstellung kann einfacher sein, wenn die paketierte Anwendung auf einen Server kopiert wird. Schließlich können mehrere Kopien der Anwendung hinter einem Load Balancer platziert werden, um sie horizontal zu skalieren.
Dennoch ist der monolithische Ansatz in der Regel besser für einfache, leichtgewichtige Anwendungen geeignet. Für komplexere Anwendungen mit häufigen erwarteten Codeänderungen oder sich ändernden Skalierungsanforderungen ist dieser Ansatz nicht geeignet.
Nachteile der monolithischen Architektur
Monolithische Architekturen haben im Allgemeinen Nachteile, die die Entwicklung und den Einsatz von Anwendungen verzögern können. Diese Nachteile werden besonders deutlich, wenn die Komplexität des Produkts zunimmt oder wenn das Entwicklungsteam größer wird.
Die Codebasis monolithischer Anwendungen kann schwer zu verstehen sein, da sie sehr umfangreich sein kann, was es neuen Entwicklern erschweren kann, den Code zu ändern, um veränderte geschäftliche oder technische Anforderungen zu erfüllen. Wenn sich die Anforderungen weiterentwickeln oder komplexer werden, wird es schwierig, Änderungen korrekt zu implementieren, ohne die Qualität des Codes zu beeinträchtigen und den Gesamtbetrieb der Anwendung zu beeinträchtigen.
Nach jeder Aktualisierung einer monolithischen Anwendung müssen die Entwickler die gesamte Codebasis kompilieren und die gesamte Anwendung neu bereitstellen, nicht nur den aktualisierten Teil. Dies erschwert kontinuierliche oder regelmäßige Bereitstellungen, was sich wiederum auf die Flexibilität der Anwendung und des Teams auswirkt.
Auch die Größe der Anwendung kann die Startzeit verlängern und zu Verzögerungen führen. In einigen Fällen können verschiedene Teile der Anwendung widersprüchliche Ressourcenanforderungen haben. Dadurch wird es schwieriger, die für die Skalierung der Anwendung erforderlichen Ressourcen zu finden.
Neben der begrenzten Skalierbarkeit ist die Zuverlässigkeit ein weiteres Problem bei monolithischer Software. Ein Fehler in einer einzigen Komponente kann möglicherweise die gesamte Anwendung zum Absturz bringen. Nehmen wir das Beispiel der Bankanwendung: Angenommen, es gibt ein Speicherleck im Benutzerautorisierungsmodul. Dieser Fehler kann die gesamte Anwendung zum Absturz bringen und sie für alle Benutzer unzugänglich machen.
Schließlich sind monolithische Anwendungen aufgrund ihrer Größe und Komplexität nicht besonders anpassungsfähig an neue Technologien. Ein neues Entwicklungs-Framework oder eine neue Sprache kann sich auf die gesamte Anwendung auswirken, so dass die Anpassung zeit- und kostenaufwändig sein kann. Kleine Organisationen oder Unternehmen mit knappen Budgets verfügen möglicherweise nicht über die Mittel oder das Personal, um die Anwendung zu aktualisieren, so dass sie den Status quo beibehalten und möglicherweise nicht in der Lage sind, die Vorteile einer neuen Sprache oder eines neuen Frameworks zu nutzen.
Viele Unternehmen wenden sich heute von monolithischen Architekturen ab und setzen auf eine Microservices-Architektur (MSA), da diese zahlreiche Vorteile bietet.
Vorteile der Microservices-Architektur
MSA unterstützt modulare Anwendungen, bei denen ein einzelnes Modul in einem System, zum Beispiel ein Microservice, unabhängig geändert werden kann, ohne dass sich dies auf die anderen Teile des Programms auswirkt und ohne unvorhergesehene Änderungen in anderen Elementen zu verursachen.
Modulare Programme lassen sich im Vergleich zu monolithischen Programmen auch besser an iterative Entwicklungsprozesse und agile Praktiken anpassen. Sie sind auch besser skalierbar und können aufgrund der losen Kopplung zwischen den verschiedenen Komponenten einzeln getestet werden. Module kommunizieren auch miteinander, haben ihre eigenen Datenbanken und erhöhen die Startgeschwindigkeit der Anwendung.