Aspekte von n-schichtigen Architekturen

Abgeschlossen

Wir haben uns angesehen, woraus eine n-schichtige Architektur besteht, und haben ein Beispiel für eine Architektur mit drei Schichten bereitgestellt. Nun sollen die Vorteile und die zu bewältigenden Herausforderungen dieses Architekturstils sowie die bewährten Methoden beschrieben werden, mit denen eine Optimierung der Leistung und Sicherheit erreicht werden kann.

Vorteile

Dieser Architekturstil hat aufgrund seiner Einfachheit viele Vorteile. Es handelt sich um ein häufig verwendetes und gut definiertes Architekturmuster – sowohl für lokale als auch für Cloudbereitstellungen –, das für viele verschiedene Anwendungen genutzt werden kann.

Es ist eine plattformunabhängige Architektur für Anwendungen, die unter Windows oder Linux bereitgestellt werden. Wie in der Beispielumgebung gezeigt, können auf allen Schichten PaaS- oder IaaS-Dienste genutzt werden.

Dank der Aufteilung der Anwendung in Schichten kann jede Schicht unabhängig skaliert und aktualisiert werden. Wenn die Anzahl der Anforderungen für unsere Website zunimmt, können wir weitere Webserver für die Last hinzufügen, ohne dass die anderen Schichten dadurch beeinträchtigt werden. Falls die Anforderungen an die Datenschicht zunehmen, können wir unsere Datenbank skalieren, damit sie über eine höhere Kapazität für die Verarbeitung der Anforderungen verfügt.

Die Netzwerktrennung ist ein natürlicher Nebeneffekt dieser Architektur. Weil die Anwendung in Schichten unterteilt ist, sollten wir jede Schicht isolieren und nur den erforderlichen Netzwerkzugriff zulassen. Die Präsentationsschicht kann über das Internet verfügbar gemacht werden, die Datenbank kann hinter mehreren Netzwerkschichten vollständig geschützt sein, und unsere Anwendung funktioniert trotzdem. Indem der Netzwerkzugriff zwischen Schichten geschützt wird, reduzieren wir die Angriffsfläche der Anwendung und erhöhen ihre Sicherheit.

Hürden und wichtige Aspekte

Wenn Sie Ihre Anwendung in mehrere Schichten unterteilen, sollten Sie vermeiden, dass auf den mittleren Schichten nur Datenbankvorgänge durchgeführt werden. Jede Schicht sollte einen bestimmten Beitrag leisten. Zusätzliche Schichten bedeuten mehr Komplexität, Verarbeitungszeit, Latenz und letztlich Verzögerungen für die Benutzer*innen.

Da die APIs für die einzelnen Domänen auf Anwendungsebene nicht in separate Dienste unterteilt sind, müssen sie zusammen skaliert werden. Falls für eine Anwendungsmethode mehr Verarbeitungsleistung erforderlich ist oder diese mehr Anforderungen als andere Methoden verarbeiten muss, muss die Logikschicht für die Verarbeitung der Last als Ganzes horizontal hochskaliert werden, und nicht nur ein einzelner Dienst.

Es kann auch vorkommen, dass Sie eine Anwendung als n-schichtige Architektur entwickeln, aber Bereitstellungen weiterhin „monolithisch“ durchführen. Sie sollten jede Schicht separat bereitstellen, indem Sie jede Schicht vollständig abtrennen. Eine vollständige Trennung umfasst die Entfernung von gemeinsamen Abhängigkeiten und eine verstärkte Nutzung von API-Aufrufen zwischen den Schichten. Wenn dies korrekt umgesetzt wird, können Sie damit sicherstellen, dass Ihre Anwendungsbereitstellungen flexibel bleiben.

Anwendungen in einer n-schichtigen Architektur werden oft auf VMs bereitgestellt. Dies ist ein guter erster Schritt, aber die Weiterentwicklung Ihrer Anwendung für die Nutzung von PaaS-Diensten ist mit vielen weiteren Vorteilen in den Bereichen Sicherheit, Skalierbarkeit und Administration verbunden. Diese Weiterentwicklung wird oft übersehen, und n-schichtige Architekturen verbleiben dann auf VMs.

Es handelt sich bei n-schichtigen Architekturen um einen klassischen Architekturstil, der in vielen Szenarien aber durch andere moderne Entwurfsmuster, z. B. eine Microservicearchitektur, ersetzt wurde. Häufig lohnt es sich, etwas Zeit für die Evaluierung anderer Architekturen zu investieren, um zu ermitteln, ob sie für Ihre Anwendung ggf. besser geeignet sind.

Bewährte Methoden für n-schichtige Architekturen

Es gibt mehrere Maßnahmen, mit denen Sie sicherstellen sollten, dass Ihre n-schichtige Architektur bestmöglich ausgeführt wird. Im folgenden Diagramm ist grafisch dargestellt, wie Sie an einer n-schichtigen Architektur Verbesserungen vornehmen können.

Visualization of N-tier architecture.

Optimieren der Leistung

Wir sehen uns nun Möglichkeiten zur Optimierung einer n-schichtigen Architektur in Bezug auf die Leistung und die Sicherheit an.

Automatische Skalierung

Wenn die Anwendung in Schichten unterteilt wurde, können wir mithilfe von Cloudfeatures, z. B. der automatischen Skalierung, eine Anpassung an die Systemlast erzielen. Wenn die Zahl der Benutzer oder Anforderungen zunimmt, können Sie die automatische Skalierung auf mehreren Schichten nutzen, um mehr Ressourcen für die Verarbeitung von Anforderungen hinzuzufügen. Wenn die Zahl der Anforderungen abnimmt, reduziert die automatische Skalierung die Computeressourcen und somit auch Ihre Kosten. Dank der automatischen Skalierung kann auf einfache Weise sichergestellt werden, dass Ihre Benutzer die bestmögliche Umgebung erhalten und Ihre Kosten niedrig bleiben. Azure Virtual Machine Scale Sets kann für VM-basierte Workloads verwendet werden, und viele PaaS-Dienste, z. B. Azure App Service, haben integrierte Funktionen für die automatische Skalierung.

Lastenausgleich

Beim horizontalen Hochskalieren Ihrer Anwendung per automatischer Skalierung wird die Nutzung des Lastenausgleichs zu einem erforderlichen Bestandteil Ihrer Architektur. Wenn Sie Ihrer Schicht bei Verwendung eines Lastenausgleichs weitere Computeressourcen hinzufügen, gehen diese in Ihre Lastenausgleichsverteilung ein, damit die zusätzliche Verarbeitungsleistung genutzt werden kann. Wenn aber ein System ausfällt, wird es aus der Last herausgenommen, um die Auswirkungen aufgrund von schlechter Leistung oder fehlerhaften Anforderungen für die Benutzer*innen zu verringern. So wird dafür gesorgt, dass Benutzeranforderungen die Systeme in fehlerfreiem Zustand erreichen. Der Lastenausgleich von Azure (Azure Load Balancer) ist ein integriertes Feature der Netzwerkfunktionen. Über Application Gateway wird eine HTTP-Lastenausgleichslösung mit einem größeren Funktionsumfang bereitgestellt.

Messaging

Die Verwendung eines Messagingdiensts zwischen Schichten hat positive Auswirkungen auf die Leistung. Dies gilt insbesondere für asynchrone Anforderungen. Der Dienst stellt eine Nachricht in eine Warteschlange. Dort verbleibt sie bis zur Verarbeitung, wodurch die Auswirkung auf nachgelagerte Lasten verschoben wird. Bei einem Systemausfall stellt ein Messagingdienst sicher, dass Ihre Nachricht weiterhin verarbeitet wird. Die Nachricht verbleibt in der Warteschlange und wird verarbeitet, wenn das System wieder online ist. In Azure können Sie je nach Ihren Anforderungen zwischen mehreren Messaginglösungen wählen. Azure Service Bus, Azure Storage-Warteschlangen und Azure Event Hubs sind mögliche Optionen für einen Messagingdienst.

Zwischenspeichern von Daten

Verwenden Sie einen Cache für Daten, auf die häufig zugegriffen wird und deren Änderungsrate niedrig ist, oder für Daten, die nicht lange aufbewahrt werden müssen, z.B. der Sitzungszustand. Cachingsysteme sind zwischen den Schichten angeordnet und führen zu verringerten Datenabrufdauern für diese Datentypen. Azure Cache for Redis ist ein PaaS-Dienst, der für dieses Szenario gut geeignet ist.

Optimieren der Sicherheit

Die Optimierung der Sicherheit einer Anwendung ist oft eine Aufgabe, die niemals „abgeschlossen“ ist. Obwohl die Anwendung in Schichten unterteilt ist, müssen trotzdem geplante Sicherheitsmaßnahmen in die Architektur eingebaut werden. Je mehr Schichten hinzugefügt werden, desto höher ist der Schutzaufwand und desto komplexer wird das System. Es gibt mehrere Maßnahmen, mit denen Sie sicherstellen können, dass in Ihrer Architektur eine sichere Umgebung für die Ausführung Ihrer Anwendung bereitgestellt wird.

Netzwerkisolation

Achten Sie darauf, dass sich beim Ausführen einer n-schichtigen Architektur auf VMs jede Schicht in einem eigenen Subnetz befindet. Dieses Subnetz fungiert als Sicherheitsgrenze, sodass Sie die Konnektivität anhand von Listen für die Steuerung des Netzwerkzugriffs isolieren können. Gleichzeitig wird die Verwaltung vereinfacht, indem sichergestellt wird, dass für neue Systeme im Subnetz dieselben Regeln gelten. In Azure geschieht dies nativ mit Netzwerksicherheitsgruppen (NSGs). Ähnliche Überlegungen sollten für PaaS-Dienste angestellt werden, aber Funktionen für die Netzwerkintegration unterscheiden sich von Dienst zu Dienst und sollten einzeln evaluiert werden. Eine bewährte Methode ist die Sicherstellung, dass jede Schicht nur mit der nächsten Schicht kommunizieren kann, die direkt darunter angeordnet ist. Die Präsentationsschicht sollte nur mit der Logikschicht kommunizieren können, und die Logikschicht nur mit der Datenschicht. Mit dieser Minimierung der Konnektivität wird für die Netzwerksicherheit ein mehrstufiger Ansatz verfolgt, und der Gesamtsicherheitsstatus einer Architektur wird verbessert.

Web Application Firewall

Nachdem die Sicherheitsisolation zwischen Subnetzen eingerichtet wurde, sollten Sie sich vergewissern, dass Ihr öffentlich zugängliches Front-End geschützt und nur der Zugriff auf das Benötigte zulässig ist. Nur Ihre Präsentationsschicht sollte für eingehenden Internetdatenverkehr verfügbar gemacht werden. WAF-Technologie (Web Application Firewall), die Ihrer Präsentationsschicht vorgeschaltet ist, erhöht die Sicherheit dieser Schicht. Mit einer Web Application Firewall wird der Datenverkehr auf schädliche Aktivitäten untersucht und sichergestellt, dass die Kommunikation verschlüsselt ist. Außerdem erhalten Sie eine Benachrichtigung, falls etwas Ungewöhnliches passiert. In Azure ist Application Gateway ein HTTP-Lastenausgleich mit einer integrierten WAF, die Sie aktivieren können.

Überprüfen Sie Ihr Wissen

1.

Welche der folgenden Vorgehensweisen eignet sich für die Verbesserung der Leistung einer Anwendung in einer n-schichtigen Architektur, während gleichzeitig die Kosten optimiert werden?

2.

Mit welcher der folgenden Aktionen kann die Sicherheit einer Anwendung erhöht werden?